Voltar ao blog

IA para iniciantesGuia

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.

Por CheapTokens TeamPublicado em Atualizado em 6 min de leitura

Capa: “Por que um chat longo custa mais a cada mensagem” — a API reenvia todo o histórico a cada turno
Nesta página
  1. A resposta curta
  2. Um exemplo prático com números inventados
  3. Quanto custa com preços atuais
  4. Três formas de manter o custo baixo
  5. 1. Comece um novo chat quando o assunto mudar
  6. 2. Corte o histórico
  7. 3. Substitua turnos antigos por um resumo
  8. Veja isso no seu próprio código
  9. Onde rodar chats longos

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.

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 Custo OpenRouter
GLM-5.3-Flash $0.0022 $0.0045
DeepSeek-V4-Flash $0.0021 $0.0056
MiniMax-M2.7 $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.

python
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 answer

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