usage is null on every chunk of a streamed responseToken counts appear for non-streamed calls and never for streamed onesYour own cost tracking reads zero while the provider bills normallyEl uso no se puede conocer hasta que termina la generación, así que no hay nada que poner en los primeros fragmentos. En lugar de enviar un marcador de posición, la API deja el campo en null y añade un fragmento final cuando ya existen los números.
Ese fragmento final tiene un array choices vacío. El código que deja de leer en cuanto ve finish_reason, o que se salta los fragmentos sin delta, descarta justo el fragmento que necesita.
No todas las implementaciones compatibles con OpenAI admiten la opción. Donde falta, puedes estimar localmente o leer las cifras fiables en el propio registro del proveedor.
Pide el usage y mira la última línea del stream:
curl -N 'YOUR_BASE_URL/chat/completions' \
-H 'Authorization: Bearer YOUR_KEY' -H 'Content-Type: application/json' \
-d '{"model":"MODEL","stream":true,"stream_options":{"include_usage":true},"messages":[{"role":"user","content":"hi"}]}' | tail -3
El fragmento anterior a [DONE] debería llevar un objeto usage relleno con un array choices vacío.
Revisado por última vez el 2026-10-01. Escrito a partir de problemas diagnosticados en una pasarela compatible con OpenAI en producción, no recopilado de otras webs.