| |

Claude taxa de acerto do cache caiu para 0? 3 passos com diagnostics para descobrir qual parte mudou

Claude taxa de acerto do cache caiu para 0? 3 passos com diagnostics para descobrir qual parte mudou

Nota do autor: se a taxa de acerto do cache de comandos do Claude caiu de repente para 0, ou se a fatura não baixa de jeito nenhum, você pode usar os três passos do diagnostics para encontrar onde o prefixo divergiu e, junto com o usage, verificar se o cache realmente foi usado. O artigo também explica como fazer essa checagem por conta própria ao usar o serviço proxy de API da APIYI. (Se você está com esse problema, depois de ler o artigo pode enviá-lo ao seu agente e pedir que ele investigue.)

Cache não acertar não é mágica: a API mostra em qual trecho o prefixo começa a divergir. Basta enviar de volta o id da resposta da rodada anterior para ver se o primeiro ponto de divergência está em model, system, tools ou messages.

Este não é um artigo sobre lançamento de funcionalidade. Ele é para desenvolvedores que já usam o cache de comandos do Claude, mas tiveram a taxa de acerto zerada de repente ou estão com a fatura nas alturas. Todos os passos de investigação deixam claro o que você vai ver em cada etapa.

O que você leva daqui: ao terminar a leitura, você consegue identificar a causa da falha do cache em até três requisições. Também vai entender o que diagnostics e usage mostram separadamente e quais dois campos comparar entre si quando estiver usando um proxy de API.

claude-prompt-cache-diagnostics-hit-rate-troubleshooting-pt-pt-image-0


Pontos-chave do diagnóstico de cache (diagnostics) do Claude

Em uma frase: você passa o id da resposta anterior e a API compara as duas requisições, apontando onde fica o primeiro ponto de divergência — se em model, system, tools ou messages. Antes, quando o cache falhava silenciosamente, você só via usage.cache_read_input_tokens virar 0, sem saber qual trecho tinha mudado.

Ponto O que é Valor para você
Chave de ativação A impressão digital só é armazenada se o objeto diagnostics estiver no nível superior do corpo da requisição Não precisa mexer na lógica de negócio, basta adicionar um campo
Forma de comparação Passe o id da resposta anterior em previous_message_id Localiza direto o primeiro segmento divergente
Campo de conclusão cache_miss_reason retorna um entre seis tipos Cada tipo aponta um local claro de correção
Junto com as métricas Precisa ser lido em conjunto com usage.cache_read_input_tokens Evita confundir “sem divergência” com “não entrou em vigor”
Disponibilidade Só a API oficial do Claude oferece Em outros canais, é preciso usar a autoinspeção via usage

Linha do tempo do diagnóstico de cache do Claude

O recurso chegou em beta em maio de 2026 e, na época, exigia o header anthropic-beta: cache-diagnosis-2026-04-07. Ao longo de setembro as regras ficaram mais rígidas uma vez: só as requisições que trazem explicitamente o objeto diagnostics guardam a impressão digital; as que só têm o header não são registradas.

Em 23 de setembro ele passou a versão estável, sem precisar mais do cache-diagnosis-2026-04-07, e requisições com o header antigo continuam funcionando normalmente. Agora o campo diagnostics sempre aparece na resposta de POST /v1/messages, com valor null quando não está habilitado. Ou seja, ver esse campo como null não significa que a interface tenha dado problema.

A impressão digital guarda apenas o hash e uma estimativa da contagem de tokens, sem salvar o conteúdo original do comando. Ela é indexada pelo response id, tem escopo limitado à sua organização e ao seu workspace, e o tempo de retenção é curto.


3 passos para investigar a taxa de acerto do cache do Claude com diagnostics

Os três passos abaixo seguem a descrição oficial dos campos. Se você fizer a chamada via APIYI, na interface nativa Messages, preencha o base_url com https://api.apiyi.com/v1 e o caminho da requisição é /v1/messages. Mas atenção: a seção de testes práticos mais adiante vai mostrar como o diagnostics realmente retorna no cenário de serviço proxy de API.

