¿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.

En esta página
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_tokenses 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_tokensigual 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.
{
"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 }
}{
"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_ 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:
- Mira
finish_reason. Si esstop, la respuesta está completa. El modelo eligió terminar, o alcanzó una secuencia de parada que estableciste. Si eslength, un límite cortó la respuesta, y el siguiente paso te dice cuál. Existen otros valores, comocontent_filterytool_calls; ninguno es un problema de longitud. - Compara
completion_con eltokens max_tokensque enviaste. Si son iguales o casi iguales, alcanzastemax_tokens. - Si
completion_está muy por debajo detokens max_tokensyprompt_tokenses grande, probablemente la ventana de contexto se llenó. La referencia de DeepSeek usalengthpara 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, comomodel_. Mira el campo en tus propias respuestas para ver qué nombre obtienes.context_ window_ exceeded
Las tres descripciones provienen de la documentación de los desarrolladores, verificadas el 20 de octubre de 2026: DeepSeek, Anthropic y Z.ai.
Desplaza la tabla hacia la derecha →
| Lo que ves | finish_reason |
Causa | Qué hacer |
|---|---|---|---|
Cortada, completion_ igual a max_tokens |
length |
Se alcanzó max_tokens |
Sube max_tokens, o pide la respuesta por partes |
Cortada, completion_ muy por debajo de max_tokens, entrada larga |
length (o model_ 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.
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:
Desplaza la tabla hacia la derecha →
| Modelo | ID del modelo | Salida máxima por respuesta | Contexto |
|---|---|---|---|
| DeepSeek-V4-Flash (0731) | deepseek- |
32,768 tokens | 380K |
| GLM-5.3-Flash | zai- |
8,192 tokens | 390K |
| MiniMax-M2.7 | MiniMaxAI/ |
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.
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 | Entrada $/1M | Salida $/1M | Costo | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.00036 | $0.00069 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00083 | $0.0013 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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/) 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.



