Budget Token LLM untuk Tim Engineering Kecil: Ke Mana Larinya

Foto oleh Nicolas1981 via Wikimedia Commons (CC BY-SA 3.0)
Jumlah turn dikali besar context yang dibawa setiap turn, bukan banyaknya code yang dihasilkan. Percakapan penuh dikirim di setiap request, dan setiap tool call memicu request lain yang membawa hasilnya, sehingga session panjang yang hanya menulis satu baris bisa lebih mahal daripada session pendek yang menulis satu module. Contoh session di dokumentasi cost Anthropic menunjukkan 1.2k token input baru berbanding 940k token yang dibaca ulang dari cache.
Tidak, prompt caching membuat pengiriman ulang menjadi murah. Cache read ditagih 0.1x harga base input token, jadi prefix besar yang dibaca enam puluh kali tetap menjadi pengeluaran nyata. Cache write malah lebih mahal dari input token biasa, yaitu 1.25x untuk masa hidup lima menit dan 2x untuk masa hidup satu jam, sehingga setiap cache miss juga membawa premi.
Halaman cost Anthropic menyebut sekitar 13 dolar AS per developer per hari aktif dan 150 sampai 250 dolar per developer per bulan pada deployment enterprise, dengan 90 persen pengguna tetap di bawah 30 dolar per hari aktif. Perlakukan angka itu sebagai titik awal, bukan ramalan, karena sebarannya lebar dan bergantung pada pilihan model, ukuran codebase, serta kebiasaan bersession. Saran di dokumentasinya adalah menjalankan pilot kecil dan mengukur baseline sendiri sebelum rollout yang lebih luas.
Tidak, selama tugas itu punya grader yang murah. Edit mekanis, commit message, triage tahap pertama, dan transformasi massal input terstruktur semuanya bisa diperiksa dalam hitungan detik oleh compiler, test run, atau diff itu sendiri, jadi jawaban salah hanya berbiaya satu percobaan ulang. Default di dokumentasi pun begitu: Sonnet menangani sebagian besar tugas coding dengan baik dan Opus disimpan untuk keputusan arsitektur yang kompleks, sementara subagent punya field model sehingga routing-nya menjadi konfigurasi, bukan disiplin.
Itu lebih merupakan keputusan organisasi daripada keputusan teknis. Pada plan Teams dan Enterprise, penggunaan diambil dari alokasi per seat pada jendela lima jam berjalan dan jendela mingguan, sedangkan pada Console penggunaan ditagih per token ke organisasi melalui workspace dengan spend limit sendiri. Rate limit berlaku di level organisasi, jadi pooling lebih efisien ketika pemakaian bersifat bursty, tetapi itu juga berarti satu loop yang lepas kendali menjadi masalah semua orang kalau atribusi per pengguna belum disiapkan.