claude-prompt-cache-diagnostics-hit-rate-troubleshooting-pt-pt-image-1

Passo 1: adicionar o objeto diagnostics no nível superior da requisição

diagnostics é o único interruptor. Requisições sem ele não armazenam a impressão digital, então depois não há como comparar. Na primeira rodada não existe nada para comparar, então passe previous_message_id como null, o que significa “começar a registrar a partir desta rodada”.

  • Mantenha o cabeçalho de versão normal: anthropic-version: 2023-06-01
  • Depois da versão oficial, não é mais necessário enviar: anthropic-beta: cache-diagnosis-2026-04-07
  • Adicione no nível superior do corpo da requisição: "diagnostics": {"previous_message_id": null}
  • O bloco system que precisa de cache continua com o ponto de cache normalmente: "cache_control": {"type": "ephemeral"}
  • O que você verá: na resposta, diagnostics vem como null, cache_read_input_tokens normalmente é 0 e cache_creation_input_tokens é maior que 0

Ver null na primeira rodada não significa falha. Nesta rodada o cache está sendo gravado; não existe uma rodada anterior para comparar, então não há o que solucionar.

Passo 2: a cada rodada seguinte, envie o id da resposta anterior

A partir da segunda rodada, coloque o id da resposta anterior em previous_message_id. O erro mais comum é incluir diagnostics só na primeira rodada e esquecer nas seguintes. A requisição que a rodada seguinte aponta acaba não sendo registrada, e o retorno é previous_message_not_found.

  • Corpo da segunda requisição: "diagnostics": {"previous_message_id": "<id da resposta da primeira rodada>"}
  • Corpo da terceira requisição: "diagnostics": {"previous_message_id": "<id da resposta da segunda rodada>"}
  • A lógica do ciclo de várias rodadas: na primeira você passa null, na segunda passa r1.id, na terceira passa r2.id, e assim por diante
  • Em chamadas com streaming, o resultado aparece no evento message_start, e o id segue sendo repassado rodada a rodada
  • O que você vai ver: quando o intervalo entre duas rodadas consecutivas é curto o suficiente e ambas estão no mesmo workspace, o resultado da comparação começa a aparecer na resposta

Passo 3: leia o cache_miss_reason e corrija conforme a tabela

diagnostics tem três valores possíveis, então entenda bem antes de ler:

  • null: a requisição não trouxe diagnostics; ou o previous_message_id era null; ou a comparação já terminou e não foram encontradas divergências
  • {"cache_miss_reason": null}: a comparação ainda está em andamento, porque a resposta começou rápido demais e nesta rodada não dá para concluir nada — espere a próxima
  • cache_miss_reason é um objeto: já existe uma conclusão, com o tipo de bifurcação e os detalhes
  • O que você vai ver: depois de obter o tipo, corrija seguindo a tabela de correspondência da próxima seção. Comece pela bifurcação mais antiga, porque ele reporta apenas o primeiro ponto de divergência e os problemas seguintes podem estar escondidos atrás dele

🚀 Início rápido: se quiser primeiro confirmar se o seu prefixo de cache consegue gravar e acertar, você pode usar a mesma Key no APIYI apiyi.com, alternando entre os modelos Claude em duas rodadas de comparação, e olhar principalmente se os dois números de gravação e leitura de cache no usage batem.


Os seis tipos de cache_miss_reason e onde corrigir

Depois de obter o cache_miss_reason, basta cruzar com a tabela abaixo para saber o que alterar:

