NovitàCollega qualsiasi agente a UberLLM: una chiave, tutti i modelli, a prezzo di listino o meno.
UberLLM

Responses API

POST https://api.uberllm.dev/v1/responses offre la Responses API di OpenAI su ogni modello di chat nel catalogo. Usala tramite l'OpenAI SDK (client.responses.create), Codex CLI, o qualsiasi app con una modalità "Responses". Le richieste passano attraverso lo stesso routing, i tentativi, i limiti delle API key e la fatturazione di /v1/chat/completions, e ogni chiamata è elencata in Dashboard → Attività con il suo costo.

curl https://api.uberllm.dev/v1/responses \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek/deepseek-v4.1-flash",
    "instructions": "Answer in one short sentence.",
    "input": "What is the capital of France?"
  }'
from openai import OpenAI

client = OpenAI(base_url="https://api.uberllm.dev/v1", api_key="ull_...")
r = client.responses.create(model="deepseek/deepseek-v4.1-flash", input="Say hi")
print(r.output_text)

Nessuno stato memorizzato

UberLLM non conserva le risposte per permetterti di continuare in seguito. Ogni risposta ha "store": false, e invii l'intera conversazione in input ad ogni chiamata: i messaggi utente precedenti, gli elementi di output del modello e i risultati dei tuoi strumenti. Codex CLI funziona già in questo modo.

Questi vengono rifiutati con un 400 (code: unsupported_parameter) che indica il campo:

  • previous_response_id e conversation
  • background: true
  • elementi di input di tipo item_reference
  • template di prompt memorizzati (prompt)

GET /v1/responses/{id} e gli altri percorsi di risposta memorizzata non esistono.

Richiesta

Campo Cosa succede
model Qualsiasi ID di modello di chat, alias o suffisso :floor / :nitro, come nelle chat completions.
input Una stringa, o un elenco di elementi (sotto).
instructions Inviato al modello come messaggio di sistema.
stream true per gli eventi server-sent.
max_output_tokens Il limite massimo di output.
temperature, top_p, seed, stop Passati al modello.
tools, tool_choice, parallel_tool_calls Vedi Strumenti sotto.
reasoning.effort Passato come sforzo di ragionamento del modello (modelli che pensano).
text.format text, json_object, o json_schema (output strutturato).
metadata I tuoi tag, mostrati nella riga Attività, come nelle chat completions.
provider, models Opzioni di routing di UberLLM, come nelle chat completions (Modelli e routing).
store, include, prompt_cache_key, service_tier, truncation Accettati e non utilizzati. Il ragionamento crittografato viene sempre restituito.

Elementi di input

Elemento Diventa
message con ruolo user, assistant, system o developer Un messaggio di chat. developer viene inviato come system. Parti del contenuto input_text, output_text, input_image (image_url: un URL https o data:) e input_file (file_data o file_url).
function_call La chiamata allo strumento dell'assistente, mantenuta in ordine.
function_call_output Il risultato dello strumento. Le immagini in un output vengono inviate nel turno utente successivo.
custom_tool_call, custom_tool_call_output Una chiamata a uno strumento personalizzato (a forma libera), e il suo risultato.
reasoning Il ragionamento precedente del modello, restituito al modello nel turno successivo.
web_search_call e altri record di strumenti ospitati Saltati.

Gli elementi id sono accettati e ignorati. file_id (file caricati) non è supportato in input_image / input_file: invia il file inline o tramite URL.

Strumenti

  • function: {"type": "function", "name", "description", "parameters", "strict"}. La chiamata del modello torna come un elemento function_call con call_id, name e arguments (una stringa JSON). Rispondi con un elemento function_call_output che porta lo stesso call_id.
  • custom (input a forma libera, come il apply_patch di Codex): al modello viene fornito lo strumento con un input di tipo stringa, e la grammatica in format.definition come sua descrizione. La chiamata torna come un elemento custom_tool_call con il input grezzo.
  • namespace (strumenti MCP di Codex): ogni strumento al suo interno viene offerto al modello sotto il suo namespace e il nome uniti (mcp__github__get_issue); la chiamata torna con name e namespace nuovamente separati.
  • Strumenti ospitati (web_search, file_search, code_interpreter, image_generation, computer_use, mcp) vengono eseguiti sui server di OpenAI. Vengono esclusi dalla richiesta e il modello risponde senza di essi.

tool_choice accetta "auto", "none", "required", o {"type": "function", "name": "…"}.

Risposta

{
  "id": "resp_…",
  "object": "response",
  "created_at": 1793333237,
  "status": "completed",
  "model": "deepseek/deepseek-v4.1-flash",
  "output": [
    {"type": "reasoning", "id": "rs_…", "summary": [],
     "content": [{"type": "reasoning_text", "text": "…"}], "encrypted_content": "ull1:…"},
    {"type": "message", "id": "msg_…", "status": "completed", "role": "assistant",
     "content": [{"type": "output_text", "text": "Paris.", "annotations": []}]},
    {"type": "function_call", "id": "fc_…", "status": "completed",
     "call_id": "call_…", "name": "get_weather", "arguments": "{\"city\":\"Paris\"}"}
  ],
  "usage": {
    "input_tokens": 43, "input_tokens_details": {"cached_tokens": 0},
    "output_tokens": 23, "output_tokens_details": {"reasoning_tokens": 0},
    "total_tokens": 66, "cost_usd": 0.0000184
  },
  "store": false
}
  • Un elemento reasoning appare quando il modello restituisce il suo ragionamento. Invialo indietro nel prossimo input così com'è: encrypted_content contiene il ragionamento così i modelli che ne hanno bisogno al turno successivo lo ottengono.
  • status è incomplete quando la risposta ha raggiunto max_output_tokens (incomplete_details.reason: "max_output_tokens") o un filtro di contenuto ("content_filter").
  • usage.cost_usd è ciò che è stato fatturato per la chiamata. Le risposte non-streaming lo contengono anche nell'header X-UberLLM-Cost-USD, e ogni risposta ha X-Request-Id, l'id della sua riga di Attività.
  • Le impostazioni che hai inviato (instructions, tools, temperature, max_output_tokens…) vengono restituite come fa OpenAI.

Streaming

Con "stream": true la risposta è eventi server-sent, ciascuno con type e un sequence_number a partire da 0:

  1. response.created, response.in_progress
  2. Per ogni elemento di output: response.output_item.added, poi i suoi delta, poi response.output_item.done con l'elemento completato:
    • testo: response.content_part.added, response.output_text.delta…, response.output_text.done, response.content_part.done
    • ragionamento: response.reasoning_text.delta…, response.reasoning_text.done
    • function call: response.function_call_arguments.delta…, response.function_call_arguments.done
    • custom tool call: response.custom_tool_call_input.done
  3. response.completed (o response.incomplete) con l'intera risposta e i suoi usage, inclusi cost_usd.

Mentre un modello lento si sta avviando, : ping righe di commento mantengono aperta la connessione. Ogni client SSE le salta.

Errori

Una richiesta rifiutata prima dell'avvio dello streaming ottiene uno stato HTTP e l'envelope di errore di OpenAI, lo stesso delle chat completions (401, 402 credito esaurito, 404 modello sconosciuto, 429; vedi Errori). Se qualcosa fallisce dopo l'avvio dello streaming, termina con response.failed, il cui response.error ha code e message. Uno streaming che si interrompe prima che il modello abbia terminato termina anch'esso con response.failed, mai con response.completed, così i client riprovano invece di conservare metà risposta.