Inicio → Ayuda

El modelo devuelve una cadena vacía pero igualmente te cobran

En un modelo de razonamiento, max_tokens limita a la vez los tokens de razonamiento y la salida visible. Si la cadena de pensamiento consume todo el presupuesto, recibes un 200 válido con el campo content vacío, y pagas cada token de razonamiento.

Lo que ves

Por qué ocurre

Los modelos de razonamiento emiten dos tipos de tokens de salida: la cadena interna y la respuesta que ves. La facturación cuenta ambos. max_tokens limita ambos. Un valor que era generoso para un modelo sin razonamiento puede consumirse por completo antes del primer carácter visible.

El fallo es silencioso por diseño. La API hizo lo que se le pidió: generó hasta el límite y paró. finish_reason: "length" es la única pista, y es fácil pasarla por alto cuando tu código lee choices[0].message.content y encuentra una inofensiva cadena vacía.

Nos topamos con esto en una herramienta interna de puntuación de documentos. max_tokens estaba en 2500: suficiente para el modelo anterior, muy lejos de bastar en cuanto el modelo empezó a razonar primero. Durante un tiempo el síntoma pareció un proxy roto, porque las peticiones tenían éxito, la latencia era normal y el coste era real. Lo delató la factura: cargos sin ningún texto que les correspondiera.

Comprueba si es esta la causa

Mira finish_reason y el recuento de tokens, no solo el contenido:

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" junto con un content vacío y un recuento de tokens de salida distinto de cero es la firma. Ejecútalo de nuevo con max_tokens en 4000 y el mismo prompt responderá.

Cómo solucionarlo

  1. Presupuesta el razonamiento, no solo la respuestaUn modelo de razonamiento necesita espacio para ambas cosas. Si quieres una respuesta de 200 tokens, dejar 2000 tokens de margen no es excesivo — la cadena suele ser varias veces más larga que la respuesta.
  2. Trata finish_reason: length como un error en tu códigoNo dejes pasar una cadena vacía en silencio. Ramifica: reintenta con un presupuesto mayor o falla de forma ruidosa. Esta única comprobación convierte un misterio en una línea de log.
  3. Comprueba si el modelo admite un presupuesto de razonamiento aparteAlgunos exponen un parámetro dedicado para que la respuesta visible tenga su propia asignación. Donde exista, úsalo en lugar de adivinar un único número combinado.
  4. Compara con un modelo sin razonamiento antes de culpar a la redSi la misma petición devuelve texto en un modelo sin razonamiento, el transporte está bien y el problema es el presupuesto.
Cada petición en APICLAN muestra en el registro de uso sus tokens de entrada, salida y razonamiento, así que una respuesta vacía con una factura real es visible en lugar de misteriosa. El comportamiento de cada modelo está documentado en las páginas de precios.

Relacionado

Unexpected token '<' al llamar a una API compatible con OpenAI401 invalid API key: cuando la clave parece correcta pero sigue fallando

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.