Tipo Significado O que alterar
model_changed O modelo é diferente do turno anterior — por exemplo, roteamento, teste A/B ou fallback trocaram o modelo. A cache é isolada por modelo Fixe o modelo durante toda a conversa em cache
system_changed O system mudou. O caso mais comum é ter inserido timestamp, request ID ou outro valor que muda a cada requisição Transforme o system em uma constante estável byte a byte e mova os dados dinâmicos para a primeira mensagem de user depois do breakpoint
tools_changed Ferramentas foram adicionadas, removidas, tiveram a ordem alterada, ou o resultado da serialização de input_schema não é estável Envie a mesma lista de ferramentas em todo turno, com ordem fixa e serialização com chaves ordenadas
messages_changed Mensagens anteriores foram modificadas, reordenadas ou removidas, em vez de apenas anexadas ao final O histórico só cresce: devolva o conteúdo do assistant e os resultados de ferramentas exatamente como vieram
previous_message_not_found Não foi possível encontrar a impressão digital correspondente — isso não significa que a requisição mudou Envie diagnostics em todo turno, não atravesse workspaces e não deixe intervalos muito longos entre as chamadas
unavailable Neste turno não foi possível obter o diagnóstico — por exemplo, tool_choice, thinking, context_management, output_config, output_format ou o conjunto de beta headers estão inconsistentes, ou a conversa está longa demais Mantenha esses parâmetros inalterados durante todo o ciclo de vida de uma conversa em cache

Os quatro tipos *_changed também trazem cache_missed_input_tokens, que indica aproximadamente quantos tokens de entrada cacheáveis foram perdidos depois do ponto de divergência. Esse número é calculado a partir do comprimento em bytes, serve apenas para estimar a ordem de grandeza e não é o valor da fatura — às vezes ele é até maior que usage.input_tokens.


Olhar só o diagnostics leva a erro: combine com usage para avaliar o cache hit do Claude

O diagnostics responde a pergunta «minha requisição mudou?», enquanto usage.cache_read_input_tokens responde «o cache foi atingido?». São duas perguntas diferentes, e olhar apenas uma delas facilmente leva a uma conclusão errada.

Resultado do diagnostics Tokens lidos do cache Conclusão O que fazer
null Alto Prefixo estável, cache atingido Não precisa fazer nada
null Baixo ou 0 Requisição não mudou, mas o cache já expirou Encurtar o intervalo entre requisições, ou usar TTL de 1 hora
*_changed Baixo Requisição mudou, por isso não houve hit Corrigir conforme a tabela de referência da seção anterior
*_changed Alto A mudança ocorreu numa posição mais ao final, os breakpoints anteriores ainda atingem Vale a pena corrigir, mas o impacto é pequeno

Vale reforçar mais uma vez: null não significa que não funcionou, pode ser justamente o melhor resultado. Há ainda alguns casos em que esta tabela não se aplica: na primeira rodada, cache_miss_reason é null (a comparação ainda está em andamento), além de previous_message_not_found e unavailable. Nesses casos não houve nenhuma comparação válida.

claude-prompt-cache-diagnostics-hit-rate-troubleshooting-pt-pt-image-2

Se você ainda não sabe a qual célula cada rodada pertence, pode enviar a mesma requisição duas vezes seguidas no APIYI apiyi.com, registrar os números de leitura e escrita do cache de cada rodada e depois excluir item por item conforme a matriz acima.


Causas comuns de baixa taxa de acerto de cache no Claude: três condições obrigatórias

Muitas vezes a taxa de acerto baixa não tem nada a ver com a requisição ter mudado — o problema é que o cache nunca foi gravado desde o início. Se faltar qualquer uma das três condições abaixo, o cache simplesmente não entra em ação:

  1. É preciso marcar o cache_control explicitamente: você pode colocá-lo em um bloco de conteúdo específico para criar um ponto de corte explícito, ou colocar um cache_control no nível superior da requisição, e aí o sistema marca automaticamente o ponto de corte no último bloco cacheável. Se o content for uma string pura, sem nenhum bloco de conteúdo onde pendurar a marcação, nunca haverá cache.
  2. O comprimento precisa atingir o mínimo cacheável: na API do Claude, tanto o Sonnet 5.5 quanto o Opus 5.5 exigem 512 tokens. Se o prefixo não for longo o suficiente, o cache é ignorado silenciosamente, sem nem retornar erro.
  3. O prefixo precisa ser idêntico byte a byte: o histórico só cresce no final, e system e tools permanecem estáveis. Qualquer mudança em um espaço, na ordem dos campos do JSON ou em um timestamp faz com que tudo seja tratado como um novo prefixo.

