Возможности

Лимиты использования

Обновлено 19 октября 2026 г.
Проверено с ccam 0.6.0 и Claude Code 2.1.302

Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на 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.

  1. cli.usageCmd загружает config.toml и строит по одному usage.Account на аккаунт: его папка ~/.local/share/ccam/profiles/<name>/, папка его сессий (чтобы узнать, запущен ли он) и признак того, был ли он импортирован на месте.
  2. Fetcher.FetchAll запускает по одной горутине на аккаунт. Все они используют один http.Client, поэтому соединения с эндпоинтом переиспользуются. На подключение отводится до 2 с, а на каждый аккаунт всего 3 с. Клиент не переходит по перенаправлениям, так как перенаправление отправило бы токен куда-то ещё, и читает не больше 1 МБ ответа.
  3. Когда аккаунт завершает запрос, его строка перерисовывается. Аккаунт, запрос которого не удался или не уложился во время, переходит на сохранённые данные, поэтому один медленный аккаунт никогда не задерживает остальные.

Каждый аккаунт обращается к эндпоинту в своей горутине; тот, у которого истекло время, показывает вместо этого сохранённые данные.

personal и work отвечают вовремя и показывают актуальные данные. side отвечает дольше 3 с, поэтому fallback() читает два его файла кэша и использует тот, который был записан последним. usage.Table() рисует строки, а usage.Best() выбирает аккаунт, названный в последней строке.

Для одного аккаунта Fetcher.Fetch выполняет проверки в таком порядке:

  1. С --source cache он сразу переходит к fallback().
  2. Если не задан --no-cache, актуальный результат в ~/.local/state/ccam/usage/<name>.json моложе 60 секунд (CacheTTL) возвращается как есть. Два запуска ccam usage подряд стоят одного запроса на аккаунт.
  3. readCredentials() читает .credentials.json (или Связку ключей macOS), не изменяя его, и декодирует только ключ claudeAiOauth. Отсутствие входа по подписке означает not logged in или no limits (API), если .claude.json содержит ключ API.
  4. Истёкший токен доступа не используется. Без --refresh аккаунт показывает сохранённые данные с пометкой об истечении.
  5. Иначе ccam обращается к эндпоинту. Ответ 401 или 403 считается истёкшим входом, любой другой статус или нечитаемое тело ответа считаются ошибкой, и в обоих случаях используются сохранённые данные.
  6. Успешный ответ записывается в <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:

  1. отклоняет аккаунты, зарегистрированные на месте через ccam import, поскольку обычный claude может использовать этот вход без ведома ccam;
  2. отклоняет входы, хранящиеся в Связке ключей macOS;
  3. берёт файл блокировки $XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock (в ~/.local/state/ccam/locks/, если эта переменная не задана), чтобы два процесса ccam никогда не обновляли один токен дважды;
  4. под блокировкой отказывается работать, если запущена сессия аккаунта, и пропускает запрос, если другой процесс уже обновил токен;
  5. отправляет токен обновления на эндпоинт токенов и записывает новые токены обратно в .credentials.json через fsutil.AtomicWrite, сохраняя все остальные ключи файла.

Сборщик данных строки состояния

Claude Code запускает команду строки состояния и передаёт ей через конвейер JSON-документ. ccam читает из него имя модели и rate_limits:

  1. runStatusline определяет аккаунт по CCAM_PROFILE, который ccam задаёт при запуске Claude Code, а иначе сопоставляет CLAUDE_CONFIG_DIR с папками аккаунтов.
  2. ParseStatusLine читает rate_limits.five_hour и rate_limits.seven_day. Для аккаунтов с ключом API, а также до первого ответа в сессии, в JSON нет лимитов; тогда ничего не сохраняется.
  3. SaveStatusLine записывает ~/.local/state/ccam/usage/<name>.statusline.json. ccam usage использует его, когда эндпоинт не отвечает.
  4. 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.
  • Файлы кэша содержат только проценты и время сброса, но никогда не токены.