Por que um chat longo de IA custa mais: a API reenvia o histórico
Cada nova mensagem em um chat de IA envia todo o histórico de novo, então a entrada cresce a cada turno. Veja a aritmética e 3 formas de manter o custo baixo.

Nesta página
As primeiras mensagens de um chat são baratas. A mensagem cinquenta custa visivelmente mais que a décima, mesmo que você tenha digitado a mesma quantidade. Nada está quebrado: é assim que as APIs de chat funcionam.
A resposta curta#
Um modelo não se lembra das suas requisições anteriores. A documentação da OpenAI diz diretamente: "cada requisição de geração de texto é independente e sem estado", e para uma conversa de vários turnos você inclui as mensagens anteriores e a resposta anterior do modelo na próxima requisição. A Messages API da Anthropic descreve o mesmo padrão: conversas de vários turnos sem estado, em que os turnos anteriores são passados no parâmetro messages.
Então a janela de chat que você vê em um app é uma ilusão construída pelo app. Por trás dela, cada nova mensagem é uma requisição nova que carrega toda a conversa até ali. Você paga por tokens de entrada em cada requisição, e o histórico faz parte dessa entrada. Se você é novo nos termos, leia primeiro O que é um token e Tokens de entrada vs saída.
A OpenAI declara o lado da cobrança explicitamente para suas cadeias de resposta: todos os tokens de entrada anteriores na cadeia são cobrados como tokens de entrada. O mesmo princípio vale para qualquer API em que você envia o histórico por conta própria: o que você envia é o que é contado.
Um exemplo prático com números inventados#
Os números abaixo são um exemplo didático, não uma medição. Suponha que cada uma das suas mensagens tenha cerca de 200 tokens e cada resposta cerca de 300 tokens. Uma troca concluída adiciona 500 tokens ao histórico.
Role a tabela para a direita →
| Turno | Histórico anterior reenviado | Nova mensagem | Entrada desta requisição | Saída |
|---|---|---|---|---|
| 1 | 0 | 200 | 200 | 300 |
| 5 | 500 × 4 = 2.000 | 200 | 2.200 | 300 |
| 10 | 500 × 9 = 4.500 | 200 | 4.700 | 300 |
| 20 | 500 × 19 = 9.500 | 200 | 9.700 | 300 |
A resposta continua do mesmo tamanho, mas a entrada do turno 20 é quase cinquenta vezes a entrada do turno 1. A saída não cresce; a entrada cresce.
Agora o total de um chat de 20 turnos. O histórico é reenviado 0, 1, 2 ... 19 vezes conforme as trocas, o que é uma soma simples:
- Trocas antigas reenviadas: 500 × 190 = 95.000 tokens (190 é 0 + 1 + 2 + ... + 19).
- Novas mensagens: 200 × 20 = 4.000 tokens.
- Total de entrada do chat: 95.000 + 4.000 = 99.000 tokens.
- Total de saída: 300 × 20 = 6.000 tokens.
Se o modelo lembrasse de tudo de graça, a entrada seria de apenas 200 × 20 = 4.000 tokens. O resto é o histórico sendo reenviado. Dobrar o número de turnos não dobra o custo do histórico, ele aproximadamente quadruplica, porque a soma cresce com o quadrado do número de turnos.
Quanto custa com preços atuais#
Aqui está o mesmo chat de 20 turnos (99.000 de entrada, 6.000 de saída) com os preços atuais. A tabela é dinâmica e atualiza quando as tarifas mudam; a última coluna é o preço de referência do OpenRouter para comparação.
| Modelo | Entrada $/1M | Saída $/1M | Custo | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0022 | $0.0045 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0021 | $0.0056 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0059 | $0.0369 |
99.000 tokens de entrada e 6.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.
Para uma verificação rápida em texto: no MiniMax-M2.7 esta conversa inteira custa $0.0059. Para um chat como este, em que a entrada domina, o preço de entrada importa mais: no MiniMax-M2.7 ele é mais barato que o preço de referência do OpenRouter. Por 1M de tokens, o MiniMax-M2.7 é $0.05 para entrada e $0.15 para saída.
Três formas de manter o custo baixo#
1. Comece um novo chat quando o assunto mudar#
O histórico mais barato é o vazio. Se você terminou de depurar uma função e agora quer uma receita, um novo chat envia 200 tokens em vez de 9.700. Em um app isso é um botão; no código é history = []. Faça isso sempre que o contexto anterior não ajudar mais a próxima pergunta.
2. Corte o histórico#
Mantenha apenas as últimas mensagens e descarte o resto. Suponha que você mantenha as últimas três trocas, então o histórico nunca passa de 500 × 3 = 1.500 tokens:
- Os turnos 1-3 crescem normalmente: 0 + 500 + 1.000 = 1.500 tokens de histórico.
- Os turnos 4-20 carregam cada um os 1.500 limitados: 1.500 × 17 = 25.500 tokens.
- Total do histórico: 1.500 + 25.500 = 27.000 tokens, mais 4.000 de novas mensagens = 31.000 tokens de entrada.
Isso é 31.000 em vez de 99.000 para os mesmos 20 turnos, e no MiniMax-M2.7 fica em $0.0025. O preço do corte é que o modelo esquece a parte inicial do chat, então mantenha o prompt de sistema e quaisquer fatos que ele não pode perder fora da parte cortada.
3. Substitua turnos antigos por um resumo#
Quando o histórico ficar longo, peça ao modelo uma vez para resumi-lo e depois continue com o resumo em vez do texto completo. No exemplo acima, nove trocas são 4.500 tokens; um resumo de cerca de 300 tokens leva os pontos principais adiante. Você paga por uma requisição extra para escrever o resumo, e cada requisição posterior fica mais leve. Isso preserva mais significado que o corte simples, ao custo de um pouco de detalhe.
A janela de contexto é um limite separado: ela limita quantos tokens uma requisição pode conter, incluindo a resposta. O histórico vai atingir esse teto eventualmente; Por que uma resposta de IA para no meio da frase? explica isso.
Veja isso no seu próprio código#
A resposta contém um objeto usage, então você pode acompanhar o crescimento por conta própria. Este é um exemplo: substitua a chave e pegue o id do modelo na documentação do CheapTokens, porque os ids diferem entre provedores.
from openai import OpenAI
client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')
system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7 # new message + last 3 exchanges (6 messages); None keeps everything
def ask(text):
history.append({'role': 'user', 'content': text})
r = client.chat.completions.create(
model='MODEL_ID_FROM_DOCS',
messages=[system] + (history[-KEEP:] if KEEP else history),
)
answer = r.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
print(r.usage.prompt_tokens, r.usage.completion_tokens)
return answerChame ask() várias vezes seguidas e imprima prompt_tokens: com KEEP = None ele sobe a cada turno, com KEEP = 7 ele se estabiliza. Para agentes que percorrem muitos passos, o mesmo efeito se aplica a cada passo; Como estimar o custo de um agente de IA mostra como planejar o orçamento para isso.
Onde rodar chats longos#
Diálogos longos e loops de agentes são exatamente as cargas de trabalho em que o volume de entrada domina, então uma janela de contexto grande e espaço para respostas longas importam ambos:
- MiniMax-M2.7: contexto de 180K, até 8.192 tokens por resposta, entrada e saída mais baratas que o preço de referência do OpenRouter.
- DeepSeek-V4-Flash: contexto de 380K, até 32.768 tokens por resposta, saída mais barata que o preço de referência do OpenRouter.
O CheapTokens tem um saldo único para todos os modelos, um preço fixo por modelo sem horários de pico, e uma API compatível com OpenAI Chat Completions e Anthropic Messages, então o código acima funciona apenas mudando a base URL. Recarregue o saldo e envie sua primeira requisição seguindo Sua primeira requisição de API com o CheapTokens.