A documentação de cache da APIYI também menciona dois limites rígidos: no máximo 4 pontos de corte cache_control por requisição, e cada ponto de corte só retrocede até os 20 content blocks mais recentes. Em conversas longas de múltiplos turnos, marcar apenas a última mensagem não cobre todo o histórico.

O TTL também costuma passar batido. O padrão é 5 minutos, e cada acerto renova o prazo — mas a contagem começa no momento da requisição que gravou ou leu o cache, não quando a resposta termina. Se uma resposta em streaming levou 4 minutos para sair, a próxima requisição precisa ser enviada em cerca de 1 minuto. Se você precisa de uma janela maior, basta escrever "ttl": "1h" dentro do cache_control.


A conta de custos quando a taxa de acerto do cache do Claude cai a 0

Primeiro, a tabela de preços. Valores em dólares por milhão de tokens, com data de referência 2026-10-25 — vale sempre o preço em tempo real do console:

Modelo Entrada Saída Leitura de cache Escrita 5 min Escrita 1 hora
Claude Sonnet 5.5 $2 $10 $0.10 $2.50 $4
Claude Opus 5.5 $4 $20 $0.20 $5 $8
Claude Haiku 5.5 (até 100 mil tokens) $0.1 $0.5 $0.01 $0.125 $0.20
Claude Haiku 5.5 (acima de 100 mil tokens) $0.50 $2.50 $0.05 $0.625 $1

Os multiplicadores precisam ser analisados separadamente. A referência geral do guia de cache da APIYI é: acerto 0.1×, escrita de 5 minutos 1.25×, escrita de 1 hora 2×. O Sonnet 5.5 acompanhou o ajuste oficial em 7 de outubro: a leitura de cache caiu de $0.20 para $0.10, passando a ser 0.05× do preço base de entrada, enquanto o preço de escrita não mudou.

Esse ajuste não foi um corte geral de preços — a leitura de cache do Sonnet 5 continua em $0.20. Então não use 0.1× para calcular o Sonnet 5.5; para modelo e preço específicos, vale a lista de modelos da plataforma.

O ponto de equilíbrio, pela referência geral de 0.1× da plataforma: com TTL de 5 minutos, basta reutilizar duas vezes para empatar (1.25 + 0.1 = 1.35, abaixo de 2.0 sem cache); com TTL de 1 hora, são necessárias três reutilizações (2 + 0.2 = 2.2, abaixo de 3.0).

Agora um exemplo de cálculo. Sonnet 5.5, prefixo fixo de 30 mil tokens, 200 requisições por dia, todas dentro do TTL de 5 minutos:

  • Tudo acerta o cache: 200 × 30 mil × $0.10/milhão = $0.60, mais uma escrita de $0.075, total de aproximadamente $0.675/dia
  • Nada acerta o cache: 200 × 30 mil × $2/milhão = $12/dia

A diferença na conta do dia inteiro é de cerca de 17.8 vezes — e isso não é a diferença de preço unitário. O preço unitário é $2 contra $0.10, uma diferença de 20 vezes. Se usar TTL de 1 hora, uma escrita custa $0.12 e o preço de acerto não muda. Quando o intervalo entre requisições costuma passar de 5 minutos, vale comparar: o custo extra dessa escrita versus o custo de reconstruir o prefixo repetidamente — qual sai mais barato?

claude-prompt-cache-diagnostics-hit-rate-troubleshooting-pt-pt-image-3


Como investigar a taxa de acerto de cache do Claude ao usar a APIYI

Primeiro, o resultado do teste real. Em 26/10/2026 fizemos um teste na APIYI usando o Claude Sonnet 5.5 em duas rodadas: na primeira, o cache gravou 2523 e leu 0; na segunda, enviando exatamente o mesmo conteúdo, o cache leu 2523 e gravou 0 — os números de tokens batem perfeitamente. O Claude Opus 5.5, com um prefixo longo, também consegue gravar e acertar.

