Concept internals
Отслеживание использования
Что это такое
- Получает данные об использовании и квотах провайдера непосредственно из его конечной точки использования. Никаких оценок выставления счетов провайдером — только сообщаемые провайдером названия тарифов, окна квот, балансы, расходы, бюджеты, история ежедневных затрат, распределение по токенам и моделям или сводки состояния учётной записи.
- Удобочитаемый вывод окна квоты нормализуется к
X% left, даже если провайдер сообщает израсходованную квоту, оставшуюся квоту или только необработанные значения. Для провайдеров без окон квот со сбросом вместо этого отображается текстовая сводка провайдера (например, баланс). - Данные уровня сеанса
/statusи инструментsession_statusиспользуют журнал транскрипта сеанса как резервный источник, если в актуальном снимке сеанса отсутствуют данные о токенах или модели. Этот резервный механизм заполняет отсутствующие счётчики токенов и кеша, может восстановить метку активной модели среды выполнения и предпочитает большее итоговое значение, ориентированное на промпт, если метаданные сеанса отсутствуют или содержат меньшее значение (totalTokensFresh !== true, ноль или значение ниже полученного из транскрипта). Ненулевые актуальные значения всегда имеют приоритет над резервными.
Где это отображается
/statusв чатах: карточка состояния с токенами сеанса и оценочной стоимостью (только для моделей с ключом API). Данные об использовании провайдера отображаются для провайдера текущей модели, если они доступны, в виде нормализованного окнаX% leftили текстовой сводки провайдера./usage off|tokens|fullв чатах: нижний колонтитул с данными об использовании для каждого ответа./usage costв чатах: локальная сводка затрат, агрегированная из журналов сеансов OpenClaw.- CLI:
openclaw status --usageвыводит полную разбивку использования и квот по каждому провайдеру. - CLI:
openclaw models statusперечисляет профили аутентификации OAuth и токенов и показывает сводку окна использования рядом с каждым провайдером, для которого она доступна. - Интерфейс управления: раздел Использование показывает карточки тарифа и выставления счетов провайдера над анализом токенов и оценочной стоимости, рассчитанным OpenClaw на основе сеансов. Учётные данные Anthropic и OpenAI Admin API добавляют сообщаемые провайдером расходы за сегодня, 7 и 30 дней, ежедневные тенденции, общее количество токенов, ведущие модели и категории затрат.
- Интерфейс управления: всплывающее окно кольца контекста в поле ввода чата показывает использование тарифа для провайдеров с подпиской — индикаторы по окнам (5-часовое, недельное, ограниченное моделью) со временем сброса, тариф провайдера, если он известен (например,
Max (20x)), и кредиты дополнительного использования. Для сеансов, оплачиваемых по тарифу, оценки стоимости токенов в долларах скрыты; для сеансов с оплатой через API сохраняютсяEst. costи разбивка стоимости по типам. Конфигурации Claude Code CLI (claude-cli) используют те же данные об использовании подписки Anthropic. - Строка меню macOS: корневой раздел «Использование» отображается под разделом «Контекст», когда доступны снимки использования провайдера. См. Строка меню.
openclaw channels list больше не выводит данные об использовании провайдера; вместо этого он направляет пользователей к openclaw status или openclaw models list.
История затрат Anthropic и OpenAI
Квота подписки и выставление счетов за API — разные интерфейсы провайдера:
- Учётные данные подписки или конфигурации Anthropic продолжают показывать окна квот Claude и необязательные бюджеты дополнительного использования. Задайте
ANTHROPIC_ADMIN_KEYилиANTHROPIC_ADMIN_API_KEY, чтобы вместо этого показывать историю Usage and Cost API организации. Учётные данные провайдера Anthropic, начинающиеся сsk-ant-admin, обнаруживаются автоматически. - OAuth OpenAI ChatGPT/Codex продолжает показывать тариф, окна квот и кредитный баланс. Задайте
OPENAI_ADMIN_KEY, чтобы вместо этого показывать историю затрат организации и использования completions; при необходимости задайтеOPENAI_PROJECT_ID, чтобы ограничить её одним проектом. OpenClaw никогда не отправляет учётные данные для инференса изOPENAI_API_KEY, конфигурации провайдера или профилей аутентификации в API организации, поскольку эти ключи могут относиться к пользовательским конечным точкам.
Учётные данные администратора имеют приоритет, поскольку предоставляют фактические данные о выставлении счетов организации. OpenClaw не объединяет эти сообщаемые провайдером итоговые значения со своими локальными оценками сеансов; эти два раздела намеренно отвечают на разные вопросы.
Режим нижнего колонтитула использования по умолчанию
/usage off|tokens|full задаёт нижний колонтитул для сеанса, и этот выбор запоминается для данного
сеанса. messages.responseUsage устанавливает начальный режим для сеансов, в которых он ещё не
выбран, поэтому нижний колонтитул может быть включён по умолчанию без необходимости каждый раз вводить /usage.
Задайте один режим для всех каналов или карту по каналам с резервным значением default:
{ "messages": { "responseUsage": "tokens", // или: { "default": "off", "discord": "full" } },}Допустимые значения: "off", "tokens", "full" и устаревший псевдоним "on" (обрабатывается как "tokens").
Три различных состояния сеанса
Поле responseUsage сеанса может представлять три состояния, каждое со
своей семантикой:
| Состояние | Сохранённое значение | Действующий режим |
|---|---|---|
| Не задано / наследование | undefined (отсутствует) |
Использует значение конфигурации messages.responseUsage, затем off. |
| Явно выключено | "off" (сохранено) |
Всегда выключено; значение конфигурации, отличное от выключенного, не может повторно включить нижний колонтитул. |
| Явно включено | "tokens" или "full" (сохранено) |
Этот режим независимо от значения конфигурации по умолчанию. |
Приоритет
Действующий режим = переопределение сеанса → запись конфигурации канала → default → off.
Явное значение /usage off сохраняется в сеансе как буквальное значение "off",
что не равнозначно состоянию «не задано». Значение по умолчанию messages.responseUsage,
отличное от выключенного, не может снова включить нижний колонтитул после того, как пользователь явно его отключил.
Сброс и выключение
/usage offпринудительно выключает нижний колонтитул и сохраняет этот выбор. Настроенное значение по умолчанию, отличное от выключенного, не может его переопределить./usage reset(псевдонимы:default,inherit,inherited,clear,unpin) очищает переопределение сеанса. После этого сеанс наследует действующее значение конфигурации по умолчанию (messages.responseUsage). Если значение по умолчанию не настроено, нижний колонтитул остаётся выключенным.- Полный сброс сеанса (
/resetили/new) либо переход к новому сеансу сохраняет явно заданный режим использования, чтобы выбранный пользователем вариант отображения сохранялся при переходах между сеансами. Только/usage reset(и его псевдонимы) очищает переопределение.
Поведение переключателя
/usage без аргументов циклически переключает режимы: выключено → токены → полный → выключено. Начальной точкой
цикла служит действующий текущий режим (переопределение сеанса, а если оно не задано —
значение конфигурации по умолчанию), поэтому цикл всегда соответствует тому, что
пользователь сейчас видит в нижнем колонтитуле.
Конфигурация
Без конфигурации сохраняется прежнее поведение (нижний колонтитул выключен до /usage). Используйте
/usage reset, чтобы очистить переопределение сеанса и снова унаследовать настроенное значение по умолчанию.
Пользовательский нижний колонтитул /usage full
/usage tokens всегда отображает простую строку Usage: X in / Y out (с суффиксами кеша и
оценочной стоимости, если они доступны). Только /usage full отображает более подробный
нижний колонтитул, описанный далее.
/usage full показывает встроенный компактный нижний колонтитул с моделью, рассуждением, быстрым/медленным режимом,
окном контекста и стоимостью, когда эти поля доступны. Для встроенного нижнего колонтитула
файл шаблона не требуется.
messages.usageTemplate предназначен только для расширенных пользовательских макетов. Значение представляет собой
путь к файлу JSON (поддерживает ~) или встроенный объект и заменяет встроенный
нижний колонтитул, если оно допустимо. Изменения файла по указанному пути отслеживаются, и он перезагружается в реальном времени.
{ "messages": { "usageTemplate": "~/.openclaw/usage-footer.json" }}При отсутствующем или пустом шаблоне без уведомлений используется встроенный нижний колонтитул. При недоступном для чтения или недопустимом настроенном шаблоне (некорректный JSON либо структура без отображаемых элементов) также используется встроенный нижний колонтитул и выводится предупреждение оператору.
Возьмите встроенную структуру за основу пользовательского шаблона, затем измените нужные части:
{ "schema": "openclaw.usageBar.v1", "scales": { "braille": "⠐⡀⡄⡆⡇⣇⣧⣷⣿", "block": "░▏▎▍▌▋▊▉█", "shade": "░▒▓█", "moon": "🌑🌘🌗🌖🌕", "level": "▁▂▃▄▅▆▇█", "weather": ["🥶", "☁️", "🌥", "⛅️", "🌤", "☀️"], "plants": ["", "🍂", "🌱", "☘️", "🍀", "🌿"], "moons6": ["🌑", "🌚", "🌘", "🌗", "🌖", "🌝"], }, "aliases": { "models": { "claude-opus-4-6": "opus46", "claude-opus-4-8": "opus48", "claude-sonnet-4-6": "sonnet46", "claude-haiku-4-5": "haiku45", "gpt-5.5": "gpt5.5", }, "reasoning": { "off": "🌑", "minimal": "🌚", "low": "🌘", "medium": "🌗", "high": "🌕", "xhigh": "🌝", }, }, "output": { "sep": "", "default": [ { "text": "{model.provider}{identity.emoji|🤖}{model.display_name|alias:models}" }, { "map": "model.is_fallback", "cases": { "true": "🔄" } }, { "map": "model.is_override", "cases": { "true": "📌" } }, { "when": "model.reasoning", "text": "{model.reasoning|alias:reasoning}" }, { "map": "state.fast_mode", "cases": { "true": "⚡️", "false": "🐌" } }, { "when": "context.max_tokens", "text": " | 📚[{context.pct_used|meter:5:braille}]{context.max_tokens|num}", }, { "when": "cost.turn_usd", "text": " 💰{cost.turn_usd|fixed:4}" }, ], "surfaces": { "discord": [ { "text": "-# -\n" }, { "text": "-# {model.provider}{identity.emoji|🤖}{model.display_name|alias:models}" }, { "map": "model.is_fallback", "cases": { "true": "🔄" } }, { "map": "model.is_override", "cases": { "true": "📌" } }, { "when": "model.reasoning", "text": "{model.reasoning|alias:reasoning}" }, { "map": "state.fast_mode", "cases": { "true": "⚡️", "false": "🐌" } }, { "when": "context.max_tokens", "text": " | 📚[{context.pct_used|meter:5:braille}]{context.max_tokens|num}", }, { "when": "cost.turn_usd", "text": " 💰{cost.turn_usd|fixed:4}" }, ], }, },}Структура
{ "schema": "openclaw.usageBar.v1", "scales": { "<name>": "глифы от низкого к высокому" }, // строка (1 глиф/символ) или массив "aliases": { "<table>": { "<value>": "<label>" } }, "output": { "sep": "", // объединяет оставшиеся элементы "default": [/* pieces */], // резервный вариант для любой поверхности "surfaces": { "discord": [/* pieces */], "telegram": [/* pieces */], }, },}Каждая поверхность представляет собой упорядоченный список элементов; движок отображает каждый из них, удаляет
пустые и объединяет оставшиеся с помощью sep. Для поверхности без отдельной записи используется
output.default.
Пути контракта
Элемент считывает значения из контракта текущего хода по пути с точками. Отсутствующие значения считаются
пустыми (поэтому условие when или |fallback сохраняет элемент чистым).
| Путь | Значение |
|---|---|
surface |
идентификатор канала (discord/telegram/и т. д.) |
agentId / chat_type |
идентификатор агента-владельца / тип интерфейса чата |
model.id / model.display_name / model.provider |
идентификатор модели / отображаемое имя / идентификатор провайдера |
model.actual, model.resolved_ref |
ссылка на провайдера/модель, фактически использованную для хода |
model.requested |
запрошенная ссылка на провайдера/модель (до резервного переключения) |
model.reasoning |
интенсивность (off–xhigh) |
model.is_fallback / model.is_override |
логическое значение: использовано резервное переключение / модель закреплена |
model.override_source / model.auth_mode |
метка источника переопределения / режим учётных данных (oauth, api-key, token, mixed, aws-sdk, unknown) |
state.fast_mode |
логическое значение: быстрый или медленный режим |
state.compactions |
количество операций Compaction за сеанс |
context.max_tokens / context.used_tokens / context.pct_used |
бюджет окна / занятые токены / использовано 0–100 |
usage.input_tokens / usage.output_tokens / usage.total_tokens |
сводные данные за ход |
usage.cache_read_tokens / usage.cache_write_tokens |
токены чтения из кеша и записи в кеш за ход |
usage.has_tokens / usage.has_split_tokens / usage.has_total_only_tokens |
ограничения отображения токенов |
usage.cache_hit_pct |
доля чтения из кеша в общем количестве токенов промпта |
usage.last.input_tokens / usage.last.output_tokens / usage.last.cache_hit_pct |
только последний вызов модели (также содержит cache_read_tokens, cache_write_tokens, total_tokens) |
cost.turn_usd / cost.available |
оценочная стоимость хода / удалось ли найти таблицу стоимости |
timing.duration_ms |
длительность хода по фактическому времени |
identity.name / identity.emoji / identity.avatar |
имя идентичности агента / эмодзи / аватар |
session.id |
идентификатор сеанса |
(Окна ограничений частоты запросов провайдера не входят в этот контракт; сейчас нет пути со значением-массивом, поэтому части each нечего перебирать.)
Операции
Передавайте значение через операции слева направо; сегмент, не являющийся операцией, используется как резервное значение.
| Операция | Эффект | Пример |
|---|---|---|
num |
компактное представление числа | 272000 -> 272k |
fixed:N |
N знаков после запятой (по умолчанию 2) | 0.0377 |
dur |
преобразование секунд в длительность | 14820 -> 4h07m |
pct |
добавление % |
96 -> 96% |
inv |
100 - x |
для преобразования использованного значения в оставшееся |
alias:TABLE |
поиск в aliases, возврат исходного значения при отсутствии в списке |
medium -> 🌗 |
meter:W:SCALE |
полоса из W глифов для значения 0–100 | [⣿⣿⠐⠐⠐] (meter:1 = один глиф) |
Формы частей
{ "text": "📚 {context.max_tokens|num}" }: литерал + интерполяция.{ "when": "<path>", "text": "..." }: отображать, только если значение по пути истинно.{ "map": "<path>", "cases": { "true": "⚡", "false": "🐌" } }: преобразование значения в глиф (случай_defaultохватывает несовпавшие значения).{ "each": "<array-path>", "item": "{label}" }: перебор пути со значением-массивом (ни один текущий путь контракта не является массивом).
Пример
{ "schema": "openclaw.usageBar.v1", "scales": { "braille": "⠐⡀⡄⡆⡇⣇⣧⣷⣿" }, "aliases": { "reasoning": { "medium": "🌗", "high": "🌕" } }, "output": { "surfaces": { "discord": [ { "text": "{model.display_name}" }, { "when": "model.reasoning", "text": " {model.reasoning|alias:reasoning}" }, { "map": "state.fast_mode", "cases": { "true": " ⚡", "false": " 🐌" } }, { "when": "context.max_tokens", "text": " | 📚 [{context.pct_used|meter:5:braille}]{context.max_tokens|num}", }, ], }, },}отображается, например, как claude-sonnet-4-6 🌗 🐌 | 📚 [⣿⣿⣿⣿⣧]272k.
Провайдеры и учётные данные
Данные об использовании скрыты, если не удаётся определить пригодные учётные данные для доступа к данным об использовании провайдера. OpenClaw
автоматически обнаруживает включённые плагины провайдеров, которые объявляют
contracts.usageProviders и реализуют как resolveUsageAuth, так и
fetchUsageSnapshot; отдельного списка разрешённых провайдеров в ядре нет. Статический
контракт ограничивает область обнаружения без импорта каждого плагина провайдера. Каждый
плагин отвечает за свою вышестоящую конечную точку и сопоставление ответа. Общий
снимок хранит названия планов, окна квот, балансы, расходы и бюджеты
в нейтральном к провайдерам виде для потребителей CLI, приложения и Control UI.
- Anthropic (Claude): токены OAuth в профилях аутентификации. Если у токена OAuth отсутствует
область
user:profile, используется резервный веб-сеансclaude.ai(CLAUDE_AI_SESSION_KEY,CLAUDE_WEB_SESSION_KEYили файл cookiesessionKey=вCLAUDE_WEB_COOKIE), если он задан. Ограничения для конкретных моделей и включённые ежемесячные расходы/бюджеты дополнительного использования учитываются, когда Anthropic сообщает о них. Явно заданный ключ Anthropic Admin API или автоматически обнаруженный профиль провайдераsk-ant-admin...вместо этого показывает расходы организации за 30 дней и историю Messages API. - ClawRouter: ключ API (
CLAWROUTER_API_KEY). Показывает месячное окно бюджета и типизированный бюджет в USD, если он настроен; в противном случае показывает совокупные расходы и сводку по запросам, токенам и стоимости. - DeepSeek: ключ API через переменную окружения, конфигурацию или хранилище аутентификации (
DEEPSEEK_API_KEY). Показывает баланс в каждой валюте, сообщаемой провайдером. - GitHub Copilot: токены OAuth в профилях аутентификации.
- Gemini CLI: токены OAuth в профилях аутентификации.
- MiniMax: ключ API или профиль аутентификации MiniMax OAuth. OpenClaw считает
minimax,minimax-cnиminimax-portalодной и той же поверхностью квот MiniMax, отдаёт предпочтение сохранённому MiniMax OAuth при его наличии, а иначе используетMINIMAX_CODE_PLAN_KEY,MINIMAX_CODING_API_KEYилиMINIMAX_API_KEY. При опросе данных об использовании хост Coding Plan определяется изmodels.providers.minimax-portal.baseUrlилиmodels.providers.minimax.baseUrl, если они настроены; в противном случае используется китайский хост MiniMax. Необработанные поля MiniMaxusage_percent/usagePercentозначают оставшуюся квоту, поэтому OpenClaw инвертирует их перед отображением; при наличии приоритет имеют поля на основе количества.- Метки окон берутся из полей часов/минут провайдера при их наличии, а затем
в качестве резерва используется интервал
start_time/end_time. - Если конечная точка плана программирования возвращает
model_remains, OpenClaw отдаёт предпочтение записи модели чата, определяет метку окна по временным меткам при отсутствии явных полейwindow_hours/window_minutesи включает имя модели в метку плана.
- Метки окон берутся из полей часов/минут провайдера при их наличии, а затем
в качестве резерва используется интервал
- OpenAI (план Codex/ChatGPT): токены OAuth в профилях аутентификации (заголовок
ChatGPT-Account-Idотправляется при наличии идентификатора учётной записи). Показывает план ChatGPT, сбрасываемые окна Codex и кредитный баланс, если он сообщается. Кредиты остаются кредитами провайдера; OpenClaw не обозначает их как доллары.OPENAI_ADMIN_KEYдобавляет расходы организации за 30 дней и историю использования completions, если ключ имеет доступ к Usage Dashboard. Учётные данные для инференса никогда не передаются API организации. - OpenRouter: ключ API или ключ API на основе OAuth (
OPENROUTER_API_KEYлибо профиль аутентификации). Объединяет конечную точку кредитов учётной записи с конечной точкой квоты ключа, поэтому при наличии доступа у учётных данных отображаются баланс и расходы учётной записи, бюджет ключа, а также ежедневное, еженедельное и ежемесячное использование. Любая из конечных точек может независимо дополнить снимок. - Venice: ключ API через переменную окружения, конфигурацию или хранилище аутентификации (
VENICE_API_KEY). Показывает балансы в USD и DIEM, а также использование распределения DIEM за эпоху, если оно сообщается. - Xiaomi MiMo: две отдельные поверхности использования. Оплата по мере использования работает с ключом API
(
XIAOMI_API_KEY); Token Plan использует отдельный ключ (XIAOMI_TOKEN_PLAN_API_KEY). В настоящее время ни одна из них не сообщает об окнах квот. - z.ai: ключ API через переменную окружения, конфигурацию или хранилище аутентификации (
ZAI_API_KEYилиZ_AI_API_KEY).