Возможности
Лимиты использования
Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на 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 читает JSON строки состояния Claude Code из стандартного ввода. Его единственный параметр --wrap <command>: существующая команда строки состояния, перед первой строкой вывода которой ставится имя аккаунта. ccam statusline install не принимает параметров. Обе команды отклоняют --dry-run с сообщением --dry-run is not supported by `ccam statusline`; nothing was changed.
Как это работает
Данные берутся из двух источников: недокументированного эндпоинта использования 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запускает по одной горутине на аккаунт. Все они используют одинhttp.Client, поэтому соединения с эндпоинтом переиспользуются. На подключение отводится до 2 с, а на каждый аккаунт всего 3 с. Клиент не переходит по перенаправлениям, так как перенаправление отправило бы токен куда-то ещё, и читает не больше 1 МБ ответа.- Когда аккаунт завершает запрос, его строка перерисовывается. Аккаунт, запрос которого не удался или не уложился во время, переходит на сохранённые данные, поэтому один медленный аккаунт никогда не задерживает остальные.
Каждый аккаунт обращается к эндпоинту в своей горутине; тот, у которого истекло время, показывает вместо этого сохранённые данные.
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илиno limits (API), если.claude.jsonсодержит ключ 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 никогда не обновляли один токен дважды; - под блокировкой отказывается работать, если запущена сессия аккаунта, и пропускает запрос, если другой процесс уже обновил токен;
- отправляет токен обновления на эндпоинт токенов и записывает новые токены обратно в
.credentials.jsonчерезfsutil.AtomicWrite, сохраняя все остальные ключи файла.
Сборщик данных строки состояния
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, общий через группу, записывается один раз через его ссылку, поэтому его получает каждый аккаунт группы. Повторный запуск выводит (already set) для файлов, которые уже используют ccam.
Безопасность и особые случаи
ccam usageникогда не меняет файл токенов, если вы не передали--refresh. Если вход истёк, запустите аккаунт один раз командойccam <name>, и Claude Code обновит его.--refreshникогда не трогает запущенные аккаунты, импортированные аккаунты и входы из Связки ключей. При отказе в обновлении показываются сохранённые данные и причина.- Эндпоинт использования публично не документирован и может измениться. В этом случае вы всё равно увидите сохранённые данные, а
ccam doctorсообщит об изменении формата. - Если сохранённых данных нет и ответа нет, строка показывает
lookup failed:и причину, напримерno saved usageс--source cache. - Файлы кэша содержат только проценты и время сброса, но никогда не токены.