Prompt Caching Claude Code: Setel TTL, Tekan Tagihan

Setiap model punya prompt cache-nya sendiri. Berpindah berarti request berikutnya membaca seluruh riwayat percakapan tanpa satu pun cache hit, walaupun isinya identik. Effort level bekerja dengan cara sama — tiap level punya cache sendiri untuk model yang sama — jadi keduanya sebaiknya dipilih di awal sesi, bukan di tengahnya.
Keduanya menentukan masa berlaku cache untuk dua bucket request. promptCacheTtl mencakup percakapan utama; subagentPromptCacheTtl mencakup subagent, workflow, teammate in-process, fork, compaction, dan session title. Masing-masing hanya menerima 5m atau 1h, dan keduanya butuh Claude Code v2.1.242 atau lebih baru.
Subagent berada di luar bucket TTL percakapan utama, jadi secara default mereka dapat lima menit bahkan pada langganan Claude yang percakapan utamanya dapat satu jam. Setel subagentPromptCacheTtl ke 1h sebelum run multi-agent yang panjang; API menagih cache write satu jam dengan tarif lebih tinggi, jadi ini hanya sepadan bila ada jeda nyata antar giliran.
Tidak, tetapi editnya juga tidak berlaku. File CLAUDE.md di root proyek dan level user dibaca sekali saat sesi dimulai lalu ditahan di memori, jadi Claude terus bekerja dengan versi yang dimuat saat itu. Isi barunya baru dimuat pada /clear, /compact, atau restart berikutnya. Output style berperilaku sama.
Biasanya ya. Rewind memangkas percakapan kembali ke giliran sebelumnya, dan riwayat yang tersisa persis isi yang dipakai membangun cache-nya, jadi request berikutnya mengenai entri cache yang sudah ada. Compaction mengganti riwayat Anda dengan ringkasan, yang merupakan prefix baru dan harus di-cache dari nol.

