Context Window, Tokens e a conta, medidos
Uma conversa de 40 turnos custa 22 vezes seu tamanho em input tokens. O cache corta 68%; um timestamp mal posicionado adiciona 20%.
Nesta página
Aqui está uma conversa de suporte de quarenta turnos, cobrada turno a turno. Não há nada incomum nela: um desenvolvedor perguntando sobre uma API, um assistant respondendo em um ou dois parágrafos. A troca inteira tem 5.090 tokens de texto — cerca de oito páginas.
| turno | prompt tokens | texto novo | output | custo deste turno | total acumulado |
|---|---|---|---|---|---|
| 1 | 213 | 18 | 183 | $0.002622 | $0.002622 |
| 5 | 892 | 14 | 123 | $0.003260 | $0.014354 |
| 10 | 1,656 | 19 | 114 | $0.004680 | $0.035530 |
| 20 | 2,868 | 18 | 103 | $0.006972 | $0.094426 |
| 30 | 3,941 | 20 | 99 | $0.009070 | $0.174170 |
| 40 | 4,947 | 17 | 142 | $0.011598 | $0.274386 |
Leia a segunda e a terceira colunas juntas. No turno 40, o usuário digitou dezessete tokens e foi cobrado por 4.947. A pergunta não era mais difícil que a primeira; era mais curta. O que mudou é que a requisição carregava a conversa inteira com ela, de novo, pela quadragésima vez.
Total de input tokens cobrados nessas quarenta chamadas: 112.617. A conversa tem 5.090 tokens. Você pagou por ela vinte e duas vezes.
Este capítulo é sobre por que isso acontece, como isso aparece na fatura de cada provider e sobre quais das cinco coisas cobradas você pode fazer algo.
Mostrar detalhes
O que este capítulo precisa da Parte II.
- Capítulo 7 construiu o tokenizer. Um token é a unidade aqui também — a mesma unidade, agora com preço.
- Capítulo 9 derivou self-attention e seu custo , na caixa de notação assintótica. Esse custo é o motivo de haver um limite, e ele é vinculado aqui em vez de reexplicado.
- Capítulo 13 mediu prefill contra decode e calculou quanto uma KV cache ocupa. Essas duas fases são o que as colunas de input e output acima estão realmente comprando.
Todo o resto é TypeScript, porque isto é contabilidade de uma chamada remota, não matemática sobre um modelo.
A window não é memória
Link para a seção: A window não é memóriaO equívoco mais caro deste negócio é achar que um modelo lembra uma conversa.
Ele não lembra, e o mecanismo do Capítulo 13 diz exatamente por quê. O estado de um transformer durante a geração é a KV cache: as chaves e valores calculados para cada token na sequência. Essa cache vive enquanto dura uma requisição. Quando a requisição termina, o processo que a mantinha fica livre para atender outra pessoa, e a cache desaparece. Não há armazenamento por usuário do outro lado, nem sessão.
Então a próxima requisição precisa chegar carregando tudo que o modelo deve saber, e o modelo reconstrói esse estado executando uma passagem forward por todo o prompt antes de emitir um único token novo. O Capítulo 15 chamou o prompt de “o estado inteiro”. Este é o motivo físico: o prompt é o estado completo porque nada mais sobrevive à chamada.
A context window é o comprimento máximo desse prompt mais sua resposta. É um teto para quanto estado você consegue reconstruir, não um contêiner que guarda algo entre requisições. Chamar isso de “memória do modelo” inverte a direção da causalidade — você não está preenchendo uma memória, está pagando para restabelecer uma.
É daí que vem o vinte e dois. O turno carrega todos os turnos anteriores, então o input total ao longo de uma conversa de turnos é a soma de uma série crescente, que é quadrática:
em que é o system prompt e o histórico no turno . Ajustar o input cumulativo medido a nos quarenta turnos dá , que prevê 113.645 tokens no turno 40 contra 112.617 medidos. O termo quadrático domina, e o termo linear é o que o usuário realmente digitou.
A consequência é a frase para levar deste capítulo: sua conta cresce com o quadrado da conversa, não com a última pergunta. As mesmas quarenta perguntas feitas sem histórico algum custam $0.066036. Manter o histórico custou $0.274386. O histórico multiplicou a conta por 4,2, e continuará multiplicando, porque o multiplicador é o comprimento da conversa.
Por que existe um limite
Link para a seção: Por que existe um limiteA window é finita por dois motivos que puxam na mesma direção. O primeiro é o do Capítulo 9: attention compara cada token com todos os outros tokens, então o trabalho dessa camada cresce com o quadrado do comprimento da sequência. O segundo é memória: a KV cache cresce linearmente com o comprimento da sequência, e o Capítulo 13 fez essa aritmética — em sequências longas, ela é maior que os pesos.
Os dois limites foram atacados, e nenhum foi removido. FlashAttention1 reorganiza a computação para ler e escrever muito menos em memória de alta largura de banda, o que torna sequências longas práticas sem mudar o custo assintótico. Position Interpolation2 e YaRN3 ampliam a window utilizável de um modelo treinado redimensionando os positional encodings do Capítulo 9, em vez de retreinar. Juntos, eles explicam por que as windows foram de 2K para 1M em cinco anos.
O que eles não fizeram foi tornar contextos longos gratuitos. Eles elevaram o teto e suavizaram a inclinação. A inclinação ainda está lá, e é ela que os níveis de preço mais adiante neste capítulo estão medindo.
Cinco baldes, não dois
Link para a seção: Cinco baldes, não doisQuase todo calculador de custo na internet modela uma chamada de API como input tokens vezes um preço de input mais output tokens vezes um preço de output. Isso era verdade em 2023. Agora está errado de um jeito que gera contas erradas por um fator de dois ou mais nas duas direções.
Existem cinco categorias de tokens cobradas:
| balde | o que é | preço típico, relativo ao input |
|---|---|---|
| input sem cache | prompt tokens que o modelo teve de processar do zero | 1× |
| cache read | prompt tokens servidos de um prefixo armazenado | 0,1× |
| cache write | prompt tokens armazenados na cache nesta chamada | 1,25× a 2× |
| output | tokens que o modelo gerou e enviou para você | 5× a 6× |
| reasoning | tokens que o modelo gerou e não enviou para você | taxa de output |
Três desses cinco não existiam como linhas separadas dois anos atrás, e as duas linhas de cache são as que as pessoas erram, porque uma cache write custa mais que input comum, não menos. Você paga um prêmio para armazenar algo para depois pagar com desconto ao ler de volta, e se essa troca compensa depende inteiramente de quantas vezes você lê.
O balde de reasoning é o do Capítulo 12, agora com preço, e carrega um detalhe que vale declarar com clareza: a documentação do Google diz que o preço “é baseado no total de thought tokens que o modelo precisa gerar, apesar de apenas o resumo sair pela API”.4 Você é cobrado por tokens que nunca são transmitidos a você. É o único balde cujo conteúdo você não consegue contar, inspecionar ou verificar.
A mesma chamada, três dialetos
Link para a seção: A mesma chamada, três dialetosAgora a parte que torna isso um problema de normalização, não de multiplicação. Cada provider relata esses baldes com nomes diferentes e — esta é a armadilha — dois deles usam a mesma palavra para duas quantidades diferentes.
Pegue uma chamada: 4.837 tokens lidos da cache, 110 novos, 142 output tokens visíveis, 300 reasoning tokens.
// OpenAI-compatible
{ "usage": { "prompt_tokens": 4947,
"prompt_tokens_details": { "cached_tokens": 4837 },
"completion_tokens": 442,
"completion_tokens_details": { "reasoning_tokens": 300 } } }
// Anthropic
{ "usage": { "input_tokens": 110,
"cache_read_input_tokens": 4837,
"cache_creation_input_tokens": 0,
"output_tokens": 442 } }
// Gemini
{ "usageMetadata": { "promptTokenCount": 4947,
"cachedContentTokenCount": 4837,
"candidatesTokenCount": 142,
"thoughtsTokenCount": 300 } }Veja prompt_tokens: 4947 e input_tokens: 110. Os dois campos são a contagem de input tokens do mesmo prompt. A da OpenAI inclui os tokens em cache; a da Anthropic exclui — a documentação dela declara a identidade explicitamente, total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens.5 input_tokens da Anthropic significa “os tokens depois do seu último ponto de interrupção da cache”.
E veja o output. OpenAI e Anthropic relatam 442, que já contém os 300 reasoning tokens. Gemini relata 142 e coloca os 300 em um campo próprio. O Capítulo 12 marcou isso como uma incompatibilidade entre duas formas de contar o mesmo trabalho; aqui está quanto isso custa.
Um normalizador tem trinta linhas, e não é opcional:
export interface Usage {
promptTokens?: number; // input, NOT cached
cachedInputTokens?: number; // read from cache
cacheWriteTokens?: number; // written to cache on this call
completionTokens?: number; // output
reasoningTokens?: number; // billed apart from output (Gemini only)
}
const num = (v: unknown) => (typeof v === "number" && isFinite(v) ? v : 0);
export const fromOpenAI = (raw: any): Usage => {
const u = raw.usage ?? {}, d = u.prompt_tokens_details ?? {};
const cached = num(d.cached_tokens), write = num(d.cache_write_tokens);
return {
promptTokens: Math.max(0, num(u.prompt_tokens) - cached - write),
cachedInputTokens: cached,
cacheWriteTokens: write,
completionTokens: num(u.completion_tokens), // reasoning already inside
reasoningTokens: 0,
};
};
export const fromAnthropic = (raw: any): Usage => {
const u = raw.usage ?? {};
return {
promptTokens: num(u.input_tokens), // already excludes cache
cachedInputTokens: num(u.cache_read_input_tokens),
cacheWriteTokens: num(u.cache_creation_input_tokens),
completionTokens: num(u.output_tokens),
reasoningTokens: 0,
};
};
export const fromGemini = (raw: any): Usage => {
const m = raw.usageMetadata ?? {}, cached = num(m.cachedContentTokenCount);
return {
promptTokens: Math.max(0, num(m.promptTokenCount) - cached),
cachedInputTokens: cached,
cacheWriteTokens: 0,
completionTokens: num(m.candidatesTokenCount), // EXCLUDES thinking
reasoningTokens: num(m.thoughtsTokenCount), // billed at output rate
};
};Passe os três payloads acima pelos três leitores e todos produzem o mesmo Usage, e portanto o mesmo número: $0.006491. Esse acordo é todo o propósito de escrever a camada.
Faça errado e aqui está o custo, na mesma chamada:
| erro | cobrado | erro |
|---|---|---|
tratar cached_tokens como adicional a prompt_tokens | $0.016165 | 2,49× — você cobra o prompt duas vezes |
| tratar cache reads como grátis em vez de 0,1× | $0.005524 | 0,85× — você engole 15% |
ler candidatesTokenCount e ignorar thoughtsTokenCount | $0.002891 | 55% da chamada desaparece |
O terceiro é o perigoso, porque falha em silêncio na direção da boa notícia. Seu dashboard mostra um modelo de reasoning custando menos da metade do que custa, e nada em lugar nenhum levanta um erro.
Calculando o custo
Link para a seção: Calculando o custoCom os baldes normalizados, a função de custo é curta. A única parte não óbvia é a busca de tier, que a próxima seção explica:
export interface Tier { maxPromptTokens: number | null; price: number }
export interface Pricing {
input: Tier[]; output: Tier[];
cachedInput?: Tier[]; cacheWrite?: Tier[]; reasoning?: Tier[];
}
const tierPrice = (tiers: Tier[] | undefined, contextSize: number, fallback?: Tier[]) => {
const table = tiers ?? fallback;
if (!table?.length) return 0;
const sorted = [...table].sort(
(a, b) => (a.maxPromptTokens ?? Infinity) - (b.maxPromptTokens ?? Infinity));
for (const t of sorted)
if (t.maxPromptTokens === null || contextSize <= t.maxPromptTokens) return t.price;
return sorted[sorted.length - 1].price;
};
export function computeCost(pricing: Pricing, usage: Usage): number {
const fresh = usage.promptTokens ?? 0;
const read = usage.cachedInputTokens ?? 0;
const write = usage.cacheWriteTokens ?? 0;
const out = usage.completionTokens ?? 0;
const think = usage.reasoningTokens ?? 0;
const contextSize = fresh + read + write; // the tier depends on the WHOLE prompt
return fresh * tierPrice(pricing.input, contextSize)
+ read * tierPrice(pricing.cachedInput, contextSize, pricing.input)
+ write * tierPrice(pricing.cacheWrite, contextSize, pricing.input)
+ out * tierPrice(pricing.output, contextSize)
+ think * tierPrice(pricing.reasoning, contextSize, pricing.output);
}Duas decisões de design ali merecem defesa. Os fallbacks — preços de cache caindo para input, reasoning para output — codificam o que uma tabela ausente significa: reasoning tokens no Gemini são cobrados à taxa de output, então um preço reasoning ausente não é zero, é o preço de output. E contextSize soma os três baldes de input em vez de apenas os novos, porque o tier é escolhido pelo comprimento do prompt, não por quanto dele foi cobrado pelo preço cheio.
Prompt caching, e quanto custa escrever
Link para a seção: Prompt caching, e quanto custa escreverUma prompt cache armazena o estado computado do modelo para um prefixo do seu prompt, para que uma requisição posterior com o mesmo prefixo pule a recomputação. Quatro propriedades vêm da palavra “prefixo”, e as quatro surpreendem as pessoas.
É um prefixo, não um conjunto
Link para a seção: É um prefixo, não um conjuntoA cache compara a partir do início do prompt renderizado e para no primeiro byte diferente. Não há crédito parcial por conteúdo que aparece depois em outra ordem. A OpenAI diz de forma direta: “a reutilização da cache exige que todo o prefixo renderizado corresponda”.6
Há um comprimento mínimo
Link para a seção: Há um comprimento mínimoAbaixo dele, nada é armazenado em cache e nenhum erro é retornado. Na OpenAI, o mínimo é 1.024 tokens para GPT-5.6 e posteriores, e 2.048 para modelos mais antigos. Na Anthropic, varia de 512 a 4.096 dependendo do modelo — 1.024 para Claude Sonnet 4.5, 4.096 para Claude Haiku 4.5. Se os dois campos de cache voltam zero, geralmente é por isso.
Escrever custa mais que ler, e mais que não usar cache
Link para a seção: Escrever custa mais que ler, e mais que não usar cacheNa OpenAI e na Anthropic, uma cache write é 1,25× a taxa de input sem cache para a cache de curta duração, e a cache de uma hora da Anthropic é 2×. Uma read é 0,1×. O Google não cobra para escrever, mas aluga o armazenamento: $4.50 por milhão de tokens por hora no Gemini 2.5 Pro.
Ela expira, e vive em uma máquina
Link para a seção: Ela expira, e vive em uma máquinaA entrada padrão da Anthropic vive cinco minutos, renovada de graça a cada acerto. A da OpenAI é de pelo menos trinta minutos após a última escrita ou reutilização. E a OpenAI observa que estados em cache vivem em máquinas individuais, então uma requisição só acerta se for roteada para a máquina que guarda a entrada — que é o que prompt_cache_key influencia, sem garantir.
O ponto de equilíbrio é pequeno o bastante para guardar de cabeça, e a documentação da OpenAI faz a conta: escrever um prefixo uma vez e reutilizá-lo uma vez custa 1,35× seu custo de input comum, contra 2× para processá-lo duas vezes sem cache; ao longo de dez requisições, uma escrita e nove leituras custam 2,15× contra 10×. Uma reutilização paga a escrita. A Anthropic chega ao mesmo lugar: uma leitura para a cache de cinco minutos, duas para a cache de uma hora.
Agora a conversa de quarenta turnos de novo, com caching ativado e o prefixo estável:
| input sem cache | cache reads | cache writes | total | |
|---|---|---|---|---|
| sem cache | 112,617 | — | — | $0.274386 |
| caching | 2,887 | 104,783 | 4,947 | $0.088250 |
Sessenta e oito por cento mais barato, e três números nessa tabela merecem atenção.
A cache só entra no turno 6. O prompt não chega a 1.024 tokens até lá, então os cinco primeiros turnos são cobrados exatamente como antes — e o sexto é cobrado pior, com o prêmio de escrita de 1,25\u00d7, porque é o turno que preenche a cache. A primeira leitura chega no turno 7. Os 2.887 tokens sem cache na tabela são a aritmética: cinco turnos, não seis. Caching é desconto em prompts longos, e uma conversa curta não ganha nada com isso.
O prêmio de escrita é $0.002474, que é 2,8% da conta com cache. Todo turno escreve sua nova cauda, quarenta vezes, e o prêmio de escrita inteiro é erro de arredondamento perto do que as leituras economizaram. Vale entender a cobrança de escrita com precisão para parar de se preocupar com ela.
Apenas 2.887 tokens foram cobrados ao preço cheio de input de 112.617. Essa é a forma de uma cache funcionando: quase tudo é leitura.
A ordem do prompt decide se algo disso acontece
Link para a seção: A ordem do prompt decide se algo disso aconteceAqui está a falha que custa dinheiro de verdade, e é um bug de uma linha.
Coloque algo que muda a cada chamada perto do início do prompt — um timestamp, um ID de requisição, o nome do usuário, uma linha “hoje é”, um documento recém-recuperado — e o prefixo difere desde o primeiro byte. Nada bate. Toda chamada é miss. E como toda chamada apresenta um prefixo novo, toda chamada também escreve.
Mesma conversa, mesmos quarenta turnos, caching habilitado, com um timestamp por chamada no topo do system prompt:
| total | versus | |
|---|---|---|
| sem caching algum | $0.274386 | — |
| caching, prefixo estável | $0.088250 | −67,8% |
| caching, prefixo volátil | $0.329251 | +20,0% |
Ativar prompt caching tornou a conversa vinte por cento mais cara do que não ativar. Você pagou o prêmio de escrita de 1,25× sobre 109.730 tokens e leu de volta zero. Não há erro, não há aviso, e o recurso está ligado.
Então a regra, e ela é todo o prompt caching em uma linha: conteúdo estável na frente, conteúdo variável atrás. Instruções de sistema, definições de tools e material de referência primeiro; timestamps, identidade do usuário e a pergunta atual por último. A Anthropic explicita a hierarquia — a cache segue tools → system → messages, e uma mudança em qualquer nível invalida esse nível e tudo depois dele, então editar uma única descrição de tool invalida a cache inteira.5
Duas consequências fazem as pessoas tropeçarem. Mudar quais tools estão habilitadas muda as definições de tool, então uma feature flag que adiciona uma tool para alguns usuários divide sua cache em duas. E, na Anthropic, alternar web search ou citations modifica o system prompt, o que invalida as caches de sistema e de mensagens sem você tocar em uma linha do seu próprio texto.
Truncar o histórico não é a correção
Link para a seção: Truncar o histórico não é a correçãoA resposta óbvia a uma conta quadrática é parar de enviar o histórico inteiro: manter a última dúzia de mensagens e descartar o resto. Isso reduz a conta, geralmente é o movimento errado, e a medição mostra por quê.
| estratégia | total | versus histórico completo + cache |
|---|---|---|
| histórico completo, sem cache | $0.274386 | +211% |
| histórico completo, caching | $0.088250 | — |
| últimas 12 mensagens, sem cache | $0.118712 | +35% |
| últimas 12 mensagens, caching ligado | $0.122546 | +39% |
Truncar para uma window de doze mensagens é 57% mais barato do que enviar tudo sem cache — a comparação que todo mundo faz, e por isso a técnica é popular. Mas é 39% mais caro do que enviar tudo com uma cache funcionando, e ligar caching junto com truncamento deixa um pouco pior, não melhor.
O mecanismo é o prefixo de novo. Uma sliding window remove a mensagem mais antiga a cada turno, então o prompt já não começa onde começou da última vez e cada turno apresenta um novo prefixo. A orientação da OpenAI diz exatamente isso: “summarisation, compaction, or context truncation can change the prefix and reset cache reuse.”6 No turno 40, o prompt em window tem 813 tokens, abaixo do mínimo de 1.024 tokens, então não pode ser armazenado em cache.
E o dinheiro é a metade barata do custo. O que você descartou é a instrução que o usuário deu no turno 2 e que o modelo precisava no turno 40. Truncamento troca uma conta que você consegue ver por uma falha que não consegue, e fazer isso direito — compactação, notas estruturadas mantidas fora da window, recuperação de histórico sob demanda — é o assunto do Capítulo 24.
Cruzar um tier reajusta o preço da requisição inteira
Link para a seção: Cruzar um tier reajusta o preço da requisição inteiraContextos longos não são apenas mais caros porque são mais longos. Depois de um limiar, eles são mais caros por token, e o limiar se aplica retroativamente ao prompt inteiro.
A página de modelo da OpenAI para gpt-5.6-terra diz isso em uma frase: “Prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request.”7 Não para o excedente. Para tudo.
prompt 271,999 + 500 output -> $0.5500
prompt 272,000 + 500 output -> $0.5500
prompt 272,001 + 500 output -> $1.0970Um token, cinquenta e cinco centavos. Se seu serviço monta prompts a partir de documentos recuperados cujo tamanho você não controla, você tem um penhasco no seu modelo de custo em uma fronteira que ninguém na sua equipe anotou.
O preço do Google funciona da mesma forma com um limiar de 200.000 tokens: Gemini 2.5 Pro custa $1.25 por milhão de input tokens para prompts até 200K e $2.50 acima disso, com output indo de $10.00 para $15.00.8 A Anthropic foi na direção oposta — em 6 de setembro de 2026, sua documentação afirma que Claude 4.6 e posteriores incluem a context window completa de um milhão de tokens no preço padrão, então “uma requisição de 900k tokens é cobrada pela mesma taxa por token que uma requisição de 9k tokens”.9 Modelos anteriores mantinham o adicional.
É por isso que um preço não é um número. Um preço é uma tabela de tiers indexada pelo comprimento do prompt, que é para isso que serve Tier[] na função de custo, e é por isso que computeCost seleciona o tier usando o prompt inteiro, em vez de cada balde separadamente.
Prefill, decode, e por que output custa seis vezes input
Link para a seção: Prefill, decode, e por que output custa seis vezes inputOs cinco baldes se mapeiam para as duas fases do Capítulo 13, e, quando você vê o mapeamento, as proporções de preço param de parecer arbitrárias.
Input tokens são prefill. O prompt inteiro passa pelo modelo em uma só vez, processado em paralelo — grandes multiplicações de matrizes, limitadas por computação. O custo por token é baixo, e esta é a fase que define o tempo até o primeiro token: um prompt de 4.947 tokens tem 4.947 tokens de prefill para executar antes de a primeira palavra aparecer.
Output tokens são decode. Eles são produzidos um de cada vez, cada um uma passagem forward completa que lê a KV cache inteira, com a GPU majoritariamente esperando memória em vez de computar. Esta é a fase que define tokens por segundo, não pode ser paralelizada dentro de uma resposta, e é por isso que output custa cerca de seis vezes input no modelo precificado aqui: $12.00 contra $2.00 por milhão de tokens.
Três consequências vêm diretamente disso. Uma cache read substitui trabalho de prefill, então compra latência e dinheiro ao mesmo tempo — o mesmo desconto aparece como uma conta menor e uma espera mais curta pelo primeiro token. Reasoning tokens são decode que você nunca vê, e é por isso que um modelo de reasoning não transmite nada por vários segundos e depois responde rapidamente: o Capítulo 12 avisou sobre a consequência na interface, e esta é a consequência na fatura. E abortar um stream não interrompe a geração — o Capítulo 14 construiu cancelamento e deixou o preço para este capítulo, e o preço é a contagem completa de output, porque os tokens são produzidos e cobrados quer alguém esteja ouvindo ou não. O mesmo vale para a resposta que ninguém mantém: regenerar uma resposta do turno 40 cinco vezes custa $0.057990 pela única que fica na tela.
Contando tokens antes de enviá-los
Link para a seção: Contando tokens antes de enviá-losO tokenizer do Capítulo 7 era Python e ficou lá. O orçamento acontece no servidor que monta a requisição, então precisa acontecer aqui, e existem exatamente três níveis de precisão disponíveis.
Nível um: conte localmente. js-tiktoken entrega as mesmas tabelas de merge BPE que o tiktoken em Python, então uma contagem idêntica byte a byte para encodings da OpenAI, sem chamada de rede:
import { getEncoding } from "js-tiktoken";
const enc = getEncoding("o200k_base");
const PER_MESSAGE = 4; // role and delimiters added by the chat template
const PER_REPLY = 3; // priming for the assistant turn
export function promptTokens(messages: { role: string; content: string }[]) {
return messages.reduce(
(sum, m) => sum + enc.encode(m.content).length + PER_MESSAGE, PER_REPLY);
}As duas constantes importam e são onde contagens locais derivam. Seu texto não é o que é tokenizado — o chat template do Capítulo 11 envolve cada mensagem em marcadores de papel primeiro, e esses são tokens pelos quais você paga. Quatro por mensagem e três para o reply priming é a aproximação convencional para modelos de chat da OpenAI; nas oitenta e uma mensagens da conversa acima, somam 324 tokens, 6,4% de seu comprimento. As contagens aqui foram verificadas contra o tiktoken em Python do Capítulo 7 em todas as oitenta e uma strings e são idênticas.
Nível dois: pergunte ao provider. A Anthropic expõe /v1/messages/count_tokens e o Google expõe count_tokens, ambos aceitando o mesmo formato de requisição de uma chamada real e retornando uma contagem de input tokens de graça. Use quando você não consegue contar localmente — e você não consegue contar localmente para a Anthropic, cujo tokenizer não é publicado. A documentação da Anthropic é cuidadosa sobre o que está dando a você: a contagem “é uma estimativa” e “pode incluir tokens adicionados automaticamente pela Anthropic para otimizações de sistema”, pelos quais “você não é cobrado”.10
Nível três: leia usage na resposta. Essa é a verdade, e ela chega depois que o dinheiro foi gasto. Justamente por isso os dois primeiros níveis existem — para decidir se deve enviar a requisição, não para cobrá-la.
As coisas pelas quais você paga e que ninguém mostra
Link para a seção: As coisas pelas quais você paga e que ninguém mostraQuatro itens que não aparecem como itens.
O system prompt, pago em cada chamada. O acima tem 192 tokens com o overhead do template. Ao longo de quarenta chamadas, são 7.680 tokens — 5,6% da conta inteira desta conversa, por oito linhas escritas uma vez. Também é o melhor candidato possível para cache, por ser estável e estar primeiro.
Definições de tools. O nome, a descrição e o schema JSON de cada tool saem em toda requisição, e os providers adicionam estrutura por cima. A Anthropic publica o número: habilitar tools já adiciona um system prompt oculto de 496 tokens no Claude Sonnet 4.5 com tool_choice definido como auto, ou 588 com any ou uma tool nomeada.9 Isso antes dos seus próprios schemas. O Capítulo 18 constrói o catálogo; o Capítulo 24 mede quanto ele consome.
Toda geração, incluindo as que você descarta. Cinco regenerações custam cinco vezes. O chat mostra uma.
Pensamentos que não são mostrados a você. A cobrança se baseia no total de thought tokens, embora apenas um resumo seja retornado, e nenhuma contabilidade sua consegue auditar esse número.
Ter 200K tokens não é usá-los
Link para a seção: Ter 200K tokens não é usá-losUm alerta para encerrar, porque é o próximo pensamento natural e a resposta não é a óbvia.
Uma window de um milhão de tokens não significa um milhão de tokens utilizáveis. A precisão de retrieval degrada com a posição: Liu et al. descobriram que modelos localizam informações de forma confiável no início e no fim de um input longo, e muito menos no meio.11 Uma window maior compra a capacidade de enviar mais, não a certeza de ser lido.
Esse fenômeno é medido uma vez neste curso — a taxa de retrieval em nove posições no mesmo prompt de 853 tokens — e pertence ao Capítulo 24, onde muda o que um agent faz. Ele é citado aqui porque muda o que você deve comprar: o token mais barato é o que você não enviou.
Para onde isso vai agora
Link para a seção: Para onde isso vai agoraAgora você consegue prever quanto uma chamada custará antes de fazê-la, ler quanto ela custou depois e distinguir as duas coisas. Isso cobre tudo sobre a requisição, exceto a parte em que você ainda não mexeu: os controles.
O Capítulo 17 é sampling — temperature, top-p, top-k, as penalidades e o determinismo que você não tem. Ele começa desmontando o erro mais disseminado da área: que temperature é um botão de criatividade. Não é: temperature divide os logits do Capítulo 4 antes da softmax, e aumentá-la não torna o modelo imaginativo, aumenta a probabilidade de tokens que o próprio modelo avaliou como piores. A partir daí, por que greedy decoding produz texto mensuravelmente pior que sampling, por que top-k e top-p falham em formatos opostos de distribuição, e o experimento que encerra o capítulo: vinte passagens forward idênticas em temperature 0 voltam idênticas bit a bit quando o modelo roda sozinho, e colocar o mesmo prompt em um batch ao lado das requisições de outra pessoa move 97% de seus logits.
Eles não batem todos. O motivo começa com a caixa de ponto flutuante do Capítulo 2.
Fontes e método
Link para a seção: Fontes e métodoTodos os preços, limiares e multiplicadores neste capítulo foram lidos nas páginas dos próprios providers em 6 de setembro de 2026 e são declarados com essa data porque vão mudar. O método importa mais que os números: os baldes, a regra do prefixo e a aritmética de tiers estão estáveis há dois anos, enquanto todos os valores dentro deles se moveram.
A aula 2 de Stanford CS336, Resource accounting, é o tratamento acadêmico mais próximo deste material e a próxima leitura certa: ela faz a mesma aritmética no lado de treinamento que este capítulo faz no lado de inferência. As contagens de tokens aqui foram produzidas com js-tiktoken 1.0.21 usando os encodings o200k_base e cl100k_base, sobre uma conversa de quarenta turnos com 5.090 tokens; o overhead de template por mensagem é a aproximação convencional de quatro-mais-três e é declarado sempre que incluído. Os números de cache, tier e truncamento são as regras de preço documentadas aplicadas a essas contagens de tokens medidas, não observações de respostas de API ao vivo — nenhuma chamada paga foi feita para produzir este capítulo, que também é o motivo honesto de as afirmações de latência serem qualitativas e as de custo não.
Referências
Link para a seção: Referências-
Dao, T., Fu, D. Y., Ermon, S., Rudra, A. e Ré, C. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv:2205.14135 (2022). Por que o teto subiu sem o custo assintótico mudar. ↩
-
Chen, S., Wong, S., Chen, L. e Tian, Y. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (2023). ↩
-
Peng, B., Quesnelle, J., Fan, H. e Shippole, E. YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071 (2023). ↩
-
Google, Thinking,
ai.google.dev/gemini-api/docs/thinking, e Token counting,ai.google.dev/gemini-api/docs/tokens, ambos acessados em 2026-09-06. “Pricing is based on the full thought tokens the model needs to generate, despite only the summary being output from the API.” O objeto de usage relatatotal_input_tokens,total_output_tokens,total_thought_tokens,total_cached_tokens,total_tool_use_tokensetotal_tokens— seis baldes, com pensamentos e uso de tool fora da contagem de output. O nome de campo anterior para a mesma quantidade, ainda retornado pela superfície generateContent, éthoughtsTokenCount, documentado em uma terceira página,ai.google.dev/gemini-api/docs/generate-content/thinking. ↩ -
Anthropic, Prompt caching,
docs.anthropic.com/en/docs/build-with-claude/prompt-caching, acessado em 2026-09-06. Fonte da hierarquia de invalidaçãotools→system→messagese sua tabela; dos comprimentos mínimos armazenáveis em cache por modelo; da identidadetotal_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens; e da vida útil padrão de cinco minutos renovada sem cobrança a cada acerto. ↩ ↩2 -
OpenAI, Prompt caching,
platform.openai.com/docs/guides/prompt-caching, acessado em 2026-09-06. Fonte de: a regra do prefixo renderizado inteiro; o prefixo mínimo armazenável em cache (1.024 input tokens visíveis no GPT-5.6 e posteriores, 2.048 nos anteriores); os multiplicadores de escrita 1,25× e leitura 0,1×, e a ausência de qualquer cobrança de escrita no GPT-5.5 e anteriores; a vida útil de 30 minutos; os limites de quatro escritas por requisição e cinquenta breakpoints; a nota de afinidade de máquina eprompt_cache_key; os exemplos calculados de ponto de equilíbrio de 1,35×, 2,15× e 10×; e a afirmação de que summarisation, compaction ou truncation reinicia a reutilização de cache. ↩ ↩2 -
OpenAI, Pricing (
platform.openai.com/docs/pricing) e a página do modelo paragpt-5.6-terra, ambas acessadas em 2026-09-06.gpt-5.6-terra, tier de serviço padrão, por milhão de tokens: input $2.00, input em cache $0.20, cache writes $2.50, output $12.00; input de contexto longo $4.00, em cache $0.40, writes $5.00, output $18.00; “prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request”; context window de 1.050.000 tokens com máximo de 922.000 input tokens. A mesma tabela listagpt-6-astraa $10.00/$1.00/$12.50/$50.00 egpt-5.6-lunaa $0.20/$0.02/$0.25/$1.20. Todo custo calculado neste capítulo usa as taxas padrão de contexto curto degpt-5.6-terra. ↩ -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, acessado em 2026-09-06. Gemini 2.5 Pro, por milhão de tokens: input $1.25 para prompts até 200K e $2.50 acima; output $10.00 e $15.00, em ambos os casos rotulado “including thinking tokens”; context caching $0.125 e $0.25, mais uma cobrança de armazenamento de $4.50 por milhão de tokens por hora. Gemini 3.1 Pro Preview usa o mesmo limiar de 200K a $2.00/$4.00 de input e $12.00/$18.00 de output. ↩ -
Anthropic, Pricing,
docs.anthropic.com/en/docs/about-claude/pricing, acessado em 2026-09-06. Por milhão de tokens, input base / cache write de 5 minutos / cache write de 1 hora / cache read / output: Claude Sonnet 4.5 $3 / $3.75 / $6 / $0.30 / $15; Claude Haiku 4.5 $1 / $1.25 / $2 / $0.10 / $5; Claude Opus 5 $5 / $6.25 / $10 / $0.50 / $25. Multiplicadores: 1,25× para a escrita de cinco minutos, 2× para a escrita de uma hora, 0,1× para uma leitura. Também é a fonte da afirmação de contexto longo (“Claude 4.6 and later models... include the full 1M token context window at standard pricing”), das contagens de tokens do system prompt de uso de tool (496 tokens no Claude Sonnet 4.5 comtool_choicedeautoounone, 588 comanyou uma tool nomeada), e da nota de que Claude 4.7 e posteriores usam um tokenizer mais novo que produz “aproximadamente 30% mais tokens para o mesmo texto”. ↩ ↩2 ↩3 -
Anthropic, Token counting,
docs.anthropic.com/en/docs/build-with-claude/token-counting, acessado em 2026-09-06. O endpoint/v1/messages/count_tokensrecebe os mesmos inputs de uma mensagem e retorna uma contagem de input tokens; a documentação afirma que a contagem é uma estimativa, que pode incluir tokens que a Anthropic adiciona para otimizações de sistema e que eles não são cobrados. ↩ -
Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. e Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Citado aqui, medido no Capítulo 24. ↩