Mas o campo diagnostics não aparece na resposta. Não aparece em chamadas não-streaming, nem no message_start das chamadas streaming. Reenviamos com o beta header e ainda alteramos o system de propósito para forçar um caso real de não-acerto (leitura 0, escrita 2526) — e mesmo assim o campo não veio. Todas as requisições retornaram 200, sem erro. O canal upstream da camada de proxy não é necessariamente o da API oficial do Claude, então nesse cenário o jeito é comparar os dois campos do usage entre si.

Sintoma na autoverificação O que significa
O cache_read_input_tokens desta rodada é exatamente igual ao cache_creation_input_tokens da rodada anterior O prefixo foi acertado por completo
A leitura desta rodada é bem menor que a escrita da anterior Só acertou um trecho mais no início; alguma coisa no meio mudou
A escrita fica sempre em 0 Não aplicou a marcação, o tamanho não é suficiente, ou você usou o formato compatível com OpenAI
Na segunda rodada volta a escrever e a leitura é 0 O prefixo mudou; verifique timestamps, UUIDs e a ordem de serialização

Vale destacar um ponto: o cache só funciona no /v1/messages nativo. Se você chamar o Claude pelo formato compatível com OpenAI, em /v1/chat/completions, não há como obter cobrança de cache, não importa como você passe os parâmetros.

💡 Sugestão de investigação: a APIYI (apiyi.com) repassa o cache_control para o upstream exatamente como você enviou, e devolve os dois campos de cache da resposta sem alteração — seu código não precisa de nenhum ajuste extra por causa da camada de proxy. Basta transformar a regra “leitura desta rodada = escrita da rodada anterior” em um alerta de log para substituir boa parte da verificação manual.


Limitações do diagnóstico de cache (diagnostics) do Claude

O diagnostics não resolve tudo — antes de usar, vale conhecer os limites:

  • Só está disponível na API oficial do Claude; as versões hospedadas no Amazon Bedrock e no Google Cloud não oferecem o recurso
  • A impressão digital fica retida por pouco tempo, então é preciso enviar requisições em várias rodadas seguidas, com intervalos curtos
  • As duas requisições precisam pertencer à mesma organização e ao mesmo workspace; dá para conferir pelo cabeçalho de resposta anthropic-workspace-id
  • Em conversas longas, se a mudança estiver escondida bem no fundo da lista de mensagens, pode ser que só retorne unavailable
  • É um mecanismo best-effort: se não conseguir o resultado, não bloqueia a requisição nem faz ela falhar

Perguntas frequentes (FAQ)

Q1: Por que o diagnostics fica sempre null?

São três casos possíveis: você não enviou o objeto `diagnostics`; é a primeira rodada e `previous_message_id` está `null`; ou a comparação terminou e não houve divergência. Vale combinar com a leitura do cache: leitura alta indica que está tudo certo, leitura 0 provavelmente significa que o cache expirou. Se estiver passando por um serviço proxy de API, o campo pode simplesmente não voltar na resposta — nesse caso, use o próprio `usage` para se verificar.

Q2: O previous_message_not_found significa que a requisição mudou?

Não. Ele só indica que não foi possível encontrar a impressão digital correspondente. Há três causas comuns: a rodada anterior não levou `diagnostics`, a rodada anterior veio de outro workspace, ou o intervalo foi longo demais. Basta incluir `diagnostics` em todas as rodadas e encurtar o intervalo.

Q3: O diagnóstico gera cobrança extra?

A documentação oficial não lista “taxa de diagnóstico” como um item separado; ele é cobrado junto com as requisições normais de Messages. A documentação também não afirma explicitamente que não há acréscimo, então considere a fatura e o console como referência para a cobrança.

Q4: Dá para usar esse diagnóstico passando por um proxy?

