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:

jsonc
{  "messages": {    "responseUsage": "tokens",    // или: { "default": "off", "discord": "full" }  },}

Допустимые значения: "off", "tokens", "full" и устаревший псевдоним "on" (обрабатывается как "tokens").

Три различных состояния сеанса

Поле responseUsage сеанса может представлять три состояния, каждое со своей семантикой:

Состояние Сохранённое значение Действующий режим
Не задано / наследование undefined (отсутствует) Использует значение конфигурации messages.responseUsage, затем off.
Явно выключено "off" (сохранено) Всегда выключено; значение конфигурации, отличное от выключенного, не может повторно включить нижний колонтитул.
Явно включено "tokens" или "full" (сохранено) Этот режим независимо от значения конфигурации по умолчанию.

Приоритет

Действующий режим = переопределение сеанса → запись конфигурации канала → defaultoff.

Явное значение /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 (поддерживает ~) или встроенный объект и заменяет встроенный нижний колонтитул, если оно допустимо. Изменения файла по указанному пути отслеживаются, и он перезагружается в реальном времени.

json
{  "messages": {    "usageTemplate": "~/.openclaw/usage-footer.json"  }}

При отсутствующем или пустом шаблоне без уведомлений используется встроенный нижний колонтитул. При недоступном для чтения или недопустимом настроенном шаблоне (некорректный JSON либо структура без отображаемых элементов) также используется встроенный нижний колонтитул и выводится предупреждение оператору.

Возьмите встроенную структуру за основу пользовательского шаблона, затем измените нужные части:

jsonc
{  "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}" },      ],    },  },}

Структура

jsonc
{  "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 интенсивность (offxhigh)
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}" }: перебор пути со значением-массивом (ни один текущий путь контракта не является массивом).

Пример

jsonc
{  "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 или файл cookie sessionKey= в 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. Необработанные поля MiniMax usage_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).

Связанные материалы

Was this useful?
On this page

On this page