# OpenAI stream cut off early: tell finish_reason length from a real disconnect
## The symptom
The streamed response stops mid-sentence. Two different causes, two different fixes. Do not retry a budget problem and do not give up on a transport problem.
## Confirm the cause
Read the last chunk you received:
1. **Final chunk carries `finish_reason: "length"`.** The model hit your max output token budget. Not a failure, not a disconnect. The response is complete as far as the API is concerned; it ran out of room.
2. **No terminal chunk arrived at all.** The connection dropped, the process was killed, or the client timed out mid-stream. There is no finish_reason because the stream never finished.
3. **Final chunk has `finish_reason: "stop"` but text looks cut off.** Rare. Usually the model emitted a stop sequence early or your client truncated rendering. Check raw chunks before blaming the API.
## The fix
- **finish_reason length:** raise the output budget (`max_completion_tokens`) or shorten the prompt, then re-request. For continuity, send the partial text back as context and ask the model to continue from exactly where it stopped.
- **Dropped connection:** retry the request. A stream that never completed produced no usable response, so retry is safe. Use generous client timeouts (model latency varies) and make your SSE parser tolerate chunk boundaries splitting mid-JSON.
- **Suspected client truncation:** log raw chunk counts and byte sizes. Most "the API cut me off" reports are the client giving up.
## Verify the fix
After raising the budget, confirm responses end with finish_reason stop. Log stream health: chunks received, terminal chunk seen or not, finish_reason value. Alert on streams ending with no terminal chunk; those are the real disconnects.