Konteks alat dan cache prompt
Ada dua hal yang berlaku untuk setiap permintaan yang dibuat harness bawaan: definisi alat adalah biaya tetap terbesar di dalamnya, dan hampir tidak ada satu pun yang akan dipakai. Halaman ini menjelaskan apa yang dilakukan Control Center untuk mengatasinya, dan mengapa jawabannya bukan sekadar “kirim lebih sedikit alat”.
Masalahnya adalah perhatian, bukan byte
Bagian berjudul “Masalahnya adalah perhatian, bukan byte”Control Center mendaftarkan sekitar 126 alat. Jika dikirim seluruhnya, definisinya memakan biaya sekitar 23.000 token pada setiap permintaan — biaya yang tidak dapat disentuh oleh pemadatan apa pun, karena definisi alat berjalan di bagian permintaan yang terpisah dari percakapan.
Tagihan token adalah keluhan yang paling jelas, dan dengan cache prompt, tagihan itu juga yang lebih kecil. Biaya sesungguhnya adalah akurasi pemilihan. Evaluasi publik tentang pemanggilan alat sepakat bahwa model memilih alat yang tepat secara andal hingga sekitar 30–50 alat di dalam konteks, lalu makin memburuk setelah itu. Penyebab yang disebutkan bukanlah jumlah token, melainkan tumpang tindih semantik: begitu sebuah katalog memuat beberapa alat yang deskripsinya mirip, model memilih di antara yang tampak serupa alih-alih mengingat kembali sebuah kemampuan.
Dengan 126 alat, agen sudah jauh melewati rentang itu pada setiap giliran — termasuk banyak giliran yang hanya perlu membaca sebuah file.
Permukaan dua tingkat
Bagian berjudul “Permukaan dua tingkat”Karena itu sebuah run diperlihatkan dua hal:
- himpunan residen — sekitar dua lusin alat, dikirim dengan skema lengkap pada setiap permintaan;
- sebuah indeks nama untuk semua sisanya, dikelompokkan di bawah judul seperti “Tickets and projects” atau “Memory and knowledge”, dengan biaya beberapa ratus token untuk seluruh katalog.
Diukur pada katalog saat ini, hal itu membawa blok alat dari ~23,1 ribu token menjadi ~5,0 ribu, sekitar 78% lebih kecil, dan menempatkan himpunan yang selalu terlihat di dalam rentang yang pemilihannya andal.
Himpunan residen adalah alat-alat yang dipakai sebuah run pada sebagian besar run: kosakata file dan shell (read, write, edit, search, bash, …), alat penemuan, daftar periksa tugas, pencarian memori, dan kata kerja apa pun yang harus dipanggil mode saat ini untuk menghasilkan luarannya. Kata kerja luaran milik sebuah mode selalu residen — sebuah run tidak boleh sampai harus mencari panggilan tunggal yang menghasilkan luarannya.
Ditunda bukan berarti tidak tersedia
Bagian berjudul “Ditunda bukan berarti tidak tersedia”Inilah bagian yang membuat rancangan ini aman, bukan sekadar murah. Alat yang ditunda dapat dipanggil sejak giliran pertama. Hanya skemanya yang ditahan.
Agen melihat namanya di dalam prompt. Jika agen memanggil nama itu secara langsung, harness memuat skemanya dan menjalankan alat tersebut pada langkah yang sama — tanpa galat, tanpa perjalanan bolak-balik. Model tidak perlu tahu bahwa alat itu pernah “dibongkar”.
Ketika agen tahu tugasnya tetapi tidak tahu namanya, search_tools menerima deskripsi dalam bahasa sehari-hari (“tetapkan tiket kepada seseorang”), memberi peringkat pada seluruh permukaan run, dan mengembalikan kecocokan dengan skemanya yang sudah dimuat, sehingga giliran berikutnya bisa langsung memanggilnya. Jika pencarian tidak menemukan apa pun, ia mengatakannya secara terus terang dan menyarankan kata kunci lain atau pencarian yang lebih luas — sengaja demikian, karena agen yang membaca hasil pencarian kosong sebagai “kemampuan ini tidak ada” akan mengarang pengganti alih-alih mencari lagi.
search_tools hanya ada di harness bawaan. Klien MCP eksternal sebagai gantinya memiliki search_tool_bm25, yang memberi peringkat pada indeks yang sama tetapi hanya mendeskripsikan kecocokan — klien tersebut sudah menerima semua skema dari tools/list, jadi tidak ada yang perlu dimuat.
Apa yang tidak pernah dilakukan oleh penundaan
Bagian berjudul “Apa yang tidak pernah dilakukan oleh penundaan”Penundaan diterapkan setelah filter alat milik mode, tidak pernah sebagai penggantinya. Penundaan menyembunyikan sebuah skema; ia tidak dapat memunculkan alat yang ditolak oleh mode. Alat yang diaktifkan tetap melewati prompt persetujuan dan pagar pengaman tindakan persis seperti alat residen, dan sebuah alat tidak dapat memuat nama yang sejak awal tidak ada di permukaan run.
Permukaan MCP yang dilihat klien eksternal tidak terpengaruh. tools/list tetap mengembalikan katalog lengkap. Upaya sebelumnya untuk memangkasnya langsung merusak agen: klien MCP memvalidasi nama alat terhadap daftar cache-nya sendiri dan menolak apa pun yang tidak terdaftar tanpa pernah bertanya ke server, sehingga alat yang “tersembunyi tetapi dapat dipanggil” menjadi tidak terjangkau. Penundaan berada di dalam harness, tempat memuat alat di tengah run adalah hal yang benar-benar bisa dilakukan harness.
Mematikannya
Bagian berjudul “Mematikannya”--tool-deferral=off (atau CC_SERVER_TOOL_DEFERRAL=off) membuat setiap alat yang diloloskan menjadi residen kembali, sehingga menghasilkan permintaan yang persis sama dengan yang dibuat server sebelum penundaan ada. Lihat referensi CLI cc_server.
Cache prompt
Bagian berjudul “Cache prompt”Beban kerja agen tidak seimbang: mereka mengirim prompt yang sangat besar dan menerima jawaban kecil, giliran demi giliran, dengan awalan yang sama setiap kali. Penyedia menyimpan awalan itu di cache, dan pembacaan cache berbiaya sekitar sepersepuluh dari pembacaan yang baru. Tingkat keberhasilan cache karena itu menjadi properti utama harness, bukan sekadar pengoptimalan — dan di Anthropic hal itu juga menambah throughput, karena token yang di-cache tidak dihitung terhadap batas input per menit.
Cache bekerja berdasarkan kecocokan awalan yang persis, yang menghasilkan satu aturan yang mengatur semuanya.
Jangan pernah menulis ulang apa yang sudah dikirim
Bagian berjudul “Jangan pernah menulis ulang apa yang sudah dikirim”Setiap byte yang berubah membatalkan cache sejak titik itu dan seterusnya. Karena itu harness hanya menambahkan: pesan baru di akhir, dan skema alat yang baru diaktifkan setelah blok alat yang di-cache, bukan digabungkan ke dalamnya. Urutan itulah alasan aktivasi menjadi murah — awalan yang di-cache tetap identik dan run hanya membayar skema yang baru dimuatnya.
Loop tersebut juga memangkas output alat yang sudah usang dari giliran-giliran lama untuk mengambil kembali konteks. Ia menunggu sampai ada cukup banyak yang bisa diambil kembali sehingga penulisan ulang itu layak, jadi pemangkasan adalah penulisan ulang mendalam yang jarang, bukan kegagalan cache yang terus-menerus.
Di mana breakpoint ditempatkan
Bagian berjudul “Di mana breakpoint ditempatkan”Penyedia mengizinkan jumlah penanda cache yang terbatas, dan Control Center membelanjakannya dengan sengaja:
| Penanda | Mencakup | Masa berlaku |
|---|---|---|
| Alat residen terakhir | Blok alat | 1 jam |
| Blok sistem terakhir | Alat + prompt sistem | 1 jam |
| Ekor giliran sebelumnya | Riwayat hingga permintaan terakhir | 5 menit |
| Ekor giliran saat ini | Riwayat lengkap | 5 menit |
Dua penanda terakhir membentuk pasangan bergulir, dan alasan keberadaan pasangan itu halus: pencarian cache menelusuri ke belakang sejumlah blok yang terbatas untuk menemukan sesuatu yang disimpan permintaan sebelumnya. Satu giliran yang menjalankan banyak alat secara paralel dapat menghasilkan lebih banyak blok daripada jendela itu, dan pada titik itu salah satu penanda ekor diam-diam meleset sehingga permintaan membayar harga penuh tanpa ada apa pun di respons yang memberitahukannya. Menandai titik persis tempat permintaan sebelumnya berhenti membuat hit menjadi struktural, bukan perlombaan.
Awalan alat-dan-sistem mendapat masa berlaku panjang karena ia konstan sepanjang run, dibagi oleh setiap run dan subagen dengan bentuk yang sama, dan karena jamnya mulai berjalan saat sebuah permintaan dimulai — giliran yang melakukan streaming selama beberapa menit sudah menghabiskan sebagian besar jendela pendek sebelum permintaan berikutnya terbentuk.
Subagen berbagi satu awalan
Bagian berjudul “Subagen berbagi satu awalan”Subagen dengan tipe yang sama menghasilkan awalan prompt yang identik byte demi byte, jadi mereka seharusnya membaca satu entri cache alih-alih masing-masing menulis entrinya sendiri. Namun sebuah entri baru bisa dibaca setelah permintaan yang menulisnya mulai merespons, sehingga fan-out yang diluncurkan sekaligus membuat setiap anaknya membayar biaya lebih untuk awalan yang mereka bagi bersama.
Harness membiarkan anak pertama dengan bentuk tertentu mulai, lalu melepaskan saudara-saudaranya begitu ia mulai melakukan streaming. Penantiannya terbatas: anak pertama yang lambat menghabiskan satu hit cache, tidak pernah menggagalkan fan-out itu sendiri. Karena alasan yang sama, setiap subagen mendapat himpunan alat residen yang sama terlepas dari profilnya — memvariasikannya per profil hanya akan memecah awalan bersama tanpa manfaat, karena profil sudah menentukan apa yang boleh dipanggil oleh si anak.
Menyaksikannya bekerja
Bagian berjudul “Menyaksikannya bekerja”Kedua bagiannya dapat diamati, bukan sekadar diasumsikan:
- Penjelajah konteks pada sebuah percakapan melaporkan alat residen, indeks yang ditunda dan berapa biaya yang akan ditimbulkan oleh setiap skema yang ditahan, dibangun dari jalur kode yang sama dengan yang digunakan run sungguhan.
- Setiap run mencatat alat tertunda mana yang dimuatnya dan apa yang memicunya, sehingga pencarian yang tidak menemukan apa pun terlihat sebagai kegagalan pengambilan kembali alih-alih menghilang ke dalam agen yang diam-diam melakukan sesuatu yang mirip.
- Observabilitas melaporkan Tingkat cache sebagai pembacaan cache dibagi seluruh token prompt yang diproses, termasuk penulisan cache — run yang terus membangun ulang awalannya memperoleh skor rendah, bukan skor seperti run yang tidak pernah membutuhkan cache.