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_ideconversationbackground: 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 elementofunction_callconcall_id,nameearguments(una stringa JSON). Rispondi con un elementofunction_call_outputche porta lo stessocall_id.custom(input a forma libera, come ilapply_patchdi Codex): al modello viene fornito lo strumento con un input di tipo stringa, e la grammatica informat.definitioncome sua descrizione. La chiamata torna come un elementocustom_tool_callcon ilinputgrezzo.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 connameenamespacenuovamente 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
reasoningappare quando il modello restituisce il suo ragionamento. Invialo indietro nel prossimoinputcosì com'è:encrypted_contentcontiene il ragionamento così i modelli che ne hanno bisogno al turno successivo lo ottengono. statusèincompletequando la risposta ha raggiuntomax_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'headerX-UberLLM-Cost-USD, e ogni risposta haX-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:
response.created,response.in_progress- Per ogni elemento di output:
response.output_item.added, poi i suoi delta, poiresponse.output_item.donecon 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
- testo:
response.completed(oresponse.incomplete) con l'intera risposta e i suoiusage, inclusicost_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.