Funzionalità
Limiti di utilizzo
Questa pagina è stata tradotta automaticamente dall'inglese. Le correzioni sono benvenute. Modifica questa pagina su GitHub
ccam usage mostra quanta parte dei limiti su 5 ore e settimanali ha usato ogni account, con il tempo mancante all'azzeramento di ogni finestra. Usalo prima di iniziare un'attività lunga, o quando Claude Code ti avvisa che un limite è vicino, per vedere quale account ha ancora margine. ccam statusline è il comando per la riga di stato di Claude Code: mostra il nome dell'account e l'utilizzo dentro Claude Code e salva i numeri per ccam usage.
Utilizzo
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)In un terminale la tabella compare subito con fetching… in ogni riga, e ogni riga viene ridisegnata quando il suo account risponde. As of indica quanto sono vecchi i numeri; (cached) significa che provengono da un file salvato e non dall'endpoint. L'ultima riga indica l'account con l'utilizzo su 5 ore più basso sotto il 100%, e compare solo quando hai più di un account. Un account senza login mostra not logged in → ccam login <name>, e un account con chiave API mostra no limits (API).
Dopo ccam statusline install, Claude Code mostra una riga come [work] · Opus · 5h 24% · 7d 41%.
Opzioni
| Opzione | Cosa fa | Predefinito |
|---|---|---|
--json |
Stampa i risultati in JSON: name, slot, status, limits, source, at, error |
disattivata |
--watch[=N] |
Ridisegna ogni N secondi finché non premi Ctrl+C. --watch da solo, o un valore pari o inferiore a 0, indica 60 |
disattivata |
-v, --verbose |
Mostra i limiti settimanali per modello e una riga source: (live, cache o statusline) |
disattivata |
--no-cache |
Ignora la cache di 60 secondi e interroga di nuovo l'endpoint | disattivata |
--source live|cache |
cache non interroga mai l'endpoint e mostra solo i numeri salvati; live è il comportamento predefinito |
live |
--refresh |
Rinnova i token di accesso scaduti, solo per gli account che non sono in esecuzione | disattivata |
--dry-run |
Accettata: ccam usage non modifica nulla tranne la propria cache. Rifiutata insieme a --refresh: --dry-run cannot be combined with --refresh, which rewrites login tokens |
disattivata |
Qualsiasi altro valore di --source fallisce con --source must be live or cache. ccam usage non accetta argomenti.
ccam statusline legge dallo standard input il JSON della riga di stato di Claude Code. La sua unica opzione è --wrap <command>: un comando esistente per la riga di stato, davanti alla cui prima riga di output viene messo il nome dell'account. ccam statusline install non accetta opzioni. Entrambi rifiutano --dry-run con --dry-run is not supported by `ccam statusline`; nothing was changed.
Come funziona
I numeri provengono da due fonti: l'endpoint di utilizzo non documentato di Anthropic, GET https://api.anthropic.com/api/oauth/usage, chiamato con il login di ciascun account, e i valori che Claude Code passa al suo comando per la riga di stato. Tutto si trova in internal/usage.
cli.usageCmdcaricaconfig.tomle costruisce unusage.Accountper ogni account: la sua cartella~/.local/share/ccam/profiles/<name>/, la sua cartella di sessione (per sapere se è in esecuzione) e se è stato importato sul posto.Fetcher.FetchAllavvia una goroutine per account. Tutte condividono un solohttp.Client, così le connessioni all'endpoint vengono riutilizzate. La connessione può richiedere 2 s, e ogni account ha in totale 3 s. Il client non segue i reindirizzamenti, perché un reindirizzamento invierebbe di nuovo il token altrove, e legge al massimo 1 MB della risposta.- Quando ogni account termina, la sua riga viene ridisegnata. Un account che fallisce o non risponde in tempo ripiega sui numeri salvati, così un account lento non blocca mai gli altri.
Ogni account interroga l'endpoint nella propria goroutine; quello che supera il tempo limite mostra invece i numeri salvati.
personal e work rispondono in tempo e mostrano numeri aggiornati. side impiega più di 3 s, quindi fallback() legge i suoi due file di cache e usa quello scritto per ultimo. usage.Table() disegna le righe e usage.Best() sceglie l'account indicato nell'ultima riga.
Per un singolo account, Fetcher.Fetch esegue questi controlli in ordine:
- Con
--source cache, passa direttamente afallback(). - A meno che non sia impostato
--no-cache, un risultato aggiornato in~/.local/state/ccam/usage/<name>.jsonpiù recente di 60 secondi (CacheTTL) viene restituito così com'è. Eseguireccam usagedue volte di seguito costa una richiesta per account. readCredentials()legge.credentials.json(o il Portachiavi di macOS) senza modificarlo, e viene decodificata solo la chiaveclaudeAiOauth. Nessun login con abbonamento significanot logged in, oppureno limits (API)quando.claude.jsoncontiene una chiave API.- Un token di accesso scaduto non viene usato. Senza
--refresh, l'account mostra i numeri salvati segnati come scaduti. - Altrimenti ccam chiama l'endpoint. Un 401 o un 403 conta come login scaduto, qualsiasi altro stato o un corpo che non riesce a leggere conta come errore, e in entrambi i casi si ripiega sui numeri salvati.
- Una risposta valida viene scritta in
<name>.jsoncon l'ora in cui è stata misurata.
fallback() legge sia <name>.json sia <name>.statusline.json e tiene il più recente. Prima di mostrare i numeri salvati, controlla l'orario di azzeramento di ogni finestra: una finestra che si è azzerata dopo il salvataggio dei numeri mostra 0%, perché la vecchia percentuale non vale più. Per questo personal qui sopra mostra 0% senza orario di azzeramento.
L'endpoint ha due formati di risposta. Quello più recente ha un array limits con le voci session (5 ore), weekly_all e weekly_scoped (per modello). Quello più vecchio ha gli oggetti five_hour, seven_day, seven_day_opus e seven_day_sonnet. ParseLive li legge entrambi: prevale l'array limits, e i vecchi oggetti completano ciò che non copre. Un corpo senza alcun limite viene segnalato come cambio di formato, di cui ti avvisa ccam doctor.
Rinnovare i token
I refresh token ruotano: rinnovarne uno ti dà un nuovo refresh token e invalida quello vecchio. Se ccam rinnovasse il login mentre Claude Code è in esecuzione con lo stesso account, quella sessione verrebbe disconnessa. Per questo ccam usage legge i token e non li scrive mai, a meno che tu non passi --refresh. In quel caso Fetcher.refresh:
- rifiuta gli account registrati sul posto con
ccam import, dato checlaudeda solo potrebbe usare quel login a insaputa di ccam; - rifiuta i login salvati nel Portachiavi di macOS;
- prende un file di lock,
$XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock(sotto~/.local/state/ccam/locks/quando quella variabile non è impostata), così due processi di ccam non rinnovano mai due volte lo stesso token; - con il lock acquisito, si rifiuta se è in esecuzione una sessione dell'account, e salta la richiesta se un altro processo ha già rinnovato il token;
- invia il refresh token all'endpoint dei token e riscrive i nuovi token in
.credentials.jsonconfsutil.AtomicWrite, mantenendo tutte le altre chiavi del file.
Il raccoglitore della riga di stato
Claude Code esegue il comando della riga di stato e gli passa tramite pipe un documento JSON. ccam ne legge il nome del modello e rate_limits:
runStatuslinetrova l'account daCCAM_PROFILE, che ccam imposta quando avvia Claude Code, oppure confrontandoCLAUDE_CONFIG_DIRcon le cartelle degli account.ParseStatusLineleggerate_limits.five_hourerate_limits.seven_day. Il JSON non contiene limiti per gli account con chiave API, né prima della prima risposta della sessione; in quel caso non viene salvato nulla.SaveStatusLinescrive~/.local/state/ccam/usage/<name>.statusline.json.ccam usagelo usa quando l'endpoint non risponde.- ccam stampa
[name] · model · 5h N% · 7d N%. Con--wrap, esegue invece il tuo comando tramitesh -ccon lo stesso input e stampa[name]seguito dalla prima riga del comando.
Il comando avvolto ha 2 secondi. Dopo viene terminato e la riga mostra solo il nome dell'account, così un comando lento non può bloccare la riga di stato di Claude Code.
ccam statusline install scrive statusLine nel settings.json di ogni account. Quando un account ha già un comando per la riga di stato, ccam lo mantiene come --wrap '<old command>'. Un settings.json condiviso tramite un gruppo viene scritto una sola volta, attraverso il suo link, così lo riceve ogni account del gruppo. Eseguirlo di nuovo stampa (already set) per i file che usano già ccam.
Sicurezza e casi limite
ccam usagenon modifica mai un file di token a meno che tu non passi--refresh. Quando un login è scaduto, avvia l'account una volta conccam <name>e sarà Claude Code a rinnovarlo.--refreshnon tocca mai gli account in esecuzione, gli account importati o i login nel Portachiavi. Un rinnovo rifiutato mostra i numeri salvati e il motivo.- L'endpoint di utilizzo non è documentato pubblicamente e potrebbe cambiare. Se succede, vedi comunque i numeri salvati, e
ccam doctorsegnala il cambio di formato. - Senza numeri salvati e senza risposta, la riga mostra
lookup failed:e il motivo, per esempiono saved usagecon--source cache. - I file di cache contengono solo percentuali e orari di azzeramento, mai token.