Volver al blog

IA para principiantesGuía

¿Por qué se detiene a mitad de frase una respuesta de IA? max_tokens, la ventana de contexto y finish_reason explicados

Una respuesta de IA que se detiene a mitad de frase alcanzó un límite. Lee finish_reason, distingue max_tokens de una ventana de contexto llena y revisa el límite de salida de cada modelo.

Por CheapTokens TeamPublicado el Actualizado el 7 min de lectura

Portada oscura con el logo de cheaptokens: las palabras max_tokens, finish_reason y length en cajas, y el titular «¿Respuesta cortada a mitad de frase?»
En esta página
  1. Tres límites que cortan una respuesta
  2. Lee finish_reason primero
  3. Solución 1: sube max_tokens
  4. Solución 2: cuando la ventana de contexto está llena
  5. Solución 3: obtén una respuesta larga por partes
  6. Cuando finish_reason es stop
  7. Elegir un modelo por longitud de respuesta

Una respuesta que se detiene a mitad de una frase casi siempre fue cortada por un límite. El modelo no perdió el hilo; la solicitud se quedó sin espacio. La respuesta indica qué límite fue: lee finish_reason. length significa que se alcanzó un límite. stop significa que el modelo terminó por sí solo.

Tres cosas deciden cuánto puede durar una respuesta. Una vez que sabes cuál te afectó, la solución toma un minuto.

Tres límites que cortan una respuesta#

  • max_tokens es un tope que estableces en la solicitud. Cuando la respuesta lo alcanza, la generación se detiene, incluso a mitad de palabra. La referencia de la API de DeepSeek lo define como el número máximo de tokens generados en la completación.
  • El límite de salida del modelo es el techo para una sola respuesta de ese modelo. Pertenece al modelo, así que mantén max_tokens igual o por debajo de él. Los números de nuestros modelos están en la tabla de abajo.
  • La ventana de contexto es el espacio para todo el intercambio: tu entrada y la respuesta juntas. La referencia de DeepSeek dice que los tokens de entrada y generados juntos están limitados por la longitud de contexto del modelo.

Si los tokens todavía son una idea difusa, empieza con ¿Qué es un token en IA?. Esta página asume que sabes qué es uno.

Lee finish_reason primero#

Cada elección en una respuesta de chat lleva un finish_reason. Junto a él, usage te dice cuántos tokens entraron y salieron.

Así se ve una respuesta cortada junto a una terminada. La solicitud pedía "En una frase corta, ¿qué es un token?", primero con max_tokens en 16, luego en 200.

Ejemplo ilustrativo, no una respuesta registrada: tus conteos y campos extra serán distintos.

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
      "finish_reason": "length"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}
json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}

En la primera respuesta completion_tokens es 16, exactamente el tope, y el texto termina en "usu". En la segunda el modelo se detuvo en 24 tokens, muy por debajo del tope de 200, porque había terminado.

Para averiguar qué pasó, sigue este orden:

  1. Mira finish_reason. Si es stop, la respuesta está completa. El modelo eligió terminar, o alcanzó una secuencia de parada que estableciste. Si es length, un límite cortó la respuesta, y el siguiente paso te dice cuál. Existen otros valores, como content_filter y tool_calls; ninguno es un problema de longitud.
  2. Compara completion_tokens con el max_tokens que enviaste. Si son iguales o casi iguales, alcanzaste max_tokens.
  3. Si completion_tokens está muy por debajo de max_tokens y prompt_tokens es grande, probablemente la ventana de contexto se llenó. La referencia de DeepSeek usa length para ambos casos, así que el campo por sí solo no puede separarlos; la comparación del paso 2 es cómo los distingues. La documentación de Anthropic y Z.ai nombra el segundo caso por separado, como model_context_window_exceeded. Mira el campo en tus propias respuestas para ver qué nombre obtienes.

Las tres descripciones provienen de la documentación de los desarrolladores, verificadas el 20 de octubre de 2026: DeepSeek, Anthropic y Z.ai.

Lo que ves finish_reason Causa Qué hacer
Cortada, completion_tokens igual a max_tokens length Se alcanzó max_tokens Sube max_tokens, o pide la respuesta por partes
Cortada, completion_tokens muy por debajo de max_tokens, entrada larga length (o model_context_window_exceeded en algunas APIs) Ventana de contexto llena Acorta la entrada o el historial, o elige un modelo con una ventana más grande
Completa pero más corta de lo que querías stop El modelo terminó, o se disparó una secuencia de parada Pide más detalle; revisa el parámetro stop
Sin texto, o un rechazo content_filter La respuesta fue filtrada Reformula la solicitud
Sin texto, una solicitud de herramienta en su lugar tool_calls El modelo quiere llamar a una herramienta Ejecuta la herramienta y devuelve el resultado

Solución 1: sube max_tokens#

