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 workLes modèles de raisonnement émettent deux sortes de tokens de sortie : la chaîne interne et la réponse que vous voyez. La facturation compte les deux. max_tokens limite les deux. Une valeur généreuse pour un modèle sans raisonnement peut être entièrement consommée avant le premier caractère visible.
L'échec est silencieux par conception. L'API a fait ce qu'on lui demandait : générer jusqu'à la limite, puis s'arrêter. finish_reason: "length" est le seul indice, et il passe facilement inaperçu quand votre code lit choices[0].message.content et trouve une chaîne vide anodine.
Nous avons rencontré ce cas sur un outil interne de notation de documents. max_tokens était réglé à 2500 : suffisant pour le modèle précédent, bien trop peu dès que le modèle s'est mis à raisonner d'abord. Pendant un temps, le symptôme ressemblait à un proxy cassé, car les requêtes réussissaient, la latence était normale et le coût bien réel. C'est la facture qui l'a trahi : des débits sans aucun texte correspondant.
Regardez finish_reason et le décompte des tokens, pas seulement le contenu :
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" avec un content vide et un nombre de tokens de sortie non nul, c'est la signature. Relancez avec max_tokens à 4000 et le même prompt obtiendra une réponse.
Dernière vérification le 2026-10-01. Rédigé à partir de problèmes diagnostiqués sur une passerelle compatible OpenAI en production, pas compilé à partir d'autres sites.