Foto oleh Nicolas1981 via Wikimedia Commons (CC BY-SA 3.0)
Ringkasan Utama
Budget agentic coding naik mengikuti context yang dikirim ulang per turn, bukan mengikuti code yang dihasilkan. Instruksi yang selalu dimuat dan conversation history dibayar di setiap request, tool result yang besar menempel permanen di prefix, dan hanya completion yang dibayar sekali. Prompt caching menagih cache read 0.1x harga base input, bukan nol, jadi ukur dulu sebelum optimasi.
Angka yang memulai semua ini adalah 22.748 — jumlah byte file CLAUDE.md di repository ini. Saya mengukurnya ketika mencoba memahami kenapa session yang terlihat paling murah ternyata bukan yang paling murah, dan hitungannya langsung terlihat. Byte sebanyak itu, ditambah file instruksi global 14.225 byte lagi, ikut terkirim di setiap request yang dibuat sebuah session, entah request itu memperbaiki typo tiga karakter atau melakukan refactor di sembilan file. Tidak ada bagian dari biaya itu yang proporsional dengan code yang keluar.
Tulisan ini soal ke mana budget agentic coding sebuah tim kecil sebenarnya pergi, dibedah dari empat hal yang mengonsumsinya. Intuisi bahwa biaya mengikuti jumlah code yang dihasilkan itu salah, dan salahnya justru mengubah apa yang perlu Anda lakukan. Semua mekanismenya diambil dari dokumentasi resmi Anthropic — halaman cost, referensi prompt caching, halaman subagent dan telemetry — dan semua angkanya dikutip dari sana atau saya ukur sendiri dengan wc di repository ini.
Satu baris output usage sudah memperlihatkan bentuk masalahnya. Contoh yang dicetak dokumentasi cost untuk satu session berbunyi 1.2k input, 5.3k output, 940.0k cache read, dan 50.0k cache write. Input yang benar-benar baru — yang diketik developer di session itu — hanya pembulatan dibanding 940.000 token context yang dibaca ulang dari cache. Unit biaya di session agentic adalah turn, dan besar setiap turn adalah sebesar apa pun percakapan itu pada saat turn tersebut jalan.
# The Session block the cost docs print for one session. Read the last two
# numbers first: they are the same conversation, sent again and again.
Total cost: $0.55
Total duration (API): 6m 20s
Total duration (wall): 6h 33m 10s
Usage by model:
claude-sonnet-4-6: 1.2k input, 5.3k output, 940.0k cache read, 50.0k cache write ($0.55)
# 1.2k of that is what the developer typed. 940k is context re-sent.
# Wall time 6h 33m against 6m 20s of API time is the other tell: this is one
# session left open all day, so every turn carried everything before it.Angka perencanaan di dokumentasi mengikuti bentuk itu: sekitar 13 dolar AS per developer per hari aktif dan 150 sampai 250 dolar per developer per bulan pada deployment enterprise, dengan 90 persen pengguna tetap di bawah 30 dolar per hari aktif. Bagian yang berguna dari sebaran itu justru ekornya. Satu dari sepuluh developer berada di atas garis 30 dolar, dan biasanya bukan orang yang paling banyak mengirim code — melainkan orang yang membiarkan satu session terbuka sepanjang hari, karena percakapan penuh dikirim di setiap request dan setiap tool call memicu request lain yang membawa hasilnya.
Pecah tagihannya menjadi empat konsumer dan titik ungkitnya langsung kelihatan, karena dua di antaranya dibayar sekali dan dua lainnya dibayar di setiap request. Perbedaan dua kelas itu menentukan tagihan bulanan jauh lebih besar daripada kebiasaan menulis prompt.
| Konsumer | Kapan dibayar | Apa yang menentukan ukurannya |
|---|---|---|
| Instruksi yang selalu dimuat | Setiap request, sejak session mulai | Jumlah baris CLAUDE.md, ditambah definisi tool dan server yang dimuat di awal |
| Conversation history | Setiap request, seluruhnya | Berapa lama sebelum Anda clear, dan berapa banyak isinya berupa tool output |
| Tool result | Sekali saat datang, lalu di setiap request setelahnya | Apakah isi file jatuh di main thread atau di dalam subagent |
| Completion | Sekali, dengan tarif output | Panjang jawaban plus thinking budget, yang ditagih sebagai output |
Baris ketiga yang biasanya mengejutkan orang. Sebuah grep yang mengembalikan empat puluh kutipan file bukan biaya sekali bayar. Kutipan itu kini bagian dari percakapan, jadi ikut dikirim ulang sepanjang sisa session — enam puluh turn berikutnya membawa bukti yang sudah selesai Anda pakai di turn keempat. Baris keempat punya jebakan sendiri: extended thinking ditagih sebagai output token, dan budget default-nya bisa mencapai puluhan ribu token per request tergantung modelnya.
Baris yang selalu dimuat adalah yang bisa Anda perbaiki sore ini, karena file itu milik Anda sendiri. CLAUDE.md dibaca ke context saat session dimulai, jadi setiap barisnya hadir di setiap request, terlepas dari apakah tugas yang sedang jalan berhubungan dengannya atau tidak. Target di dokumentasi adalah menjaga file itu di bawah 200 baris dengan hanya memuat hal esensial. Saya mengukur milik saya, bukan menebak.
# What every request in this repository carries before a file is opened.
wc -l -w -c CLAUDE.md ~/.claude/CLAUDE.md
# 398 2897 22748 CLAUDE.md
# 315 1865 14225 /Users/me/.claude/CLAUDE.md
# 713 4762 36973 total
# 36,973 characters is roughly 9,000 tokens at four characters per token.
# The docs ask for CLAUDE.md under 200 lines. The project file alone is 398,
# and the global file adds 315 that no project of mine can opt out of.
#
# 60 requests in a session x 9,000 tokens = 540,000 tokens of instructions,
# none of which are about the task in hand.Sekitar 9.000 token, di setiap request, sebelum satu file pun dibaca. Enam puluh request dalam satu session kerja berarti 540.000 token instruksi yang dikirim ulang, dan itulah cara jujur membaca sebuah cache hit — cache read ditagih 0.1x harga base input, bukan nol. Solusinya relokasi, bukan penghapusan. Skill hanya dimuat saat dipanggil, jadi memindahkan bagian instruksi yang melayani satu workflow spesifik ke sebuah skill membuatnya tetap tersedia sekaligus mengeluarkannya dari lantai biaya per request.
Relokasi hanya menguntungkan kalau tujuannya benar-benar kondisional. Memindahkan 200 baris ke skill yang toh dipanggil di setiap session hanya menggeser token itu ke bagian request yang lebih belakang, bukan mengeluarkannya, dan sekarang mengambilnya butuh satu tool call. Periksa dulu skill mana yang memang diam selama kerja normal sebelum Anda merasa menang karena CLAUDE.md jadi lebih pendek.
Prompt caching adalah alasan session agentic masih terjangkau, dan mekanismenya perlu disebut dengan tepat, karena versi yang kabur membuat tim berhenti peduli pada ukuran context. Cache read ditagih 0.1x harga base input. Cache write lima menit ditagih 1.25x harga itu dan write satu jam ditagih 2x. Hit menuntut segmen prompt identik 100 persen sampai dengan blok yang ditandai cache, dan cache mengikuti hierarki tools, lalu system, lalu messages, di mana perubahan di satu level membatalkan level itu dan semua level sesudahnya.
Ada dua konsekuensi untuk budget. Pertama, prefix harus stabil supaya ada nilainya, jadi apa pun yang menulis ulang bagian depan request — definisi tool yang diedit, satu server yang baru diaktifkan — membayar premi write lagi di turn berikutnya. Kedua, jeda adalah peristiwa biaya. Masa hidupnya dihitung dari awal request yang menulis atau membaca entry itu dan diperbarui gratis setiap kali dipakai, jadi session yang aktif tetap warm; begitu kedaluwarsa, pesan berikutnya memproses ulang seluruh context dengan tarif write. Pada API key atau cloud provider, masa hidup default-nya lima menit, dan makan siang lebih lama dari lima menit.
# /usage prints this once the session has had a response back. It is the
# cheapest instrumentation you will ever install: it is already there.
Prompt cache (main): 14 requests - 91% of input tokens from cache
- 2 misses (last 6m 10s ago, 310.2k tokens re-cached)
- warm (1h TTL, last activity 40s ago)
# "91% of input tokens from cache" is the number to watch per session.
# A miss is counted when a request re-processed more than 5% and at least
# 2,000 tokens it could have read from cache.
# "310.2k tokens re-cached" was billed at the 1.25x five-minute write rate,
# so two misses are not a rounding error on a 300k-token prefix.
Kerangka berpikir yang membuang uang adalah menganggap pilihan model sebagai tombol kualitas yang diturunkan setelah tagihan datang. Pertanyaan yang lebih baik: apakah tugas ini punya jawaban yang bisa diverifikasi dan bisa dicapai model yang lebih kecil? Kalau ya, model besar bukan sedang membelikan Anda akurasi — ia membelikan thinking budget panjang yang tidak dibutuhkan siapa pun. Dokumentasinya lugas soal default: Sonnet menangani sebagian besar tugas coding dengan baik dan lebih murah dari Opus, sementara Opus untuk keputusan arsitektur kompleks dan penalaran banyak langkah. Empat kelas tugas ini pantas dijalankan di model yang lebih murah.
Yang dimiliki keempatnya adalah grader yang murah. Kalau compiler, test suite, atau diff memberi tahu dalam hitungan detik apakah outputnya benar, jawaban yang salah hanya berbiaya satu percobaan ulang, bukan satu merge yang buruk — jadi biaya harapan model kecil memang lebih rendah, bukan cuma harga listnya. Subagent punya field model, jadi ini soal konfigurasi, bukan soal disiplin. Effort adalah tombol yang lain: turunkan dengan command effort untuk pekerjaan sederhana, dan pada model dengan thinking budget tetap set MAX_THINKING_TOKENS, sambil mengingat bahwa model adaptive-reasoning mengabaikan budget bukan-nol dan lebih menuntut level effort.
# .claude/agents/triage-search.md
# The model line saves money. The return contract saves more.
---
name: triage-search
description: Find which module owns a failing test. Returns a verdict, not excerpts.
tools: Read, Grep, Glob
model: haiku
---
Locate the file most likely to own the failing test named in the prompt.
Read whatever you need. None of it travels back with you.
Return exactly these three lines and nothing else:
file: one path
reason: one sentence, naming the symbol you matched on
next: the single command the main thread should run
# Wrong: "summarise what you found". A summary of nine files arrives as
# prose about nine files, and the main thread then re-sends that prose on
# every remaining turn -- which is most of what delegation was meant to avoid.Mendelegasikan pekerjaan bertele-tele ke subagent biasanya dijelaskan sebagai trik context window — kebisingannya tidak masuk ke percakapan utama. Versi budget dari argumen itu lebih kuat. Mengisolasi operasi bervolume tinggi membuat output panjangnya tinggal di context subagent sementara hanya summary yang relevan kembali, dan karena prefix main thread dikirim ulang di setiap turn berikutnya, penghematannya bukan selisih pada satu request. Penghematannya adalah selisih itu dikali semua turn yang tersisa di session.
Karena itu return contract lebih penting daripada tindakan mendelegasikannya. Subagent yang membaca sembilan file lalu menyerahkan satu putusan sudah memindahkan sembilan file keluar dari tagihan berulang; subagent yang menyerahkan kembali kutipan yang ia baca tidak memindahkan apa pun dan justru menambah satu inference untuk dibayar. Delegasi juga punya plafon. Agent team memunculkan instance terpisah untuk setiap anggota, masing-masing dengan context window sendiri, dan dokumentasi menaksirnya sekitar 7x token session biasa ketika anggotanya berjalan di plan mode. Satu subagent sempit dengan kontrak tiga baris dan satu tim berisi lima anggota bukan instrumen yang sama.
Tulis return contract di dalam definisi subagent sebagai bentuk output yang persis — tiga baris bernama, atau satu putusan — alih-alih meminta summary. Summary dari sembilan file cenderung datang sebagai prosa tentang sembilan file, dan itu justru sebagian besar dari yang tidak ingin Anda bayari di setiap turn berikutnya.
Tim sering bertanya apakah sebaiknya setiap developer punya budget sendiri atau dikumpulkan, dan mekanismenya hanya menjawab separuh. Pada plan Claude for Teams atau Enterprise, penggunaan setiap anggota diambil dari alokasi per seat yang reset pada jendela lima jam berjalan dan jendela mingguan, dan berbagi dengan Claude chat, jadi seat adalah unitnya mau tidak mau. Pada Console, penggunaan ditagih per token ke organisasi melalui workspace yang punya spend limit sendiri, jadi di sana pool yang menjadi unit dan angka per pengguna datang dari dashboard atau analytics API.
Yang menarik justru soal concurrency. Rekomendasi rate limit per pengguna di dokumentasi turun dari 200k sampai 300k token per menit pada tim satu sampai lima orang, menjadi 15k sampai 20k pada tim 100 sampai 500 orang, karena makin besar tim makin sedikit orang yang memakai tool itu di saat yang sama. Limit tersebut berlaku di level organisasi, bukan per orang, jadi satu individu bisa sementara memakai lebih dari porsi hitungannya saat rekan-rekannya sedang tidak aktif. Dari sisi efisiensi murni, itu argumen untuk pooling. Argumen sebaliknya bukan soal teknis: di dalam pool, satu loop yang lepas kendali jadi masalah semua orang, dan tidak ada laporan yang bisa menyebut loop milik siapa kalau atribusinya belum Anda siapkan. Kalau Anda membayar tarif kontrak, set managed setting modelPricing supaya angka yang dibaca developer cocok dengan invoice yang Anda terima.

