功能
用量限制
本頁由英文機器翻譯而成,歡迎提供修正。 在 GitHub 上編輯此頁
ccam usage 會顯示每個帳號已使用了多少 5 小時限制和每週限制,以及每個時間區間距離重設的時間。在開始一項長時間的工作之前,或 Claude Code 告訴你快要達到限制時,可以用它查看哪個帳號還有剩餘額度。ccam statusline 是 Claude Code 的狀態列指令:它會在 Claude Code 中顯示帳號名稱和用量,並為 ccam usage 儲存這些數字。
用法
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)在終端機中,表格會立即出現,每一列顯示 fetching…,並在各帳號回應時重新繪製該列。As of 表示數字的新舊程度;(cached) 代表數字來自已儲存的檔案,而不是端點。最後一行會列出 5 小時用量最低且低於 100% 的帳號,只在你有多個帳號時才會出現。未登入的帳號會顯示 not logged in → ccam login <name>,API 金鑰帳號則顯示 no limits (API)。
執行 ccam statusline install 之後,Claude Code 會顯示 [work] · Opus · 5h 24% · 7d 41% 這樣的一行。
選項
| 選項 | 作用 | 預設值 |
|---|---|---|
--json |
以 JSON 輸出報告:name、slot、status、limits、source、at、error |
關閉 |
--watch[=N] |
每 N 秒重新繪製,直到你按下 Ctrl+C。只寫 --watch,或值為 0 以下時,代表 60 |
關閉 |
-v、--verbose |
顯示各模型的每週限制,以及 source: 一行(live、cache 或 statusline) |
關閉 |
--no-cache |
忽略 60 秒快取,重新查詢端點 | 關閉 |
--source live|cache |
cache 絕不查詢端點,只顯示已儲存的數字;live 是預設行為 |
live |
--refresh |
更新過期的存取權杖,只針對沒有在執行的帳號 | 關閉 |
--dry-run |
接受:ccam usage 除了自己的快取以外不變更任何東西。和 --refresh 一起使用時會被拒絕:--dry-run cannot be combined with --refresh, which rewrites login tokens |
關閉 |
其他任何 --source 值都會失敗並顯示 --source must be live or cache。ccam usage 不接受參數。
ccam statusline 從標準輸入讀取 Claude Code 的狀態列 JSON。它唯一的選項是 --wrap <command>:一個現有的狀態列指令,ccam 會在它輸出的第一行前面加上帳號名稱。ccam statusline install 沒有選項。兩者都會以 --dry-run is not supported by `ccam statusline`; nothing was changed 拒絕 --dry-run。
運作方式
數字來自兩個地方:Anthropic 沒有公開文件的用量端點 GET https://api.anthropic.com/api/oauth/usage(以每個帳號自己的登入資訊呼叫),以及 Claude Code 交給狀態列指令的值。這些全都位於 internal/usage。
cli.usageCmd載入config.toml,並為每個帳號建立一個usage.Account:它的資料夾~/.local/share/ccam/profiles/<name>/、它的工作階段資料夾(用來判斷是否正在執行),以及它是否為就地匯入。Fetcher.FetchAll為每個帳號啟動一個 goroutine。它們共用同一個http.Client,所以連到端點的連線會被重複使用。建立連線最多 2 秒,每個帳號總共有 3 秒。用戶端不跟隨重新導向,因為重新導向會把權杖重新送到別的地方,而且最多只讀取 1 MB 的回應。- 每個帳號完成時,會重新繪製它的那一列。失敗或沒有及時回應的帳號會改用已儲存的數字,所以一個緩慢的帳號絕不會拖住其他帳號。
每個帳號都在自己的 goroutine 中查詢端點;逾時的那個帳號改為顯示已儲存的數字。
personal 和 work 及時回應,顯示即時的數字。side 花了超過 3 秒,所以 fallback() 讀取它的兩個快取檔案,並使用最後寫入的那一個。usage.Table() 繪製各列,usage.Best() 選出最後一行列出的帳號。
對於單一帳號,Fetcher.Fetch 依序進行以下檢查:
- 加上
--source cache時,直接交給fallback()。 - 除非設定了
--no-cache,否則~/.local/state/ccam/usage/<name>.json中不到 60 秒(CacheTTL)的即時結果會直接傳回。連續執行兩次ccam usage,每個帳號只會花一次請求。 readCredentials()讀取.credentials.json(或 macOS 鑰匙圈)而不變更它,只解碼claudeAiOauth鍵。沒有訂閱登入時代表not logged in;如果.claude.json中有 API 金鑰,則為no limits (API)。- 過期的存取權杖不會被使用。沒有
--refresh時,帳號會顯示已儲存的數字,並標示為已過期。 - 否則 ccam 會呼叫端點。401 或 403 視為登入過期,其他任何狀態或無法讀取的回應內容視為錯誤,兩者都會改用已儲存的數字。
- 正常的回應會連同測量時間寫入
<name>.json。
fallback() 會讀取 <name>.json 和 <name>.statusline.json,並保留較新的那一個。在顯示已儲存的數字之前,它會檢查每個時間區間的重設時間:在數字儲存之後已經重設的時間區間會顯示 0%,因為舊的百分比已不再成立。這就是上面的 personal 顯示 0% 且沒有重設時間的原因。
端點有兩種回應格式。較新的格式有一個 limits 陣列,包含 session(5 小時)、weekly_all 和 weekly_scoped(各模型)項目。較舊的格式有 five_hour、seven_day、seven_day_opus 和 seven_day_sonnet 物件。ParseLive 兩種都能讀取:以 limits 陣列為準,舊物件補上它沒有涵蓋的部分。完全沒有限制資料的回應內容會被回報為格式已變更,ccam doctor 會告訴你這件事。
更新權杖
更新權杖會輪替:更新一次會得到新的更新權杖,並讓舊的失效。如果 ccam 在 Claude Code 以同一個帳號執行時更新了登入,那個工作階段就會被登出。所以 ccam usage 只讀取權杖、絕不寫入,除非你加上 --refresh。這時 Fetcher.refresh 會:
- 拒絕以
ccam import就地登錄的帳號,因為直接執行的claude可能在 ccam 不知情的情況下使用那份登入; - 拒絕存放在 macOS 鑰匙圈中的登入資訊;
- 取得鎖檔
$XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock(該變數未設定時位於~/.local/state/ccam/locks/下),讓兩個 ccam 行程絕不會重複更新同一個權杖; - 在持有鎖的情況下,如果該帳號有工作階段正在執行就拒絕,如果另一個行程已經更新了權杖就略過請求;
- 把更新權杖送到權杖端點,並以
fsutil.AtomicWrite把新的權杖寫回.credentials.json,保留檔案中的其他所有鍵。
狀態列收集器
Claude Code 會執行狀態列指令,並透過管線傳給它一份 JSON 文件。ccam 從中讀取模型名稱和 rate_limits:
runStatusline從CCAM_PROFILE(ccam 啟動 Claude Code 時會設定)找出帳號,否則就把CLAUDE_CONFIG_DIR和各帳號資料夾比對。ParseStatusLine讀取rate_limits.five_hour和rate_limits.seven_day。API 金鑰帳號的 JSON 中沒有頻率限制,工作階段的第一個回應之前也沒有;這時不會儲存任何東西。SaveStatusLine寫入~/.local/state/ccam/usage/<name>.statusline.json。端點沒有回應時,ccam usage會使用它。- ccam 印出
[name] · model · 5h N% · 7d N%。加上--wrap時,它會以相同的輸入透過sh -c執行你的指令,改為印出[name]再接上該指令的第一行。
被包裝的指令有 2 秒時間。超過之後會被終止,該行只顯示帳號名稱,所以緩慢的指令無法卡住 Claude Code 的狀態列。
ccam statusline install 會把 statusLine 寫入每個帳號的 settings.json。如果帳號已經有狀態列指令,ccam 會以 --wrap '<old command>' 保留它。透過群組共用的 settings.json 只會經由它的連結寫入一次,群組中的每個帳號都會取得這項設定。再次執行時,對已經使用 ccam 的檔案會印出 (already set)。
安全性和特殊情況
- 除非你加上
--refresh,否則ccam usage絕不變更權杖檔案。登入過期時,用ccam <name>啟動該帳號一次,Claude Code 就會更新它。 --refresh絕不碰正在執行的帳號、匯入的帳號或鑰匙圈中的登入資訊。被拒絕的更新會顯示已儲存的數字和原因。- 用量端點沒有公開的文件,可能會變更。變更時你仍會看到已儲存的數字,
ccam doctor也會回報格式的變更。 - 既沒有已儲存的數字也沒有回應時,該列會顯示
lookup failed:和原因,例如加上--source cache時的no saved usage。 - 快取檔案只存放百分比和重設時間,絕不存放權杖。