Nos nossos testes na APIYI, não recebemos o campo `diagnostics`, mas a escrita e o acerto do cache funcionaram normalmente. Dá para avaliar pela regra “a leitura desta rodada é exatamente igual à escrita da rodada anterior”; para saber como integrar, consulte a documentação de cobrança de cache da APIYI em apiyi.com.

Q5: Coloquei cache_control e nada foi escrito no cache. Por quê?

Verifique três pontos: o `content` é uma string simples? O prefixo atingiu 512 tokens (Sonnet 5.5 e Opus 5.5)? Você está usando o formato compatível com OpenAI? Se qualquer um dos três não for atendido, o cache é ignorado silenciosamente.

Q6: Se aparecerem vários problemas ao mesmo tempo, qual devo corrigir primeiro?

Corrija primeiro o que o `cache_miss_reason` aponta. Ele só reporta o ponto de divergência mais antigo; depois de corrigir, rode outra vez e os problemas que estavam escondidos atrás vão aparecer. Reenviar a mesma requisição repetidamente na APIYI (apiyi.com) ajuda a eliminar os problemas um por um com bastante agilidade.


Principais pontos do diagnóstico de cache do Claude

  • O que é diagnostics: passe o id da resposta da rodada anterior para localizar o primeiro segmento divergente do prefixo
  • Como ativar: inclua diagnostics no nível superior; na primeira rodada passe null; nas rodadas seguintes, sempre passe
  • O que significa null: na primeira rodada ou quando não há divergência, também é null; isso sozinho não pode ser tratado como sinal de falha
  • Como avaliar: só dá para concluir olhando diagnostics junto com cache_read_input_tokens
  • Condições obrigatórias: marcar explicitamente, atingir 512 tokens, prefixo idêntico byte a byte
  • Diferença de custo: prefixo de 30 mil tokens, 200 vezes por dia, a conta do dia inteiro difere cerca de 17,8 vezes
  • Autoverificação no proxy: no APIYI apiyi.com, verifique se a leitura desta rodada é igual à escrita da rodada anterior

Resumo

A investigação da taxa de acerto de cache do Claude pode ser resumida em três coisas:

  1. Localizar a divergência: inclua diagnostics em cada rodada, leia cache_miss_reason e corrija primeiro o ponto reportado mais cedo
  2. Fazer a avaliação cruzada: analise diagnostics e usage juntos; null não significa que não funcionou
  3. Respeitar as condições obrigatórias: marque corretamente, atinga o comprimento exigido, apenas acrescente ao histórico e mantenha system e tools estáveis

Se sua cadeia de chamadas não consegue obter diagnostics, use os dois campos de usage para montar uma autoverificação. Recomendo validar os números de leitura e escrita do cache no APIYI apiyi.com com duas requisições antes de colocar em produção.


📚 Referências

  1. Documentação oficial do Claude: Cache diagnostics: campos de diagnóstico, seis tipos e matriz de decisão
  2. Link: platform.claude.com
  3. Descrição: Os campos, a linha do tempo e as limitações do diagnostics deste artigo seguem esta documentação

  4. Documentação oficial do Claude: Prompt caching: regras de cache, TTL, comprimento mínimo e preços

  5. Link: platform.claude.com
  6. Descrição: Fonte do comprimento mínimo cacheável e da tabela de preços oficial

  7. Lista de modelos da APIYI: preços de entrada, saída e leitura de cache de cada modelo Claude

  8. Link: docs.apiyi.com/models
  9. Descrição: Dados de preços atualizados em 2026-10-25

  10. Guia de cobrança de cache do Claude Prompt Caching da APIYI: multiplicadores, ponto de equilíbrio e critérios de autoverificação

  11. Link: docs.apiyi.com/api-capabilities/claude-prompt-caching
  12. Descrição: Base para diagnóstico no cenário de serviço proxy de API

Autor: Equipe técnica da APIYI
Contato técnico: Fale com a gente pela página inicial do site da APIYI; mais materiais estão disponíveis no centro de documentação docs.apiyi.com

Artigos relacionados

Similar Posts