Fitur ini memenuhi syarat untuk Zero Data Retention (ZDR) dengan retensi teknis terbatas. Lihat bagian Retensi data untuk detail tentang apa yang disimpan dan alasannya.
Prompt caching (caching prompt) memangkas latensi dan biaya secara signifikan, tetapi hanya jika bagian awal prompt Anda identik byte demi byte dengan permintaan terbaru. Alat yang diurutkan ulang, timestamp yang diinterpolasi ke dalam prompt sistem Anda, atau pengeditan pada pesan sebelumnya dapat secara diam-diam membatalkan cache. Tanpa diagnostik cache, satu-satunya sinyal adalah usage.cache_read_input_tokens yang turun menjadi nol, tanpa indikasi apa yang berubah.
Diagnostik cache menutup celah tersebut. Berikan id dari respons Anda sebelumnya, dan API akan membandingkan kedua permintaan tersebut dan memberi tahu Anda di mana keduanya mulai berbeda (model, prompt sistem, alat, atau riwayat pesan) sehingga Anda dapat memperbaiki akar penyebabnya alih-alih menebak-nebak.
Diagnostik cache masih dalam versi beta. Sertakan beta header cache-diagnosis-2026-04-07 dalam permintaan API Anda untuk menggunakan fitur ini.
Diagnostik cache saat ini hanya tersedia di Claude API. Fitur ini tidak didukung di Amazon Bedrock atau Vertex AI.
Ketika beta header disertakan, API menyimpan "fingerprint" (sidik jari) ringan dari setiap permintaan, yang dikunci berdasarkan id respons. Pada permintaan berikutnya, sertakan id tersebut sebagai diagnostics.previous_message_id. API akan membangun ulang fingerprint untuk permintaan baru, membandingkannya dengan yang tersimpan, dan melampirkan objek diagnostics ke respons yang menjelaskan titik divergensi pertama.
Perbandingan ini berkaitan dengan struktur permintaan, terlepas dari apakah cache benar-benar hit. Lihat Membaca diagnostik bersama usage untuk mengetahui cara menggabungkan hasil diagnostics dengan usage.cache_read_input_tokens.
Fingerprint hanya berisi hash dan estimasi jumlah token (tidak pernah berisi konten prompt mentah), disimpan untuk waktu terbatas, dibatasi cakupannya pada organisasi dan workspace Anda, dan tidak digunakan untuk tujuan lain apa pun.
Kirim beta header pada setiap giliran. Pada giliran pertama, berikan "previous_message_id": null untuk ikut serta tanpa pesan sebelumnya yang dapat dibandingkan. Pada giliran berikutnya, berikan id dari respons sebelumnya.
Dalam respons streaming, diagnostics muncul pada event message_start.
Event message_start membawa field diagnostics lengkap; lihat Format respons untuk nilai-nilai yang mungkin.
Dalam percakapan multi-giliran, teruskan id respons terbaru sebagai previous_message_id pada setiap giliran. Iterasi pertama memberikan null untuk ikut serta; setiap iterasi berikutnya memberikan id dari respons sebelumnya.
Field diagnostics pada Message respons memiliki empat kemungkinan status:
| Nilai | Arti |
|---|---|
| field tidak ada | Permintaan tidak menyertakan diagnostics, atau beta header tidak ada. |
null | previous_message_id bernilai null (giliran pertama, tidak ada yang dapat dibandingkan), atau perbandingan telah dijalankan dan tidak menemukan divergensi. |
{"cache_miss_reason": null} | Perbandingan masih berjalan ketika respons diserialisasi. Ini dapat terjadi ketika respons dimulai dengan sangat cepat. Anggap ini sebagai hasil yang tidak konklusif dan periksa giliran berikutnya. |
{"cache_miss_reason": {...}} | Sebuah cache_miss_reason dilampirkan. Untuk tipe *_changed, ini mengidentifikasi titik divergensi pertama; previous_message_not_found dan unavailable adalah kasus di mana tidak ada perbandingan yang dihasilkan. |
Ketika cache_miss_reason tidak null, bentuknya seperti ini:
{
"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 adalah discriminated union berdasarkan type. Respons hanya melaporkan divergensi paling awal, jadi perbaiki itu terlebih dahulu; divergensi selanjutnya mungkin tersembunyi di baliknya.
| Tipe | Artinya | Apa yang perlu diubah |
|---|---|---|
model_changed | model berbeda dari permintaan sebelumnya (misalnya, router, A/B test, atau fallback memilih model yang berbeda). Cache bersifat per-model. | Pertahankan model tetap konstan dalam percakapan yang di-cache. |
system_changed | Parameter system berbeda. Biasanya timestamp, request ID, atau nilai per-permintaan lainnya diinterpolasi ke dalam prompt sistem. | Jadikan prompt sistem sebagai konstanta yang stabil secara byte dan pindahkan data dinamis ke pesan user pertama setelah breakpoint cache Anda. |
tools_changed | Array tools berbeda: alat ditambahkan, dihapus, atau diurutkan ulang antar giliran, atau JSON input_schema alat diserialisasi secara non-deterministik. | Kirim daftar alat yang sama pada setiap giliran dalam urutan tetap dengan skema yang diserialisasi secara deterministik (misalnya, urutkan key). |
Keempat tipe *_changed juga membawa integer cache_missed_input_tokens: estimasi berapa banyak token input yang berada setelah titik divergensi, memberi Anda gambaran seberapa banyak prefiks yang dapat di-cache telah hilang. Nilai ini diturunkan dari panjang byte sebelum tokenisasi, jadi perlakukan sebagai indikator besaran, bukan angka penagihan. Nilai ini dapat berbeda dari (dan kadang-kadang melebihi) usage.input_tokens.
diagnostics menjawab "apakah permintaan saya berubah?" sementara usage.cache_read_input_tokens menjawab "apakah cache hit?". Menggabungkan keduanya memberi tahu Anda di mana harus mencari.
Matriks ini berlaku untuk giliran di mana Anda memberikan previous_message_id yang sebenarnya. Pada giliran pertama (previous_message_id: null), diagnostics selalu null dan cache_read_input_tokens biasanya nol karena cache sedang ditulis, bukan dibaca; tidak diperlukan pemecahan masalah. Matriks ini juga tidak berlaku ketika cache_miss_reason bernilai null (perbandingan masih tertunda; periksa giliran berikutnya) atau ketika type-nya adalah previous_message_not_found atau unavailable (tidak ada perbandingan yang dihasilkan).
| Hasil diagnostik | Token cache read | Interpretasi |
|---|---|---|
null | tinggi | Bekerja sesuai harapan. Prefiks Anda stabil dan cache hit. |
null | rendah atau nol | Permintaan Anda cocok tetapi entri cache tidak lagi tersedia. Pertimbangkan untuk mempersingkat jeda antar giliran atau menggunakan TTL cache 1 jam. |
cache_miss_reason adalah tipe *_changed | rendah atau nol | Bug Anda. Permintaan berubah; perbaiki penyebab yang ditunjukkan oleh type. |
cache_miss_reason adalah tipe *_changed | tinggi | Jarang terjadi. Perubahan terjadi di bagian akhir prompt tetapi breakpoint cache_control sebelumnya masih hit. Layak diperbaiki, tetapi dampaknya rendah. |
previous_message_id kedaluwarsa setelah periode singkat. Jalankan perbandingan diagnostik antara permintaan yang berdekatan waktunya.unavailable alih-alih lokasi yang tepat.unavailable, atau cache_miss_reason: null ketika perbandingan masih berjalan.Diagnostik cache memenuhi syarat ZDR (qualified). Anthropic tidak menyimpan teks mentah dari prompt Anda atau output Claude untuk fitur ini.
Fingerprint yang disimpan untuk setiap permintaan hanya terdiri dari hash kriptografis dan estimasi jumlah token, dikunci berdasarkan id respons dan dibatasi cakupannya pada organisasi dan workspace Anda. Fingerprint kedaluwarsa setelah periode singkat dan tidak digunakan untuk tujuan lain apa pun.
Untuk kelayakan ZDR di seluruh fitur, lihat API dan retensi data.
Was this page helpful?
client = anthropic.Anthropic()
SYSTEM = "You are an AI assistant analyzing a large document. <document>...</document>"
# Giliran 1: opt in dengan 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"],
)
# Giliran 2: rujuk id respons sebelumnya
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}")# Giliran 2: stream, merujuk ke id respons sebelumnya
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 | Model, system, dan tools semuanya cocok, tetapi entri sebelumnya dalam messages diubah, diurutkan ulang, atau dihapus alih-alih ditambahkan di akhir. Biasanya riwayat percakapan dipotong atau diedit, atau giliran assistant dan blok tool_result diserialisasi ulang secara berbeda saat dikirim kembali. | Perlakukan riwayat sebagai append-only; kirim kembali content assistant dan hasil alat secara verbatim. |
previous_message_not_found | Tidak ada fingerprint tersimpan untuk previous_message_id yang diberikan. Ini bukan bukti bahwa permintaan Anda berubah. Biasanya permintaan sebelumnya tidak membawa beta header, berasal dari workspace yang berbeda, atau terlalu banyak waktu telah berlalu sejak permintaan tersebut dikirim. | Kirim beta header pada setiap giliran dan jaga agar giliran berurutan berdekatan dalam waktu. |
unavailable | Informasi diagnostik tidak tersedia untuk permintaan ini. Ini mencakup kasus di mana model, system, dan tools cocok tetapi parameter permintaan lain yang memengaruhi prompt (tool_choice, thinking, context_management, output_config, output_format, atau kumpulan header anthropic-beta yang aktif) berbeda, serta percakapan yang sangat panjang di mana divergensi berada di luar cakrawala perbandingan. Permintaan Anda diproses secara normal. | Pertahankan parameter permintaan yang memengaruhi prompt tetap konstan selama masa hidup percakapan yang di-cache. Jika terus berlanjut, terapkan pemeriksaan manual di bawah Memecahkan masalah umum pada halaman caching prompt. |