Strona główna → Pomoc

Model zwraca pusty tekst, a i tak płacisz

W modelu rozumującym max_tokens ogranicza łącznie tokeny rozumowania i widoczną odpowiedź. Jeśli łańcuch myśli zużyje cały budżet, dostajesz poprawne 200 z pustym polem content – i płacisz za każdy token rozumowania.

Co widzisz

Dlaczego tak się dzieje

Modele 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ł.

Sprawdź, czy to ta przyczyna

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ź.

Jak to naprawić

  1. Planuj budżet na rozumowanie, nie tylko na odpowiedźModel rozumujący potrzebuje miejsca na jedno i drugie. Jeśli chcesz odpowiedzi na 200 tokenów, zapas 2000 tokenów to nie przesada — łańcuch bywa kilka razy dłuższy niż sama odpowiedź.
  2. Traktuj finish_reason: length jako błąd w swoim kodzieNie przepuszczaj po cichu pustego ciągu. Rozgałęź logikę: ponów z większym budżetem albo zgłoś głośny błąd. Ta jedna kontrola zamienia zagadkę w linijkę w logach.
  3. Sprawdź, czy model obsługuje osobny budżet na rozumowanieNiektóre modele mają do tego dedykowany parametr, dzięki któremu widoczna odpowiedź dostaje własny przydział. Jeśli istnieje, użyj go zamiast zgadywać jedną łączną liczbę.
  4. Porównaj z modelem bez rozumowania, zanim obwinisz siećJeśli identyczne żądanie zwraca tekst z modelu bez rozumowania, transport działa, a problemem jest budżet.
Każde żądanie w APICLAN pokazuje w logu użycia liczbę tokenów wejściowych, wyjściowych i rozumowania, więc pusta odpowiedź z prawdziwym rachunkiem jest widoczna, a nie tajemnicza. Zachowanie poszczególnych modeli opisujemy na stronach cennika.

Powiązane

Unexpected token '<' przy wywołaniu API zgodnego z OpenAI401 invalid API key – gdy klucz wygląda dobrze, a i tak nie działa

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.