content is "" but the request returned 200finish_reason: "length" on a short promptUsage shows output tokens spent with nothing to show for themThe same prompt works on a non-reasoning modelRaising max_tokens suddenly makes it workModele rozumujące generują dwa rodzaje tokenów wyjściowych: wewnętrzny łańcuch i odpowiedź, którą widzisz. Rozliczenie liczy oba. max_tokens ogranicza oba. Wartość, która była hojna dla modelu bez rozumowania, może zostać w całości zużyta przed pierwszym widocznym znakiem.
Ten błąd jest cichy z założenia. API zrobiło dokładnie to, co mu kazano: generowało do limitu, a potem przestało. finish_reason: "length" to jedyna wskazówka, łatwa do przeoczenia, gdy twój kod czyta choices[0].message.content i znajduje niewinny pusty ciąg.
Trafiliśmy na to w wewnętrznym narzędziu do oceniania dokumentów. max_tokens było ustawione na 2500 – w porządku dla poprzedniego modelu, ale zdecydowanie za mało, gdy model zaczął najpierw rozumować. Przez jakiś czas wyglądało to na zepsute proxy, bo żądania kończyły się sukcesem, opóźnienia były normalne, a koszty prawdziwe. Zdradził to dopiero rachunek: opłaty bez żadnego tekstu, który by im odpowiadał.
Patrz na finish_reason i liczby tokenów, nie tylko na treść:
curl -s 'YOUR_BASE_URL/chat/completions' \
-H 'Authorization: Bearer YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"model":"YOUR_MODEL","max_tokens":64,
"messages":[{"role":"user","content":"What is 17 * 23? Answer with the number only."}]}' \
| python3 -m json.tool
"finish_reason": "length" razem z pustym content i niezerową liczbą tokenów wyjściowych to charakterystyczny podpis. Uruchom to samo z max_tokens ustawionym na 4000, a ten sam prompt dostanie odpowiedź.
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.