Pahami penggunaan token
TypeScript dan Python SDK mengekspos data penggunaan yang sama dengan nama field yang berbeda:- TypeScript menyediakan breakdown token per-step pada setiap pesan asisten (
message.message.id,message.message.usage), biaya per-model melaluimodelUsagepada pesan hasil, dan total kumulatif pada pesan hasil. - Python menyediakan breakdown token per-step pada setiap pesan asisten sebagai
message.usagedanmessage.message_id, biaya per-model melaluimodel_usagepada pesan hasil, dan total kumulatif pada pesan hasil sebagaitotal_cost_usd.
query()call: satu invokasi dari fungsiquery()SDK. Satu panggilan dapat melibatkan beberapa langkah: Claude merespons, menggunakan tools, mendapatkan hasil, dan merespons lagi. Setiap panggilan menghasilkan satu pesanresultdi akhir, kecuali dalam mode input streaming, di mana satu panggilanquery()membawa beberapa giliran pengguna dan setiap giliran memancarkan pesanresultmiliknya sendiri.- Step: satu siklus request/response dalam panggilan
query(). Setiap langkah menghasilkan pesan asisten dengan penggunaan token. - Session: serangkaian panggilan
query()yang terhubung oleh ID sesi melalui opsiresume. Hasil panggilan yang dilanjutkan melaporkan pengeluaran seluruh sesi, bukan hanya panggilan itu sendiri. Lihat Accumulate costs across multiple calls untuk cara total dibawa ke depan.
query(), dengan penggunaan token dilaporkan pada setiap langkah dan perkiraan kumulatif di akhir:
1
Setiap langkah menghasilkan pesan asisten
Ketika Claude merespons, ia mengirimkan satu atau lebih pesan asisten. Di TypeScript, setiap pesan asisten berisi
BetaMessage bersarang (diakses melalui message.message) dengan id dan objek usage dengan hitungan token (input_tokens, output_tokens). Di Python, dataclass AssistantMessage mengekspos data yang sama secara langsung melalui message.usage dan message.message_id. Ketika Claude menggunakan beberapa tools dalam satu giliran, semua pesan dalam giliran itu berbagi ID yang sama, jadi deduplikasi berdasarkan ID untuk menghindari penghitungan ganda.2
Pesan hasil memberikan perkiraan kumulatif
Ketika panggilan
query() selesai, SDK memancarkan pesan hasil dengan total_cost_usd dan usage kumulatif, diketik sebagai SDKResultMessage di TypeScript dan ResultMessage di Python. Jika Anda hanya membutuhkan total perkiraan, Anda dapat mengabaikan penggunaan per-step dan membaca nilai tunggal ini.Jika Anda membuat beberapa panggilan query() independen, setiap hasil hanya mencerminkan biaya panggilan individual itu. Panggilan yang melanjutkan sesi juga menghitung pengeluaran awal sesi.Dalam mode input streaming, setiap giliran memancarkan pesan hasil miliknya sendiri. Lihat Track costs in streaming input mode untuk cara membaca total panggilan dalam mode itu.Lacak biaya dalam mode input streaming
Dalam mode input streaming, satu panggilanquery() membawa beberapa giliran pengguna dan setiap giliran memancarkan pesan hasilnya sendiri. Bidang hasil berbeda dalam cakupan:
usage: mencakup hanya giliran itu, dan di dalamnya hanya loop agen utama, bukan subagen apa pun yang dijalankannya.total_cost_usddanmodelUsage, ataumodel_usagedalam Python: membawa total berjalan untuk seluruh panggilan sejauh ini, ditambah pengeluaran apa pun yang dipulihkan ketika panggilan melanjutkan sesi.
/clear, /reset, atau /new, baca hasil terbaru untuk total panggilan daripada menjumlahkan hasil.
Total berjalan dimulai ulang setiap kali aplikasi Anda mengirim salah satu dari tiga perintah itu, dan di dalam panggilan query() tidak ada yang lain yang mengatur ulang mereka. Tiga hasil penting untuk akuntansi Anda:
- Hasil giliran
/clearitu sendiri: mencakup hanya apa yang telah berjalan sejak pengaturan ulang, dan membawasession_idbaru. - Setiap hasil kemudian: terus menghitung dari pengaturan ulang itu.
- Hasil terakhir sebelum setiap
/clear: menyimpan total untuk giliran sejak pengaturan ulang sebelumnya.
/clear ke hasil akhir panggilan. Setiap hasil lainnya, termasuk hasil giliran /clear itu sendiri, digantikan oleh hasil yang lebih baru.
Dalam TypeScript, SDK juga memancarkan SDKConversationResetMessage pada setiap pengaturan ulang, sehingga Anda dapat mendeteksi pengaturan ulang dari aliran. Dalam Python, SDK juga memancarkan ConversationResetMessage. Sebelum Python SDK v0.2.137, iterator Python menghilangkan pesan itu, jadi pada versi tersebut hitung pengaturan ulang sendiri dari giliran /clear yang dikirim aplikasi Anda.
maxBudgetUsd (TypeScript) atau max_budget_usd (Python) hanya menghitung pengeluaran panggilan itu sendiri: total yang dipulihkan dari sesi yang dilanjutkan tidak dihitung terhadapnya, dan /clear memulai anggaran ulang.
Dapatkan total biaya dari sebuah query
Pesan hasil, yang diketik sebagaiSDKResultMessage di TypeScript dan ResultMessage di Python, menandai akhir dari loop agen untuk panggilan query(). Ini mencakup total_cost_usd, biaya perkiraan kumulatif di semua langkah dalam panggilan tersebut. Sebuah panggilan yang melanjutkan sesi juga menghitung pengeluaran awal sesi. Dua peringatan berlaku ketika Anda membaca nilainya:
- Di Python bidang ini diketik sebagai opsional, jadi periksa bahwa itu bukan
Nonesebelum Anda membacanya. - Hasil sukses dan kesalahan keduanya membawanya, meskipun hasil akhir dari kerusakan sesi mungkin membawanya dengan nilai nol.
modelUsage, atau model_usage di Python, untuk akuntansi token seluruh pohon; bidang usage kurang menghitung segera setelah nesting terjadi.
Dalam mode input pesan tunggal, ketika subagen latar belakang masih berjalan di akhir giliran terakhir, Claude Code menunggu mereka, hingga batas yang dijelaskan dalam tugas latar belakang saat keluar, sebelum memancarkan hasilnya.
total_cost_usd, duration_api_ms, dan modelUsage hasil, atau model_usage di Python, mencakup pekerjaan yang dilakukan selama penantian tersebut.
Contoh berikut mengulangi aliran pesan dari panggilan query() dan mencetak total biaya ketika pesan result tiba:
total_cost_usd, atur batas kedalaman, konkurensi, dan pengeluaran pada query.
Lacak penggunaan per-langkah dan per-model
Contoh-contoh di bagian ini menggunakan nama field TypeScript. Di Python, field yang setara adalahAssistantMessage.usage dan AssistantMessage.message_id untuk penggunaan per-langkah, dan ResultMessage.model_usage untuk rincian per-model.
Lacak penggunaan per-langkah
Setiap pesan asisten berisiBetaMessage bersarang (diakses melalui message.message) dengan objek id dan usage yang berisi hitungan token. Ketika Claude menggunakan tools secara paralel, beberapa pesan berbagi id yang sama dengan data penggunaan yang identik. Lacak ID mana yang sudah Anda hitung dan lewati duplikat untuk menghindari total yang membengkak.
Contoh berikut mengakumulasi token input di semua langkah, menghitung setiap ID pesan loop utama yang unik hanya sekali dan melewati pesan subagen, serta membaca total output dari pesan hasil, yang mencakup loop utama:
Rincian penggunaan per model
Pesan hasil mencakupmodelUsage, peta nama model ke hitungan token per-model dan biaya. Ini berguna ketika Anda menjalankan beberapa model (misalnya, Haiku untuk subagen dan Opus untuk agen utama) dan ingin melihat ke mana token pergi.
Setiap costBasis entri mengatakan tabel harga mana yang menentukan harga permintaan terbaru model itu: list untuk harga daftar, managed untuk tabel modelPricing, atau unknown ketika tidak ada yang cocok dengan ID model. Field memerlukan Claude Code v2.1.246 atau lebih baru.
Contoh berikut menjalankan kueri dan mencetak rincian biaya dan token untuk setiap model yang digunakan:
Akumulasi biaya di seluruh beberapa panggilan
Setiap panggilanquery() mengembalikan total_cost_usd pada hasilnya. Cara Anda menggabungkan nilainya tergantung pada apakah panggilan berbagi sesi:
- Panggilan independen, tanpa opsi
resumeataucontinue: setiap hasil hanya mencakup panggilan miliknya sendiri, jadi tambahkan totalnya sendiri, seperti yang dilakukan contoh di bawah ini. - Panggilan yang melanjutkan sesi yang sama: Claude Code menyimpan total sesi ke transcript ketika proses keluar secara normal dan memulihkannya ketika panggilan nanti melanjutkan atau memisahkan sesi. Setiap hasil sudah mencakup pengeluaran awal sesi. Baca hasil terbaru untuk total sesi; menjumlahkan hasil menghitung dua kali pengeluaran yang dipulihkan. Sebelum v2.1.277, sesi yang Anda lanjutkan melalui SDK atau
claude -pmemulai totalnya di nol, jadi hasil setiap panggilan hanya mencakup panggilan itu.
query() secara berurutan, menambahkan total_cost_usd setiap panggilan ke total yang berjalan, dan mencetak biaya per-panggilan dan gabungan:
Menangani kesalahan, caching, dan jumlah token output
Untuk pelacakan biaya yang akurat, pertimbangkan jumlah output placeholder pada pesan asisten, token yang dikonsumsi percakapan yang gagal, dan harga token cache.Baca token output dari pesan hasil
Claude Code membangun setiap pesan asisten dari penggunaan yang dilaporkan API ketika respons dimulai, jadioutput_tokens pesan hanya merupakan jumlah yang dilaporkan API pada message_start, sebelum respons dihasilkan. Satu respons API dapat menghasilkan beberapa pesan asisten, dan setiap satu membawa placeholder yang sama.
API melaporkan jumlah output nyata di akhir respons, dan Claude Code menambahkannya ke pesan hasil. Baca token output dari usage hasil, atau dari modelUsage untuk rincian per-model.
Untuk menonton jumlah output respons tumbuh saat streaming, atur includePartialMessages, atau include_partial_messages di Python, dan baca usage dari setiap acara stream message_delta, diketik sebagai SDKPartialAssistantMessage di TypeScript dan StreamEvent di Python.
Lacak biaya pada percakapan yang gagal
Pesan hasil kesuksesan dan kesalahan keduanya mencakupusage dan total_cost_usd; di Python kedua bidang diketik sebagai opsional, jadi periksa bahwa mereka bukan None sebelum Anda membacanya.
Jika percakapan gagal di tengah jalan, Anda masih mengonsumsi token hingga titik kegagalan. Baca data biaya dari setiap pesan hasil, terlepas dari apakah subtype-nya adalah success atau salah satu subtipe kesalahan. Pada beberapa hasil kesalahan, usage melaporkan lebih sedikit daripada yang dihabiskan panggilan:
error_during_executionsetelah kerusakan sesi: setiap bidang biaya dapat dinolkan.error_max_budget_usd:usagemenghilangkan respons yang melampaui anggaran, sementaratotal_cost_usddanmodelUsagemenyertakannya.
total_cost_usd atau modelUsage daripada usage.
Pulihkan total setelah kerusakan sesi
Ketika proses Claude Code mogok, ia mengeluarkan hasilerror_during_execution akhir dan keluar, dalam mode input single-shot dan streaming sama-sama. Hasil itu mungkin membawa usage, total_cost_usd, dan modelUsage yang dinolkan, jadi pulihkan total panggilan dari apa yang tiba sebelumnya. Langkah 1 memulihkan total penuh kapan pun hasil sebelumnya ada; fallback di langkah 2 memulihkan hanya token input dan cache loop utama.
- Gunakan hasil giliran sebelum kerusakan. Dalam mode input streaming, ia menyimpan total berjalan yang dijelaskan dalam Track costs in streaming input mode. Lanjutkan ke langkah 2 sebagai gantinya ketika hasil itu tidak dapat membantu Anda:
- Panggilan adalah single-shot, jadi tidak ada hasil sebelumnya.
- Kerusakan terjadi pada giliran pertama.
- Giliran sebelum kerusakan adalah
/clearitu sendiri, jadi hasilnya hanya mencakup reset.
- Jumlahkan
usagepada pesan asisten sebagai gantinya, menghitung setiap respons API sekali, seperti yang dilakukan contoh Track per-step usage. Dalam mode single-shot, jumlahkan semuanya; dalam mode input streaming, jumlahkan yang tiba setelah hasil terakhir. Ini memberi Anda token input dan cache loop utama. Penggunaan subagent tidak dapat dipulihkan dengan cara ini, begitu juga token output atau biaya USD, karena per-stepoutput_tokensadalah placeholder.
Lacak token cache
Agent SDK secara otomatis menggunakan prompt caching untuk mengurangi biaya pada konten berulang. Anda tidak perlu mengonfigurasi caching sendiri. Objek penggunaan mencakup dua bidang tambahan untuk pelacakan cache:cache_creation_input_tokens: token yang digunakan untuk membuat entri cache baru (dikenakan biaya pada tingkat lebih tinggi daripada token input standar).cache_read_input_tokens: token yang dibaca dari entri cache yang ada (dikenakan biaya pada tingkat berkurang).
input_tokens untuk memahami penghematan caching. Di TypeScript, bidang-bidang ini diketik pada objek Usage. Di Python, mereka muncul sebagai kunci dalam dict ResultMessage.usage (misalnya, message.usage.get("cache_read_input_tokens", 0)).
Perpanjang TTL cache prompt ke satu jam
Giliran Anda sendiri jatuh dalam bucket TTL percakapan utama, bersama dengan pembantu yang Claude Code jalankan inline dengan mereka. Permintaan yang Claude Code buat di luar percakapan itu, seperti subagents, memiliki kontrol TTL terpisah. Entri cache untuk giliran Anda sendiri menggunakan TTL 5 menit secara default ketika Anda mengautentikasi dengan kunci API atau menjalankan pada Amazon Bedrock, Agent Platform Google Cloud, Microsoft Foundry, atau Claude Platform on AWS. Jika beban kerja Anda menjalankan banyak sesi pendek terhadap prompt sistem dan konteks yang sama dengan celah lebih lama dari 5 menit di antara mereka, cache kedaluwarsa di antara sesi dan setiap sesi baru membayar harga input penuh. Untuk meminta TTL 1 jam pada penulisan cache, atur variabel lingkunganENABLE_PROMPT_CACHING_1H. Anda dapat mengekspornya di lingkungan shell atau container Anda, atau meneruskannya melalui options.env.
Contoh berikut mengaktifkan TTL 1 jam untuk agen yang berjalan di Amazon Bedrock. Karena menetapkan CLAUDE_CODE_USE_BEDROCK, itu memerlukan kredensial AWS yang berfungsi untuk Amazon Bedrock; tanpanya kueri gagal.
ENABLE_PROMPT_CACHING_1H meminta TTL 1 jam pada setiap permintaan di kedua bucket. Untuk memilih TTL untuk setiap bucket secara terpisah, gunakan kontrol ini sebagai gantinya. Masing-masing mengambil 5m atau 1h dan mengambil prioritas atas ENABLE_PROMPT_CACHING_1H:
- Percakapan utama: variabel lingkungan
CLAUDE_CODE_PROMPT_CACHE_TTL, atau pengaturanpromptCacheTtl - Segalanya: variabel lingkungan
CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL, atau pengaturansubagentPromptCacheTtl
promptCacheTtl ke 1h menjaga cache 1 jam pada percakapan utama sementara Anda menarik pada usage credits. Untuk urutan prioritas lengkap, lihat choose the TTL yourself.
Dokumentasi terkait
- Referensi SDK TypeScript - Dokumentasi API lengkap
- Ikhtisar SDK - Memulai dengan SDK
- Izin SDK - Mengelola izin alat