Semua rekomendasi di atas bergantung pada konsumer mana yang dominan di session tim Anda, dan itu berbeda menurut codebase, tooling, dan kebiasaan. Menebak adalah bagian yang mahal: tim yang menghabiskan satu pagi merapikan CLAUDE.md padahal biayanya sebenarnya ada di tool result empat puluh file sudah bekerja keras dan tidak mengubah apa pun. Ukur dulu, pilih konsumer dengan porsi terbesar, lalu ubah satu hal.
Tiga angka sudah cukup untuk memulai. Token per session, dibaca sebagai sebaran dan bukan rata-rata — satu dari sepuluh pengguna di atas 30 dolar per hari aktif itu justru populasi yang perlu dibaca. Porsi input yang dilayani dari cache, yang sekarang dicetak langsung oleh command usage bersama jumlah miss dan status warm cache saat ini. Dan pembagian menurut query source, satu-satunya uji jujur apakah delegasi benar-benar memindahkan pekerjaan keluar dari main thread. Untuk sebuah tim, export OpenTelemetry adalah satu-satunya jalur yang mengalirkan metrik token dan biaya per pengguna ke stack Anda sendiri di semua provider, dan command insights menulis laporan lokal atas maksimal 200 session terakhir kalau Anda ingin gambaran kualitatifnya lebih dulu.
# Two variables and every session on this machine reports itself.
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=prometheus # scraped at localhost:9464/metrics
# claude_code.token.usage carries the two attributes a budget argument needs:
#
# type input | output | cacheRead | cacheCreation
# query_source main | subagent | auxiliary
#
# cacheRead over the sum of all four types is the share of input you are
# re-sending, per user, per model -- the same ratio /usage prints per session.
# query_source answers the question nobody can answer by feel: did delegation
# move work off the main thread, or did it just add a second bill?Aturan yang saya pakai sekarang sebelum mengubah apa pun: sebut konsumernya, lalu sebut apakah ia dibayar sekali atau di setiap turn. Hampir semua perubahan yang berhasil memindahkan token dari kelas kedua ke kelas pertama — instruksi ke skill, bukti ke subagent, tugas yang sudah selesai ke session baru. Hampir semua perubahan yang tidak berdampak adalah versi sedikit lebih kecil dari sesuatu yang tetap saya bayar enam puluh kali.