Fitur
Batas penggunaan
Halaman ini diterjemahkan dengan mesin dari bahasa Inggris. Koreksi sangat dihargai. Sunting halaman ini di GitHub
ccam usage menampilkan seberapa banyak batas 5 jam dan mingguan yang sudah digunakan setiap akun, beserta waktu hingga setiap jendela direset. Gunakan sebelum memulai tugas panjang, atau saat Claude Code memberi tahu bahwa batas sudah dekat, untuk melihat akun mana yang masih punya ruang. ccam statusline adalah perintah status line untuk Claude Code: perintah ini menampilkan nama akun dan penggunaan di dalam Claude Code serta menyimpan angkanya untuk ccam usage.
Penggunaan
ccam usage # every account, once
ccam u # the same, shorter
ccam usage --watch # redraw every 60 seconds until Ctrl+C
ccam usage --watch=10 # redraw every 10 seconds
ccam usage -v # add per-model weekly limits and the data source
ccam usage --json # machine-readable, one object per account
ccam usage --source cache # saved numbers only, no network
ccam usage --refresh # also renew expired logins of accounts not running
ccam statusline install # set the status line in every account's settings.json$ ccam usage
Account 5-hour Resets Weekly Resets As of
1 personal ░░░░░░░░ 0% - ██████░░ 70% 2d 16h 9h 36m ago (cached)
2 work ██░░░░░░ 24% 2h 29m ███░░░░░ 41% 3d 11h just now (cached)
3 side login expired, run `ccam side` once to refresh
→ Most headroom: personal (open it with ccam next --auto)Di terminal, tabel langsung muncul dengan fetching… di setiap baris, dan setiap baris digambar ulang begitu akunnya menjawab. As of menunjukkan umur angka-angka itu; (cached) berarti angkanya berasal dari file yang tersimpan, bukan dari endpoint. Baris terakhir menyebut akun dengan penggunaan 5 jam terendah di bawah 100%, dan hanya muncul jika Anda memiliki lebih dari satu akun. Akun yang belum login menampilkan not logged in → ccam login <name>, dan akun dengan kunci API menampilkan no limits (API).
Setelah ccam statusline install, Claude Code menampilkan baris seperti [work] · Opus · 5h 24% · 7d 41%.
Opsi
| Opsi | Fungsinya | Default |
|---|---|---|
--json |
Menampilkan laporan sebagai JSON: name, slot, status, limits, source, at, error |
nonaktif |
--watch[=N] |
Menggambar ulang setiap N detik sampai Anda menekan Ctrl+C. --watch saja, atau nilai 0 atau kurang, berarti 60 |
nonaktif |
-v, --verbose |
Menampilkan batas mingguan per model dan baris source: (live, cache, atau statusline) |
nonaktif |
--no-cache |
Mengabaikan cache 60 detik dan bertanya ulang ke endpoint | nonaktif |
--source live|cache |
cache tidak pernah bertanya ke endpoint dan hanya menampilkan angka yang tersimpan; live adalah perilaku default |
live |
--refresh |
Memperbarui token akses yang kedaluwarsa, hanya untuk akun yang tidak sedang berjalan | nonaktif |
--dry-run |
Diterima: ccam usage tidak mengubah apa pun selain cache-nya sendiri. Ditolak jika dipakai bersama --refresh: --dry-run cannot be combined with --refresh, which rewrites login tokens |
nonaktif |
Nilai --source lainnya gagal dengan --source must be live or cache. ccam usage tidak menerima argumen.
ccam statusline membaca JSON status line milik Claude Code dari input standar. Satu-satunya opsinya adalah --wrap <command>: perintah status line yang sudah ada, yang baris keluaran pertamanya diberi nama akun di depannya. ccam statusline install tidak menerima opsi. Keduanya menolak --dry-run dengan --dry-run is not supported by `ccam statusline`; nothing was changed.
Cara kerjanya
Angkanya berasal dari dua tempat: endpoint penggunaan Anthropic yang tidak didokumentasikan, GET https://api.anthropic.com/api/oauth/usage, yang dipanggil dengan login masing-masing akun, dan nilai yang diberikan Claude Code ke perintah status line-nya. Semuanya ada di internal/usage.
cli.usageCmdmemuatconfig.tomldan membuat satuusage.Accountper akun: foldernya~/.local/share/ccam/profiles/<name>/, folder sesinya (untuk melihat apakah akun sedang berjalan), dan apakah akun itu diimpor di tempatnya.Fetcher.FetchAllmenjalankan satu goroutine per akun. Semuanya berbagi satuhttp.Client, sehingga koneksi ke endpoint dipakai ulang. Menyambung boleh memakan waktu 2 detik, dan setiap akun mendapat total 3 detik. Klien tidak mengikuti pengalihan, karena pengalihan akan mengirim ulang token ke tempat lain, dan hanya membaca paling banyak 1 MB jawaban.- Begitu setiap akun selesai, barisnya digambar ulang. Akun yang gagal atau tidak menjawab tepat waktu beralih ke angka yang tersimpan, sehingga satu akun yang lambat tidak pernah menahan akun lain.
Setiap akun berjalan di goroutine-nya sendiri terhadap endpoint; akun yang melewati batas waktu menampilkan angka tersimpannya sebagai gantinya.
personal dan work menjawab tepat waktu dan menampilkan angka langsung. side membutuhkan lebih dari 3 detik, sehingga fallback() membaca dua file cache-nya dan memakai yang paling akhir ditulis. usage.Table() menggambar baris-barisnya dan usage.Best() memilih akun yang disebut di baris terakhir.
Untuk satu akun, Fetcher.Fetch melakukan pemeriksaan ini secara berurutan:
- Dengan
--source cache, langsung menujufallback(). - Kecuali
--no-cachediatur, hasil langsung di~/.local/state/ccam/usage/<name>.jsonyang berumur kurang dari 60 detik (CacheTTL) dikembalikan apa adanya. Menjalankanccam usagedua kali berturut-turut hanya memakan satu permintaan per akun. readCredentials()membaca.credentials.json(atau Rantai Kunci (Keychain) macOS) tanpa mengubahnya, dan hanya kunciclaudeAiOauthyang didekode. Tidak adanya login langganan berartinot logged in, atauno limits (API)jika.claude.jsonberisi kunci API.- Token akses yang kedaluwarsa tidak dipakai. Tanpa
--refresh, akun menampilkan angka tersimpannya dengan tanda kedaluwarsa. - Jika tidak, ccam memanggil endpoint. 401 atau 403 dianggap sebagai login yang kedaluwarsa, status lain atau isi yang tidak dapat dibaca dianggap galat, dan keduanya beralih ke angka yang tersimpan.
- Jawaban yang baik ditulis ke
<name>.jsonbersama waktu pengukurannya.
fallback() membaca <name>.json dan <name>.statusline.json sekaligus dan mempertahankan yang lebih baru. Sebelum menampilkan angka tersimpan, fungsi ini memeriksa waktu reset setiap jendela: jendela yang sudah direset sejak angka disimpan menampilkan 0%, karena persentase lama sudah tidak berlaku. Itulah sebabnya personal di atas menampilkan 0% tanpa waktu reset.
Endpoint memiliki dua format respons. Yang lebih baru memiliki array limits dengan entri session (5 jam), weekly_all, dan weekly_scoped (per model). Yang lebih lama memiliki objek five_hour, seven_day, seven_day_opus, dan seven_day_sonnet. ParseLive membaca keduanya: array limits yang menang, dan objek lama mengisi apa yang tidak dicakupnya. Isi tanpa batas sama sekali dilaporkan sebagai format yang berubah, yang akan diberitahukan oleh ccam doctor.
Memperbarui token
Refresh token berotasi: memperbaruinya memberi Anda refresh token baru dan membatalkan yang lama. Jika ccam memperbarui login saat Claude Code sedang berjalan sebagai akun yang sama, sesi itu akan keluar. Karena itu ccam usage membaca token dan tidak pernah menulisnya, kecuali Anda memberikan --refresh. Dalam hal itu Fetcher.refresh:
- menolak akun yang didaftarkan di tempatnya dengan
ccam import, karenaclaudebiasa mungkin memakai login itu tanpa sepengetahuan ccam; - menolak login yang tersimpan di Rantai Kunci (Keychain) macOS;
- mengambil file lock,
$XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock(di bawah~/.local/state/ccam/locks/jika variabel itu tidak diatur), sehingga dua proses ccam tidak pernah memperbarui token yang sama dua kali; - di bawah lock, menolak jika ada sesi akun yang sedang berjalan, dan melewati permintaan jika proses lain sudah memperbarui token;
- mengirim refresh token ke endpoint token dan menulis token baru kembali ke
.credentials.jsondenganfsutil.AtomicWrite, dengan mempertahankan setiap kunci lain di file itu.
Pengumpul status line
Claude Code menjalankan perintah status line dan mengirimkan dokumen JSON kepadanya melalui pipe. ccam membaca nama model dan rate_limits darinya:
runStatuslinemenemukan akun dariCCAM_PROFILE, yang diatur ccam saat menjalankan Claude Code, atau jika tidak ada, dengan mencocokkanCLAUDE_CONFIG_DIRdengan folder akun.ParseStatusLinemembacarate_limits.five_hourdanrate_limits.seven_day. JSON tidak berisi batas laju untuk akun kunci API, atau sebelum respons pertama sesi; dalam hal itu tidak ada yang disimpan.SaveStatusLinemenulis~/.local/state/ccam/usage/<name>.statusline.json.ccam usagememakainya jika endpoint tidak menjawab.- ccam menampilkan
[name] · model · 5h N% · 7d N%. Dengan--wrap, ccam menjalankan perintah Anda melaluish -cdengan input yang sama dan menampilkan[name]diikuti baris pertama perintah itu sebagai gantinya.
Perintah yang dibungkus diberi waktu 2 detik. Setelah itu perintah dihentikan dan baris hanya menampilkan nama akun, sehingga perintah yang lambat tidak dapat memblokir status line Claude Code.
ccam statusline install menulis statusLine ke settings.json setiap akun. Jika sebuah akun sudah memiliki perintah status line, ccam mempertahankannya sebagai --wrap '<old command>'. settings.json yang dibagikan melalui grup ditulis sekali, melalui tautannya, sehingga setiap akun dalam grup mendapatkannya. Menjalankannya lagi menampilkan (already set) untuk file yang sudah memakai ccam.
Keamanan dan kasus khusus
ccam usagetidak pernah mengubah file token kecuali Anda memberikan--refresh. Jika login sudah kedaluwarsa, jalankan akun tersebut sekali denganccam <name>dan Claude Code akan memperbaruinya.--refreshtidak pernah menyentuh akun yang sedang berjalan, akun yang diimpor, atau login Rantai Kunci (Keychain). Pembaruan yang ditolak menampilkan angka tersimpan beserta alasannya.- Endpoint penggunaan tidak didokumentasikan secara publik dan dapat berubah. Jika berubah, Anda tetap melihat angka yang tersimpan, dan
ccam doctormelaporkan perubahan format. - Jika tidak ada angka tersimpan dan tidak ada jawaban, baris menampilkan
lookup failed:beserta alasannya, misalnyano saved usagedengan--source cache. - File cache hanya berisi persentase dan waktu reset, tidak pernah token.