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 workI modelli di ragionamento emettono due tipi di token di output: la catena interna e la risposta che vedi. La fatturazione li conta entrambi. max_tokens li limita entrambi. Un valore generoso per un modello senza ragionamento può essere consumato del tutto prima del primo carattere visibile.
Il fallimento è silenzioso per progettazione. L'API ha fatto ciò che le era stato chiesto: ha generato fino al limite e poi si è fermata. finish_reason: "length" è l'unico indizio, ed è facile non notarlo quando il tuo codice legge choices[0].message.content e trova un'innocua stringa vuota.
Ci siamo imbattuti in questo in uno strumento interno di valutazione dei documenti. max_tokens era impostato a 2500: andava bene per il modello precedente, ma era nettamente insufficiente quando il modello ha iniziato a ragionare prima di rispondere. Per un po' il sintomo è sembrato un proxy rotto, perché le richieste riuscivano, la latenza era normale e il costo era reale. A tradirlo è stata la fattura: addebiti senza alcun testo corrispondente.
Guarda finish_reason e il conteggio dei token, non solo il contenuto:
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" insieme a un content vuoto e a un conteggio di token di output diverso da zero è la firma. Riesegui con max_tokens a 4000 e lo stesso prompt otterrà risposta.
Ultima verifica: 2026-10-01. Scritto a partire da problemi diagnosticati su un gateway compatibile con OpenAI in produzione, non raccolto da altri siti.