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 timeOdpowiedzi strumieniowe zobowiązują się do 200 OK, gdy tylko wyjdzie pierwszy bajt. Wszystko później to treść. Jeśli połączenie padnie na tokenie 900 z 1200, klient widział już linię statusu z sukcesem i nie zgłosi błędu, chyba że akurat sprawdza znacznik końca samego strumienia.
Dlatego ten błąd wydaje się losowy. Krótkie odpowiedzi mieszczą się w oknie, na jakie pozwala najsłabsze ogniwo; długie – nie. Miejsce urwania się przesuwa, bo zależy od czasu, a nie od treści.
Najczęstszą przyczyną są limity bezczynności w proxy, które szczególnie źle współgrają z modelami rozumującymi: w długiej fazie rozumowania nie jest emitowany żaden token, więc pośrednik mierzący ciszę zamiast łącznego czasu może uznać połączenie za martwe, choć model wciąż myśli.
Czytaj surowy strumień zamiast sparsowanego obiektu z SDK i spójrz na jego koniec:
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
Kompletny strumień kończy się fragmentem zawierającym "finish_reason":"stop", po którym następuje data: [DONE]. Jeśli ostatnia linia to zwykły fragment treści, strumień został ucięty.
[DONE] albo fragment z niepustym finish_reason. Bez żadnego z nich traktuj wynik jako nieudany, a nie krótki. Ta jedna zmiana sprawia, że problem staje się widoczny.finish_reason i [DONE] docierają dokładnie tak, jak wysłał je dostawca. Konfiguracja każdego klienta jest w szybkim starcie.Ostatnio sprawdzono 2026-10-01. Napisane na podstawie problemów zdiagnozowanych na działającej bramce zgodnej z OpenAI, a nie zebrane z innych stron.