Ringkasan Utama
Claude Code melakukan caching dengan mencocokkan awal tiap request secara persis, sehingga perubahan di mana pun pada prefix memaksa perhitungan ulang semua yang ada sesudahnya. Model dan effort level termasuk bagian cache key tanpa muncul di teks prompt. Ada dua bucket TTL — percakapan utama dan selainnya — diatur oleh promptCacheTtl dan subagentPromptCacheTtl, yang masing-masing hanya menerima 5m atau 1h.
Saya berpindah dari Sonnet ke Opus sekitar sembilan puluh menit setelah sesi berjalan karena masalahnya jadi lebih berat. Giliran berikutnya terasa jauh lebih lama dan lebih mahal daripada giliran mana pun sebelumnya, dan sepuluh menit saya habiskan dengan yakin bahwa modelnya lambat. Bukan. Setiap model punya cache-nya sendiri, dan saya baru saja membuang sembilan puluh menit prefix ter-cache begitu saja.
Prompt caching diurus untuk Anda dan sebagian besar tidak terlihat, dan justru itulah sebabnya momen ketika ia menagih Anda terasa membingungkan. Tulisan ini membahas cara kerja prefix-nya, dua input cache key yang sama sekali bukan teks prompt, aksi mana yang membatalkan dan mana yang aman, dua bucket TTL beserta cara memilihnya, dan cara mengukur apakah semua itu bekerja.
Model tidak mengingat apa pun antar-request, jadi Claude Code mengirim ulang semuanya tiap giliran: system prompt, konteks proyek, setiap pesan dan hasil tool sebelumnya, lalu pesan baru Anda. Caching adalah cara API menghindari memproses ulang bagian yang tidak berubah. Ia mencocokkan awal request — prefix-nya — dengan isi yang baru saja diproses, dan pencocokannya persis.
# Claude Code orders every request so the rarely-changing
# content comes first. The API matches the PREFIX exactly, so a
# change anywhere recomputes everything after it.
1. System prompt <- tool definitions, output style
changes on upgrade, or when the tool set changes
2. Project context <- CLAUDE.md, auto memory, unscoped rules
changes at session start, /clear or /compact
3. Conversation <- your messages, replies, tool results
changes every turn
# There is NO per-file or per-segment caching. A change in
# layer 1 invalidates 2 and 3 behind it.
#
# Two more things are part of the cache key without being in
# the prompt text at all:
# - the MODEL (each model has its own cache)
# - the EFFORT LEVEL (each level has its own cache per model)Konsekuensi yang sering luput adalah tidak adanya caching per file atau per segmen. Tidak ada yang di-cache satuan. Perubahan di lapisan system prompt membatalkan konteks proyek dan seluruh percakapan di belakangnya, karena semua itu kini berada setelah prefix yang berbeda. Itu pula sebabnya plan mode dan pemuatan skill terhitung murah: keduanya menambahkan instruksinya sebagai pesan percakapan, bukan mengubah apa pun yang lebih awal.
Masing-masing menyebabkan satu giliran yang lebih lambat dan lebih mahal, setelah itu prefix barunya ter-cache. Sebagian besar bisa dihindari di tengah tugas begitu Anda tahu ada harganya:
Melanjutkan sesi setelah pembaruan versi memproses ulang seluruh riwayat percakapan tanpa satu pun cache hit, karena riwayat itu kini berada di belakang system prompt yang berbeda. Biayanya sebanding dengan panjang percakapan tersebut, sehingga giliran pertama saat kembali ke sesi panjang yang di-resume bisa jadi request paling mahal yang Anda kirim. Auto-update tidak pernah diterapkan di tengah sesi, dan itulah sebabnya hal ini muncul sebagai giliran pertama yang lambat, bukan kejutan di tengah jalan.
Daftar ini lebih berguna, karena beberapa di antaranya tampak seperti seharusnya berbiaya padahal tidak:
Rewind adalah yang menarik. Ia memangkas percakapan kembali ke giliran sebelumnya, dan riwayat yang tersisa persis isi yang dipakai membangun cache pada titik itu, jadi request berikutnya mengenai entri cache yang lama. Setiap giliran sejak itu membaca melalui prefix tersebut, dan itu menjaganya tetap hangat. Kalau Anda sudah menempuh jalur yang ingin ditinggalkan sepenuhnya, rewind lebih murah daripada compact — compaction membangun prefix baru, rewind kembali ke yang sudah ada.
Claude Code menentukan TTL per request, dan setiap request masuk ke salah satu dari dua bucket tetap. API menawarkan TTL lima menit dan TTL satu jam yang bertahan melewati jeda lebih panjang tetapi menagih cache write dengan tarif lebih tinggi.
Apa yang didapat tiap bucket secara default:
| Bucket request | Langganan Claude, di dalam kuota paket | Usage credits, API key, atau cloud provider |
|---|---|---|
| Percakapan utama | Satu jam | Lima menit |
| Selain itu | Lima menit, kecuali helper yang dikendalikan server | Lima menit |
// Two controls, one per bucket. Each takes exactly 5m or 1h;
// any other value is ignored. Both need v2.1.242 or later.
{
"promptCacheTtl": "1h", // main conversation
"subagentPromptCacheTtl": "1h" // subagents, workflows, teammates,
// forks, compaction, session titles
}
# Precedence, first match wins:
#
# 1. FORCE_PROMPT_CACHING_5M=1 forces 5m on BOTH buckets
# 2. the bucket's env var CLAUDE_CODE_PROMPT_CACHE_TTL
# CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL
# 3. the bucket's setting the JSON above
# 4. ENABLE_PROMPT_CACHING_1H=1 requests 1h on BOTH buckets
# 5. the default for that bucket
#
# Use FORCE_PROMPT_CACHING_5M=1 to override a longer TTL that
# managed settings imposed, or while measuring the difference.Baris kedua itulah yang menjebak orang. Subagent, workflow, teammate in-process, fork, compaction, dan session title semuanya di luar percakapan utama, jadi mereka hanya dapat lima menit bahkan pada langganan berbayar. Pada run multi-agent dengan jeda panjang antar giliran, itu selisih antara membaca prefix ter-cache dan memprosesnya ulang — setel TTL subagent ke satu jam sebelum fan-out panjang, dan terima tarif write yang lebih tinggi.
Di Claude Code, cache secara efektif dibatasi pada satu mesin dan satu direktori. System prompt menyertakan working directory, platform, shell, versi OS, dan path auto memory, jadi dua sesi di direktori berbeda membangun prefix berbeda dan sama sekali tidak saling mengena. Itu termasuk worktree dari repository yang sama, karena tiap worktree punya working directory sendiri — sebuah biaya nyata dari pola parallel worktree yang tidak pernah disebut orang saat merekomendasikannya.
Sesi yang berjalan paralel di direktori yang sama memang membangun prefix yang cocok dan saling membaca cache. Sesi berurutan hanya berbagi prefix bila snapshot git status saat startup sama, karena system prompt juga merekam branch dan commit terakhir. Cache API di bawahnya lebih luas — terisolasi antarorganisasi, dan pada sebagian provider antarworkspace — sehingga dua request mana pun dengan model dan prefix sama di dalam batas itu membaca cache yang sama.
Dua hitungan token pada setiap respons API memberi tahu apakah semua di atas bekerja. Perhatikan rasionya, bukan angka mutlaknya: rasio read terhadap creation yang tinggi berarti caching bekerja, dan creation yang tetap tinggi giliran demi giliran berarti ada sesuatu di prefix Anda yang bergerak.
# The API reports two counts on every response. A statusline
# script reading current_usage is the cheapest way to watch them.
cache_creation_input_tokens # written this turn, billed at the WRITE rate
cache_read_input_tokens # served from cache, ~10% of standard input
# A high read-to-creation ratio means caching is working.
# Creation staying high turn after turn means something in your
# prefix is moving — start with the tool layer.
# Across a team, the OpenTelemetry exporter reports both per
# user and per session, so you can find the one developer whose
# gateway silently stripped the cache markers.Di mana cache itu tinggal bergantung pada cara Anda melakukan autentikasi, dan di sinilah setup gateway jadi senyap. Claude Code tetap memasang cache breakpoint milik percakapan itu sendiri, jadi gateway yang meneruskannya tetap meng-cache percakapan Anda — tetapi sebelum v2.1.237, gateway yang diam-diam menghapus penanda pada blok sistem di tengah percakapan membuat seluruh percakapan ditagih sebagai input tanpa cache di tiap giliran. Kalau Anda di balik gateway dan angkanya terlihat aneh, periksa versinya dulu sebelum memeriksa gateway-nya.
Semua di atas mengerucut jadi daftar pendek:
Alasan mempelajari semua ini bukan tagihannya, melainkan diagnosisnya. Begitu Anda tahu bahwa caching adalah satu pencocokan prefix yang persis dan bahwa model serta effort ada di dalam key-nya, giliran lambat yang tak terjelaskan berhenti menjadi misteri — hampir selalu itu sesuatu yang Anda ubah, dan daftar hal yang bisa mengubahnya pendek. Selebihnya, sesi Anda boleh serumit yang memang dibutuhkan.
Sumber & bacaan lanjutan