Por que uma resposta de IA para no meio da frase? max_tokens, a janela de contexto e finish_reason explicados
Uma resposta de IA que para no meio da frase atingiu um limite. Leia finish_reason, diferencie max_tokens de uma janela de contexto cheia e verifique o limite de saída de cada modelo.

Nesta página
Uma resposta que para no meio de uma frase quase sempre foi cortada por um limite. O modelo não perdeu o fio da meada; a requisição ficou sem espaço. A resposta diz qual limite foi: leia finish_reason. length significa que um limite foi atingido. stop significa que o modelo terminou por conta própria.
Três coisas decidem o tamanho máximo de uma resposta. Quando você sabe qual delas te atingiu, a correção leva um minuto.
Três limites que cortam uma resposta#
max_tokensé um teto que você define na requisição. Quando a resposta o alcança, a geração para, mesmo no meio de uma palavra. A referência da API do DeepSeek o define como o número máximo de tokens gerados na conclusão.- O limite de saída do modelo é o teto para uma única resposta daquele modelo. Ele pertence ao modelo, então mantenha
max_tokensigual ou abaixo dele. Os números dos nossos modelos estão na tabela abaixo. - A janela de contexto é o espaço para toda a troca: sua entrada e a resposta juntas. A referência do DeepSeek diz que os tokens de entrada e gerados juntos são limitados pelo comprimento de contexto do modelo.
Se tokens ainda são uma ideia vaga, comece por O que é um token em IA?. Esta página assume que você sabe o que é um.
Leia finish_reason primeiro#
Toda escolha em uma resposta de chat carrega um finish_reason. Ao lado dele, usage diz quantos tokens entraram e saíram.
Veja como uma resposta cortada se parece ao lado de uma concluída. A requisição pediu "Em uma frase curta, o que é um token?", primeiro com max_tokens definido como 16, depois como 200.
Exemplo ilustrativo, não uma resposta registrada: suas contagens e campos extras serão diferentes.
{
"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 }
}Na primeira resposta completion_ é 16, exatamente o teto, e o texto termina em "usu". Na segunda, o modelo parou em 24 tokens, bem abaixo do teto de 200, porque havia terminado.
Para descobrir o que aconteceu, siga esta ordem:
- Olhe
finish_reason. Se forstop, a resposta está completa. O modelo escolheu encerrar, ou atingiu uma sequência de parada que você definiu. Se forlength, um limite cortou a resposta, e o próximo passo diz qual. Existem outros valores, comocontent_filteretool_calls; nenhum dos dois é problema de comprimento. - Compare
completion_com otokens max_tokensque você enviou. Se forem iguais ou quase, você atingiumax_tokens. - Se
completion_estiver bem abaixo detokens max_tokenseprompt_tokensfor grande, a janela de contexto provavelmente encheu. A referência do DeepSeek usalengthpara os dois casos, então o campo sozinho não consegue separá-los; a comparação do passo 2 é como você distingue. A documentação da Anthropic e da Z.ai nomeia o segundo caso separadamente, comomodel_. Olhe o campo nas suas próprias respostas para ver qual nome você recebe.context_ window_ exceeded
As três descrições vêm da documentação dos desenvolvedores, verificada em 20 de outubro de 2026: DeepSeek, Anthropic e Z.ai.
Role a tabela para a direita →
| O que você vê | finish_reason |
Causa | O que fazer |
|---|---|---|---|
Cortada, completion_ igual a max_tokens |
length |
max_tokens atingido |
Aumente max_tokens, ou peça a resposta em partes |
Cortada, completion_ bem abaixo de max_tokens, entrada longa |
length (ou model_ em algumas APIs) |
Janela de contexto cheia | Encurte a entrada ou o histórico, ou escolha um modelo com janela maior |
| Completa mas mais curta do que você queria | stop |
O modelo terminou, ou uma sequência de parada disparou | Peça mais detalhes; verifique o parâmetro stop |
| Sem texto, ou uma recusa | content_filter |
A resposta foi filtrada | Reformule a requisição |
| Sem texto, uma requisição de ferramenta em vez disso | tool_calls |
O modelo quer chamar uma ferramenta | Execute a ferramenta e envie o resultado de volta |
Correção 1: aumente max_tokens#
A causa mais comum também é a mais fácil de corrigir. Defina max_tokens você mesmo, para saber qual teto se aplica. Não conte com o padrão.
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)Isto mostra o formato da chamada. A chave entra como YOUR_API_KEY aqui; mantenha uma chave real fora de código que você compartilha.
Aumentar o número só ajuda até o limite do próprio modelo. Aqui estão os limites na CheapTokens, verificados em 20 de outubro de 2026 na lista de modelos da CheapTokens:
Role a tabela para a direita →
| Modelo | ID do modelo | Saída máxima por resposta | 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 |
Os desenvolvedores publicam seus próprios limites para suas próprias APIs. A Z.ai, por exemplo, lista até 128K de saída para a série GLM-5. Esses não são os limites do GLM-5.3-Flash na CheapTokens, que é de 8.192 tokens por resposta. Para qualquer coisa que você construir na CheapTokens, use a tabela acima.
Correção 2: quando a janela de contexto está cheia#
Em um chat, todo o histórico vai de novo a cada mensagem, então a entrada cresce a cada turno. A janela de contexto precisa comportar esse histórico mais a nova resposta. Se o histórico sozinho ocupa quase tudo, sobra quase nenhum espaço para uma resposta.
Essas janelas são grandes, e uma pergunta curta não as enche. Chats longos e documentos colados sim. O que ajuda:
- Comece um novo chat para uma nova tarefa em vez de continuar um antigo.
- Peça ao modelo para resumir a conversa até agora, e leve adiante apenas o resumo.
- Corte mensagens antigas e anexos que você não precisa mais.
- Se a entrada em si é enorme, escolha o modelo com a maior janela. Entre os nossos, é o GLM-5.3-Flash com 390K. Seu limite de saída é de 8.192 tokens, então peça um resultado longo em partes.
Correção 3: obtenha uma resposta longa em partes#
Quando a resposta que você quer é maior que o limite de saída do modelo, nenhuma configuração vai encaixá-la em uma única resposta. Peça em pedaços: quando finish_reason for length, envie a resposta parcial de volta e peça ao modelo para continuar.
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)Mesma ressalva: um exemplo do padrão, não uma execução registrada. Leia as emendas entre as partes. Um modelo às vezes repete uma frase ou reinicia uma lista na junção.
Cada rodada reenvia tudo até agora como entrada, e todo token de saída é cobrado. Uma resposta longa custa mais que uma curta. Aqui está uma resposta de oito mil tokens sobre 2.000 tokens de entrada, que cabe em todos os modelos da tabela:
| Modelo | Entrada $/1M | Saída $/1M | Custo | 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 |
2.000 tokens de entrada e 8.000 tokens de saída no total. Os preços por 1M de tokens são atuais e mudam junto com nossas tarifas; a coluna OpenRouter mostra preços de referência para a mesma carga de trabalho.
Quando finish_reason é stop#
stop significa que o modelo encerrou a resposta. Se ele encerrou antes do que você queria, isso não é problema de limite e um max_tokens maior não muda nada. Diga o que você quer: o comprimento, as seções, o nível de detalhe. Verifique também se a requisição define um parâmetro stop; uma sequência de parada que aparece na resposta a encerra na hora.
Escolhendo um modelo pelo comprimento da resposta#
Comece pela resposta que você precisa. Se ela cabe em 8.192 tokens, o MiniMax-M2.7 (MiniMaxAI/) dá conta na CheapTokens. Sua saída é mais barata que o preço de referência do OpenRouter, e é cobrada a $0.15 (por 1M de tokens de saída). O preço é o mesmo a qualquer hora, não há horários de pico, e a API é compatível com OpenAI e Anthropic.
Aqui está a lista de preços atual para todos os modelos:
| Modelo | Contexto | Entrada $/1M | Saída $/1M | OpenRouter entrada | OpenRouter saída |
|---|---|---|---|---|---|
| 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 |
Preços em USD por 1 milhão de tokens. Valores do OpenRouter exibidos para comparação e sujeitos a alterações.
Se você ainda não enviou uma requisição, Sua primeira requisição de API com a CheapTokens mostra o passo a passo. Para saber o que é um token e por que entrada e saída são contadas separadamente, veja O que é um token em IA?.
Endpoints, ids de modelo e limites de todos os modelos estão na documentação da CheapTokens.



