Streaming
Sia le interfacce OpenAI (/v1/chat/completions) che Anthropic (/v1/messages) supportano lo streaming tramite Server-Sent Events. La Responses API (/v1/responses) effettua lo streaming dei propri response.* eventi; vedi Responses API. Lo streaming è la modalità predefinita consigliata per tutto ciò che ha un prompt lungo, un output lungo o un limite di token elevato — evita i timeout delle richieste e ti permette di renderizzare i token man mano che arrivano.
Stream in stile OpenAI
curl -N https://api.uberllm.dev/v1/chat/completions \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek/deepseek-v4-flash",
"stream": true,
"messages": [{"role": "user", "content": "Count to five, one per line."}]
}'
La risposta è una sequenza di data: righe, ciascuna un frammento di completamento della chat, che termina con data: [DONE].
from openai import OpenAI
client = OpenAI(base_url="https://api.uberllm.dev/v1", api_key="ull_...")
with client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
stream=True,
messages=[{"role": "user", "content": "Write a short poem."}],
) as stream:
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
Contabilità dell'utilizzo
UberLLM inietta stream_options: {"include_usage": true} per gli upstream che lo supportano, quindi il chunk finale contiene un oggetto usage con i conteggi dei token di prompt e di completamento, e cost_usd: quanto viene fatturata questa richiesta, in dollari USA (quanto il provider ha addebitato per essa). Quando l'upstream non invia un chunk di utilizzo, UberLLM ne aggiunge uno prima di data: [DONE]. Su /v1/messages il costo si trova nel usage dell'evento message_delta.
La tua richiesta viene saldata al costo che il marketplace riporta per quella chiamata; quando l'utilizzo è mancante, il gateway ricorre a una stima del tokenizer e contrassegna la richiesta come stimata nel tuo activity log. Gli header di uno stream vengono inviati prima che il costo sia noto, quindi uno stream non ha un header X-UberLLM-Cost-USD: leggi usage.cost_usd.
Interruzioni
Se ti disconnetti a metà streaming, il gateway annulla la richiesta upstream e si accontenta dei token che sono stati effettivamente trasmessi in streaming. Non ti viene mai addebitata una risposta completa che non hai ricevuto, e nessun saldo riservato rimane bloccato.
Messaggi keep-alive
Il gateway invia un commento immediato : ping alla connessione e messaggi keep-alive periodici, in modo che i flussi a lunga esecuzione sopravvivano ai timeout di inattività del proxy.