La causa más común es también la más fácil de arreglar. Establece max_tokens tú mismo, para que sepas qué tope aplica. No cuentes con el valor por defecto.

python
from openai import OpenAI

client = OpenAI(base_url="https://api.cheaptokens.dev/v1", api_key="YOUR_API_KEY")

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
    max_tokens=16000,  # example value: stay at or below the model's output limit
)

choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)

Esto muestra la forma de la llamada. La clave va como YOUR_API_KEY aquí; mantén una clave real fuera del código que compartes.

Subir el número solo ayuda hasta el límite propio del modelo. Aquí están los límites en CheapTokens, verificados el 20 de octubre de 2026 contra la lista de modelos de CheapTokens:

Modelo ID del modelo Salida máxima por respuesta Contexto
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32,768 tokens 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8,192 tokens 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 8,192 tokens 200K

Los desarrolladores publican sus propios límites para sus propias APIs. Z.ai, por ejemplo, lista hasta 128K de salida para la serie GLM-5. Esos no son los límites de GLM-5.3-Flash en CheapTokens, que es de 8,192 tokens por respuesta. Para cualquier cosa que construyas en CheapTokens, usa la tabla de arriba.

Solución 2: cuando la ventana de contexto está llena#

En un chat, todo el historial se envía de nuevo con cada mensaje, así que la entrada crece en cada turno. La ventana de contexto tiene que contener ese historial más la nueva respuesta. Si el historial solo ya ocupa casi todo, queda casi sin espacio para una respuesta.

Estas ventanas son grandes, y una pregunta corta no las llenará. Los chats largos y los documentos pegados sí. Lo que ayuda:

  • Inicia un chat nuevo para una tarea nueva en lugar de continuar uno viejo.
  • Pide al modelo que resuma la conversación hasta ahora, y lleva solo el resumen hacia adelante.
  • Corta los mensajes y adjuntos viejos que ya no necesites.
  • Si la entrada en sí es enorme, elige el modelo con la ventana más grande. Entre los nuestros es GLM-5.3-Flash con 390K. Su límite de salida es de 8,192 tokens, así que pide un resultado largo por partes.

Solución 3: obtén una respuesta larga por partes#

Cuando la respuesta que quieres es más larga que el límite de salida del modelo, ninguna configuración la hará caber en una sola respuesta. Pídela en piezas: cuando finish_reason es length, envía la respuesta parcial de vuelta y pide al modelo que continúe.

python
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []

for _ in range(4):  # example limit: at most 4 rounds
    resp = client.chat.completions.create(
        model="zai-org/GLM-5.3-Flash",
        messages=messages,
        max_tokens=8000,  # example value: below this model's output limit
    )
    choice = resp.choices[0]
    parts.append(choice.message.content)
    if choice.finish_reason != "length":
        break
    messages.append({"role": "assistant", "content": choice.message.content})
    messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})

text = "".join(parts)

Misma advertencia: un ejemplo del patrón, no una ejecución registrada. Lee las costuras entre las partes. A veces un modelo repite una frase o reinicia una lista en la unión.

Cada ronda reenvía todo lo anterior como entrada, y cada token de salida se factura. Una respuesta larga cuesta más que una corta. Aquí hay una respuesta de ocho mil tokens sobre 2,000 tokens de entrada, que cabe en todos los modelos de la tabla:

Modelo Costo OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $0.0013 $0.0102

2000 tokens de entrada y 8000 tokens de salida en total. Los precios por 1M de tokens son actuales y cambian junto con nuestras tarifas; la columna de OpenRouter muestra precios de referencia para la misma carga de trabajo.

Cuando finish_reason es stop#

stop significa que el modelo terminó la respuesta. Si terminó antes de lo que querías, eso no es un problema de límite y un max_tokens más grande no cambia nada. Di lo que quieres: la longitud, las secciones, el nivel de detalle. También revisa si la solicitud establece un parámetro stop; una secuencia de parada que aparece en la respuesta la termina en el acto.

Elegir un modelo por longitud de respuesta#

Empieza por la respuesta que necesitas. Si cabe en 8,192 tokens, MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) la maneja en CheapTokens. Su salida es más barata que el precio de referencia de OpenRouter, y se factura a $0.15 (por 1M de tokens de salida). El precio es el mismo a cualquier hora, no hay horas pico, y la API es compatible con OpenAI y Anthropic.

Aquí está la lista de precios actual para cada modelo:

Modelo Contexto Entrada $/1M Salida $/1M OpenRouter entrada OpenRouter salida
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

Precios en USD por 1M de tokens. Las cifras de OpenRouter se muestran para comparación y pueden cambiar.

Si aún no has enviado una solicitud, Tu primera solicitud de API con CheapTokens te guía paso a paso. Para saber qué es un token y por qué la entrada y la salida se cuentan por separado, consulta ¿Qué es un token en IA?.

Los endpoints, ids de modelos y límites de cada modelo están en la documentación de CheapTokens.