Este recurso se qualifica para Zero Data Retention (ZDR) com retenção técnica limitada. Consulte a seção Retenção de dados para detalhes sobre o que é retido e por quê.
O cache de prompt reduz significativamente a latência e o custo, mas apenas quando o início do seu prompt é idêntico byte a byte a uma requisição recente. Uma ferramenta reordenada, um timestamp interpolado no seu prompt do sistema ou uma edição em uma mensagem anterior podem invalidar o cache silenciosamente. Sem o diagnóstico de cache, o único sinal é usage.cache_read_input_tokens caindo para zero, sem nenhuma indicação do que mudou.
O diagnóstico de cache preenche essa lacuna. Passe o id da sua resposta anterior, e a API compara as duas requisições e informa onde elas divergiram (o modelo, o prompt do sistema, as ferramentas ou o histórico de mensagens) para que você possa corrigir a causa raiz em vez de adivinhar.
O diagnóstico de cache está em beta. Inclua o cabeçalho beta cache-diagnosis-2026-04-07 nas suas requisições de API para usar este recurso.
O diagnóstico de cache está atualmente disponível apenas na API do Claude. Não é compatível com Amazon Bedrock ou Vertex AI.
Quando o cabeçalho beta está presente, a API armazena uma impressão digital (fingerprint) leve de cada requisição, indexada pelo id da resposta. Na sua próxima requisição, inclua esse id como diagnostics.previous_message_id. A API reconstrói a impressão digital para a nova requisição, compara-a com a armazenada e anexa um objeto diagnostics à resposta descrevendo o primeiro ponto de divergência.
A comparação diz respeito à estrutura da requisição, independentemente de o cache ter sido efetivamente aproveitado. Consulte Lendo o diagnóstico junto com o uso para saber como combinar o resultado de diagnostics com usage.cache_read_input_tokens.
As impressões digitais contêm apenas hashes e estimativas de contagem de tokens (nunca o conteúdo bruto do prompt), são retidas por tempo limitado, têm escopo restrito à sua organização e workspace, e não são usadas para nenhum outro propósito.
Envie o cabeçalho beta em cada turno. No primeiro turno, passe "previous_message_id": null para aderir ao recurso sem uma mensagem anterior para comparar. Nos turnos subsequentes, passe o id da resposta anterior.
Em respostas com streaming, diagnostics aparece no evento message_start.
O evento message_start carrega o campo diagnostics completo; consulte Formato da resposta para os valores possíveis.
Em uma conversa de múltiplos turnos, propague o id da resposta mais recente como previous_message_id em cada turno. A primeira iteração passa null para aderir ao recurso; cada iteração subsequente passa o id da resposta anterior.
O campo diagnostics na Message de resposta tem quatro estados possíveis:
| Valor | Significado |
|---|---|
| campo ausente | A requisição não incluiu diagnostics, ou o cabeçalho beta estava ausente. |
null | Ou previous_message_id era null (primeiro turno, nada para comparar), ou uma comparação foi executada e não encontrou divergência. |
{"cache_miss_reason": null} | A comparação ainda estava em execução quando a resposta foi serializada. Isso pode acontecer quando a resposta começa muito rapidamente. Trate como inconclusivo e verifique o próximo turno. |
{"cache_miss_reason": {...}} | Um cache_miss_reason está anexado. Para tipos *_changed, isso identifica o primeiro ponto de divergência; previous_message_not_found e unavailable são casos em que nenhuma comparação foi produzida. |
Quando cache_miss_reason não é nulo, ele tem esta aparência:
{
"id": "msg_01Xyz...",
"type": "message",
"role": "assistant",
"content": [{ "type": "text", "text": "..." }],
"usage": {
"input_tokens": 42,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 41850,
"output_tokens": 210
},
"diagnostics": {
"cache_miss_reason": {
"type": "system_changed",
"cache_missed_input_tokens": 41850
}
}
}cache_miss_reason é uma união discriminada em type. A resposta reporta apenas a divergência mais antiga, então corrija-a primeiro; divergências posteriores podem estar ocultas atrás dela.
| Tipo | O que significa | O que mudar |
|---|---|---|
model_changed | O model difere da requisição anterior (por exemplo, um roteador, teste A/B ou fallback selecionou um modelo diferente). O cache é por modelo. | Mantenha o modelo constante dentro de uma conversa em cache. |
system_changed | O parâmetro system difere. Normalmente um timestamp, ID de requisição ou outro valor por requisição foi interpolado no prompt do sistema. | Torne o prompt do sistema uma constante estável em bytes e mova dados dinâmicos para a primeira mensagem user após o seu ponto de quebra de cache. |
tools_changed | O array tools difere: ferramentas foram adicionadas, removidas ou reordenadas entre turnos, ou o JSON de input_schema da ferramenta foi serializado de forma não determinística. | Envie a mesma lista de ferramentas em cada turno em uma ordem fixa com schemas serializados deterministicamente (por exemplo, ordene as chaves). |
Os quatro tipos *_changed também carregam um inteiro cache_missed_input_tokens: uma estimativa de quantos tokens de entrada ficaram após o ponto de divergência, dando uma noção de quanto prefixo cacheável foi perdido. Ele é derivado de comprimentos em bytes antes da tokenização, então trate-o como um indicador de magnitude em vez de um número de faturamento. Ele pode diferir de (e ocasionalmente exceder) usage.input_tokens.
diagnostics responde "minha requisição mudou?", enquanto usage.cache_read_input_tokens responde "o cache foi aproveitado?". Combiná-los indica onde procurar.
Esta matriz se aplica a turnos em que você passou um previous_message_id real. No primeiro turno (previous_message_id: null), diagnostics é sempre null e cache_read_input_tokens é normalmente zero porque o cache está sendo escrito, não lido; nenhuma solução de problemas é necessária. A matriz também não se aplica quando cache_miss_reason é null (a comparação ainda está pendente; verifique o próximo turno) ou quando seu type é previous_message_not_found ou unavailable (nenhuma comparação foi produzida).
| Resultado do diagnóstico | Tokens de leitura de cache | Interpretação |
|---|---|---|
null | alto | Funcionando como esperado. Seu prefixo está estável e o cache foi aproveitado. |
null | baixo ou zero | Suas requisições coincidem, mas a entrada de cache não estava mais disponível. Considere reduzir os intervalos entre turnos ou usar o TTL de cache de 1 hora. |
cache_miss_reason é um tipo *_changed | baixo ou zero | Bug seu. A requisição mudou; corrija a causa indicada por type. |
cache_miss_reason é um tipo *_changed | alto | Raro. Uma mudança ocorreu tarde no prompt, mas um ponto de quebra cache_control anterior ainda foi aproveitado. Vale a pena corrigir, mas com baixo impacto. |
previous_message_id expiram após um curto período. Execute comparações de diagnóstico entre requisições próximas no tempo.unavailable em vez de uma localização precisa.unavailable, ou cache_miss_reason: null quando a comparação ainda estava em execução.O diagnóstico de cache é elegível para ZDR (qualificado). A Anthropic não armazena o texto bruto dos seus prompts ou das saídas do Claude para este recurso.
A impressão digital armazenada para cada requisição consiste apenas em hashes criptográficos e estimativas de contagem de tokens, indexada pelo id da resposta e com escopo restrito à sua organização e workspace. As impressões digitais expiram após um curto período e não são usadas para nenhum outro propósito.
Para elegibilidade ZDR em todos os recursos, consulte API e retenção de dados.
Was this page helpful?
client = anthropic.Anthropic()
SYSTEM = "You are an AI assistant analyzing a large document. <document>...</document>"
# Turno 1: ativar com previous_message_id=None
r1 = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system=SYSTEM,
messages=[{"role": "user", "content": "Summarize section 1."}],
diagnostics={"previous_message_id": None},
betas=["cache-diagnosis-2026-04-07"],
)
# Turno 2: referenciar o id da resposta anterior
r2 = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system=SYSTEM,
messages=[
{"role": "user", "content": "Summarize section 1."},
{"role": "assistant", "content": r1.content},
{"role": "user", "content": "Now summarize section 2."},
],
diagnostics={"previous_message_id": r1.id},
betas=["cache-diagnosis-2026-04-07"],
)
diagnostics = r2.diagnostics
if diagnostics is None:
print("No divergence detected.")
elif diagnostics.cache_miss_reason is None:
print("Comparison still pending.")
else:
print(f"cache_miss_reason: {diagnostics.cache_miss_reason.type}")# Turno 2: fazer streaming, referenciando o id da resposta anterior
with client.beta.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system=SYSTEM,
messages=[
{"role": "user", "content": "Summarize section 1."},
{"role": "assistant", "content": r1.content},
{"role": "user", "content": "Now summarize section 2."},
],
diagnostics={"previous_message_id": r1.id},
betas=["cache-diagnosis-2026-04-07"],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print()
r2 = stream.get_final_message()
diagnostics = r2.diagnostics
if diagnostics is None:
print("No divergence detected.")
elif diagnostics.cache_miss_reason is None:
print("Comparison still pending.")
else:
print(f"cache_miss_reason: {diagnostics.cache_miss_reason.type}")messages_changed | O modelo, o sistema e as ferramentas coincidem, mas uma entrada anterior em messages foi alterada, reordenada ou removida em vez de apenas acrescentada. Normalmente o histórico da conversa foi truncado ou editado, ou turnos do assistente e blocos tool_result foram re-serializados de forma diferente no reenvio. | Trate o histórico como somente de acréscimo (append-only); ecoe o content do assistente e os resultados de ferramentas de volta literalmente. |
previous_message_not_found | Não existe impressão digital armazenada para o previous_message_id fornecido. Isso não é evidência de que sua requisição mudou. Normalmente a requisição anterior não carregava o cabeçalho beta, veio de um workspace diferente, ou passou tempo demais desde que foi enviada. | Envie o cabeçalho beta em cada turno e mantenha turnos consecutivos próximos no tempo. |
unavailable | Informações de diagnóstico não estavam disponíveis para esta requisição. Isso inclui o caso em que model, system e tools coincidem, mas outro parâmetro de requisição que afeta o prompt (tool_choice, thinking, context_management, output_config, output_format ou o conjunto de cabeçalhos anthropic-beta ativos) difere, e conversas muito longas em que a divergência está além do horizonte de comparação. Sua requisição foi processada normalmente. | Mantenha constantes os parâmetros de requisição que afetam o prompt durante toda a vida de uma conversa em cache. Se persistir, aplique as verificações manuais em Solução de problemas comuns na página de cache de prompt. |