The answer ends mid-word with no exceptionNo [DONE] marker in the raw streamWorks on short answers, fails on long oneschunked encoding ended prematurely / IncompleteReadRetrying produces a different cut-off point each timeLe risposte in streaming si impegnano su un 200 OK non appena parte il primo byte. Tutto ciò che segue è corpo. Se la connessione muore al token 900 su 1200, il client ha già visto una riga di stato riuscita e non solleverà errori, a meno che non stia controllando il marcatore di fine dello stream stesso.
Ecco perché il problema sembra casuale. Le risposte brevi finiscono entro la finestra concessa dall'anello più debole; quelle lunghe no. Il punto di interruzione si sposta perché dipende dal tempo, non dal contenuto.
La causa abituale sono i timeout di inattività dei proxy, che si combinano male con i modelli di ragionamento: durante una lunga fase di ragionamento non viene emesso alcun token, quindi un intermediario che misura il silenzio invece della durata totale può dichiarare morta la connessione mentre il modello sta ancora pensando.
Leggi lo stream grezzo invece dell'oggetto già analizzato da un SDK, e guarda la fine:
curl -N -s 'YOUR_BASE_URL/chat/completions' \
-H 'Authorization: Bearer YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"model":"YOUR_MODEL","stream":true,
"messages":[{"role":"user","content":"Count slowly from 1 to 400."}]}' \
| tail -5
Uno stream completo termina con un frammento che contiene "finish_reason":"stop" seguito da data: [DONE]. Se l'ultima riga è un normale frammento di contenuto, lo stream è stato tagliato.
[DONE] o un frammento con un finish_reason non nullo. Senza nessuno dei due, considera il risultato fallito, non breve. È l'unica modifica che rende visibile il problema.finish_reason e [DONE] arrivano esattamente come li ha inviati il provider. La configurazione di ogni client è nella guida rapida.Ultima verifica: 2026-10-01. Scritto a partire da problemi diagnosticati su un gateway compatibile con OpenAI in produzione, non raccolto da altri siti.