Concept internals
Seguimiento del uso
Qué es
- Obtiene el uso y la cuota del proveedor directamente desde el endpoint de uso de cada proveedor. No se realizan estimaciones de facturación del proveedor; solo se muestran los nombres de los planes, los períodos de cuota, los saldos, el gasto, los presupuestos, el historial de costes diarios, la atribución de tokens/modelos o los resúmenes del estado de la cuenta informados por el proveedor.
- La salida legible de los períodos de cuota se normaliza como
X% restante, incluso cuando un proveedor informa la cuota consumida, la cuota restante o solo recuentos sin procesar. Los proveedores sin períodos de cuota restablecibles muestran en su lugar el texto de resumen del proveedor (por ejemplo, un saldo). - El comando
/statusa nivel de sesión y la herramientasession_statusrecurren al registro de transcripción de la sesión cuando la instantánea de la sesión activa no contiene datos de tokens/modelos. Ese mecanismo alternativo completa los contadores de tokens/caché que faltan, puede recuperar la etiqueta del modelo activo en tiempo de ejecución y prefiere el total mayor orientado al prompt cuando faltan los metadatos de la sesión o su valor es menor (totalTokensFresh !== true, cero o inferior al valor derivado de la transcripción). Los valores activos distintos de cero siempre tienen prioridad sobre el mecanismo alternativo.
Dónde aparece
/statusen los chats: tarjeta de estado con los tokens de la sesión y el coste estimado (solo para modelos con clave de API). Cuando está disponible, se muestra el uso del proveedor del modelo actual, como un período normalizado conX% restanteo como texto de resumen del proveedor./usage off|tokens|fullen los chats: pie de uso por respuesta./usage costen los chats: resumen de costes locales agregado a partir de los registros de sesión de OpenClaw.- CLI:
openclaw status --usageimprime un desglose completo del uso y la cuota de cada proveedor. - CLI:
openclaw models statusenumera los perfiles de autenticación OAuth/token y muestra un resumen de los períodos de uso junto a cada proveedor que disponga de uno. - Interfaz de control: Uso muestra las tarjetas del plan y la facturación del proveedor sobre el análisis de tokens y costes estimados que OpenClaw deriva de las sesiones. Las credenciales de las API de administración de Anthropic y OpenAI añaden el gasto informado por el proveedor correspondiente al día actual, los últimos 7 días y los últimos 30 días, además de tendencias diarias, totales de tokens, modelos principales y categorías de costes.
- Interfaz de control: la ventana emergente del anillo de contexto del editor de chat muestra el uso del plan para los proveedores de suscripción: barras por período (5 horas, semanal y específicas del modelo) con horas de restablecimiento, el plan del proveedor cuando se conoce (por ejemplo,
Max (20x)) y créditos de uso adicional. Las sesiones facturadas mediante un plan ocultan las estimaciones monetarias por token; las sesiones facturadas mediante API mantienenCoste est.y el desglose de costes por tipo. Las configuraciones de la CLI de Claude Code (claude-cli) reutilizan el mismo uso de suscripción de Anthropic. - Barra de menús de macOS: aparece una sección raíz «Uso» debajo de Contexto cuando hay instantáneas de uso del proveedor disponibles. Consulta Barra de menús.
openclaw channels list ya no imprime el uso del proveedor; en su lugar, dirige a los usuarios a openclaw status o openclaw models list.
Historial de costes de Anthropic y OpenAI
La cuota de suscripción y la facturación de API son superficies distintas del proveedor:
- Las credenciales de suscripción/configuración de Anthropic siguen mostrando los períodos de cuota de Claude y los presupuestos opcionales de uso adicional. Define
ANTHROPIC_ADMIN_KEYoANTHROPIC_ADMIN_API_KEYpara mostrar en su lugar el historial de las API de uso y costes de la organización. Las credenciales de proveedor de Anthropic que comiencen porsk-ant-adminse detectan automáticamente. - OAuth de OpenAI ChatGPT/Codex sigue mostrando el plan, los períodos de cuota y el saldo de créditos. Define
OPENAI_ADMIN_KEYpara mostrar en su lugar el historial de costes y uso de finalizaciones de la organización; también puedes definirOPENAI_PROJECT_IDpara limitarlo a un solo proyecto. OpenClaw nunca envía credenciales de inferencia deOPENAI_API_KEY, de la configuración del proveedor ni de los perfiles de autenticación a las API de la organización, porque esas claves pueden pertenecer a endpoints personalizados.
Las credenciales de administración tienen prioridad porque proporcionan la facturación real de la organización. OpenClaw no combina estos totales informados por el proveedor con sus estimaciones locales de sesión; ambas secciones responden intencionadamente a preguntas distintas.
Modo predeterminado del pie de uso
/usage off|tokens|full establece el pie de una sesión y se recuerda para esa
sesión. messages.responseUsage establece inicialmente ese modo para las sesiones que aún no
hayan elegido uno, de modo que el pie pueda estar activado de forma predeterminada sin escribir /usage cada vez.
Define un modo para todos los canales o un mapa por canal con un valor alternativo default:
{ "messages": { "responseUsage": "tokens", // or: { "default": "off", "discord": "full" } },}Valores aceptados: "off", "tokens", "full" y el alias heredado "on" (se trata como "tokens").
Tres estados distintos de sesión
El campo responseUsage de una sesión tiene tres estados representables, cada uno con
una semántica diferente:
| Estado | Valor almacenado | Modo efectivo |
|---|---|---|
| Sin definir / heredado | undefined (ausente) |
Recurre al valor predeterminado de configuración messages.responseUsage y después a off. |
| Desactivado explícitamente | "off" (almacenado) |
Siempre desactivado; un valor predeterminado de configuración distinto de off no puede reactivar el pie. |
| Activado explícitamente | "tokens" o "full" (almacenado) |
Ese modo, independientemente del valor predeterminado de configuración. |
Precedencia
Modo efectivo = anulación de sesión → entrada de configuración del canal → default → off.
Un /usage off explícito se conserva como el valor literal "off" en la
sesión; no equivale a «sin definir». Un valor predeterminado de messages.responseUsage
distinto de off no puede volver a activar el pie después de que el usuario lo haya desactivado explícitamente.
Restablecer frente a desactivar
/usage offfuerza la desactivación del pie y conserva esa elección. Un valor predeterminado configurado distinto deoffno puede anularla./usage reset(alias:default,inherit,inherited,clear,unpin) borra la anulación de la sesión. La sesión pasa entonces a heredar el valor predeterminado efectivo de la configuración (messages.responseUsage). Si no hay ningún valor predeterminado configurado, el pie permanece desactivado.- Un restablecimiento completo de la sesión (
/reseto/new) o una rotación de sesión conserva la preferencia explícita del modo de uso, de modo que la elección de visualización del usuario persista tras las rotaciones de sesión. Solo/usage reset(y sus alias) borra la anulación.
Comportamiento de alternancia
/usage sin argumentos recorre: desactivado → tokens → completo → desactivado. El punto de partida
del ciclo es el modo actual efectivo (la anulación de sesión recurre
al valor predeterminado de configuración cuando no está definida), por lo que el ciclo siempre coincide con lo que
el usuario ve actualmente en el pie.
Configuración
Sin configuración, se mantiene el comportamiento anterior (pie desactivado hasta ejecutar /usage). Usa
/usage reset para borrar una anulación de sesión y volver a heredar el valor predeterminado configurado.
Pie personalizado de /usage full
/usage tokens siempre representa una línea simple Uso: X entrada / Y salida (más los sufijos de caché y
coste estimado cuando estén disponibles). Solo /usage full representa el pie más completo
descrito a continuación.
/usage full muestra un pie compacto integrado con el modelo, el razonamiento, el modo rápido/lento,
la ventana de contexto y el coste cuando esos campos están disponibles. No se requiere ningún archivo de plantilla
para el pie integrado.
messages.usageTemplate se reserva para diseños personalizados avanzados. El valor es una
ruta a un archivo JSON (admite ~) o un objeto insertado, y sustituye el pie integrado
cuando es válido. Las rutas de archivo se supervisan y se recargan en tiempo real cuando cambian.
{ "messages": { "usageTemplate": "~/.openclaw/usage-footer.json" }}Las plantillas ausentes o vacías recurren silenciosamente al pie integrado. Las plantillas configuradas que no se puedan leer o no sean válidas (JSON incorrecto o una estructura sin elementos de salida representables) también recurren al pie integrado y emiten una advertencia para el operador.
Parte de la estructura integrada para crear plantillas personalizadas y modifica después las partes que quieras cambiar:
{ "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}" }, ], }, },}Estructura
{ "schema": "openclaw.usageBar.v1", "scales": { "<name>": "low-to-high glyphs" }, // string (1 glyph/char) or array "aliases": { "<table>": { "<value>": "<label>" } }, "output": { "sep": "", // joins surviving pieces "default": [/* pieces */], // fallback for any surface "surfaces": { "discord": [/* pieces */], "telegram": [/* pieces */], }, },}Cada superficie es una lista ordenada de elementos; el motor representa cada uno, descarta
los vacíos y une los restantes con sep. Una superficie sin entrada utiliza
output.default.
Rutas del contrato
Un elemento lee valores del contrato de cada turno mediante una ruta con puntos. Los valores ausentes están
vacíos (por lo que una condición when o un valor alternativo |fallback mantiene limpio el elemento).
| Ruta | Significado |
|---|---|
surface |
id del canal (discord/telegram/etc.) |
agentId / chat_type |
id del agente propietario / tipo de superficie de chat |
model.id / model.display_name / model.provider |
id del modelo / nombre para mostrar / id del proveedor |
model.actual, model.resolved_ref |
referencia de proveedor/modelo utilizada realmente en el turno |
model.requested |
referencia de proveedor/modelo solicitada (antes de recurrir a la alternativa) |
model.reasoning |
esfuerzo (de off a xhigh) |
model.is_fallback / model.is_override |
booleano: se usó la alternativa / modelo fijado |
model.override_source / model.auth_mode |
etiqueta del origen de la anulación / modo de credencial (oauth, api-key, token, mixed, aws-sdk, unknown) |
state.fast_mode |
booleano: rápido frente a lento |
state.compactions |
cantidad de compactaciones de la sesión |
context.max_tokens / context.used_tokens / context.pct_used |
presupuesto de la ventana / tokens ocupados / porcentaje utilizado de 0 a 100 |
usage.input_tokens / usage.output_tokens / usage.total_tokens |
total agregado del turno |
usage.cache_read_tokens / usage.cache_write_tokens |
tokens de lectura y escritura de caché del turno |
usage.has_tokens / usage.has_split_tokens / usage.has_total_only_tokens |
condiciones de visualización de tokens |
usage.cache_hit_pct |
proporción de lecturas de caché sobre el total de tokens del prompt |
usage.last.input_tokens / usage.last.output_tokens / usage.last.cache_hit_pct |
solo la llamada final al modelo (también incluye cache_read_tokens, cache_write_tokens, total_tokens) |
cost.turn_usd / cost.available |
coste estimado del turno / si se pudo resolver una tabla de costes |
timing.duration_ms |
duración real transcurrida del turno |
identity.name / identity.emoji / identity.avatar |
nombre de identidad del agente / emoji / avatar |
session.id |
id de la sesión |
(Las ventanas de límites de frecuencia del proveedor no forman parte de este contrato; actualmente no hay ninguna ruta con valor de matriz, por lo que una pieza each no tiene nada sobre lo que iterar).
Verbos
Pase un valor por los verbos de izquierda a derecha; un segmento que no sea un verbo es el valor alternativo.
| Verbo | Efecto | Ejemplo |
|---|---|---|
num |
recuento compacto | 272000 -> 272k |
fixed:N |
N decimales (2 de forma predeterminada) | 0.0377 |
dur |
segundos a duración | 14820 -> 4h07m |
pct |
añade % |
96 -> 96% |
inv |
100 - x |
de utilizado a restante |
alias:TABLE |
busca en aliases y repite el valor si no aparece |
medium -> 🌗 |
meter:W:SCALE |
barra de glifos de W celdas para un valor de 0 a 100 | [⣿⣿⠐⠐⠐] (meter:1 = un glifo) |
Formas de las piezas
{ "text": "📚 {context.max_tokens|num}" }: literal + interpolación.{ "when": "<path>", "text": "..." }: se representa solo si el valor de la ruta es verdadero.{ "map": "<path>", "cases": { "true": "⚡", "false": "🐌" } }: convierte un valor en un glifo (un caso_defaultcubre los valores no coincidentes).{ "each": "<array-path>", "item": "{label}" }: itera sobre una ruta con valor de matriz (ninguna ruta del contrato actual es una matriz).
Ejemplo
{ "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}", }, ], }, },}representa, por ejemplo, claude-sonnet-4-6 🌗 🐌 | 📚 [⣿⣿⣿⣿⣧]272k.
Proveedores y credenciales
El uso se oculta cuando no se puede resolver una autenticación de uso válida del proveedor. OpenClaw
detecta automáticamente los plugins de proveedores habilitados que declaran
contracts.usageProviders e implementan tanto resolveUsageAuth como
fetchUsageSnapshot; no existe una lista de proveedores permitidos independiente en el núcleo. El contrato
estático mantiene acotada la detección sin importar todos los plugins de proveedores. Cada
plugin controla su endpoint externo y la asignación de respuestas. La instantánea
compartida mantiene los nombres de los planes, las ventanas de cuota, los saldos, el gasto y los presupuestos
independientes del proveedor para los consumidores de la CLI, la aplicación y la interfaz de control.
- Anthropic (Claude): tokens OAuth en los perfiles de autenticación. Si el token OAuth no incluye
el ámbito
user:profile, se recurre a una sesión web declaude.ai(CLAUDE_AI_SESSION_KEY,CLAUDE_WEB_SESSION_KEYo una cookiesessionKey=enCLAUDE_WEB_COOKIE) cuando está configurada. Se incluyen los límites específicos del modelo y los gastos/presupuestos mensuales habilitados de uso adicional cuando Anthropic los proporciona. En su lugar, una clave explícita de la API de administración de Anthropic, o un perfil de proveedorsk-ant-admin...detectado automáticamente, muestra el coste de la organización durante 30 días y el historial de la API de mensajes. - ClawRouter: clave de API (
CLAWROUTER_API_KEY). Muestra una ventana de presupuesto mensual y un presupuesto tipado en USD cuando están configurados; de lo contrario, muestra el gasto agregado y un resumen de solicitudes, tokens y costes. - DeepSeek: clave de API mediante el entorno, la configuración o el almacén de autenticación (
DEEPSEEK_API_KEY). Muestra el saldo de cada divisa notificada por el proveedor. - GitHub Copilot: tokens OAuth en los perfiles de autenticación.
- Gemini CLI: tokens OAuth en los perfiles de autenticación.
- MiniMax: clave de API o perfil de autenticación OAuth de MiniMax. OpenClaw considera
minimax,minimax-cnyminimax-portalcomo la misma superficie de cuota de MiniMax, da preferencia a las credenciales OAuth de MiniMax almacenadas cuando están disponibles y, de lo contrario, recurre aMINIMAX_CODE_PLAN_KEY,MINIMAX_CODING_API_KEYoMINIMAX_API_KEY. El sondeo de uso obtiene el host del plan de programación demodels.providers.minimax-portal.baseUrlomodels.providers.minimax.baseUrlcuando están configurados; de lo contrario, utiliza el host de MiniMax para China. Los campos sin procesarusage_percent/usagePercentde MiniMax indican la cuota restante, por lo que OpenClaw los invierte antes de mostrarlos; los campos basados en recuentos tienen prioridad cuando están presentes.- Las etiquetas de las ventanas proceden de los campos de horas/minutos del proveedor cuando están presentes y, después,
recurren al intervalo entre
start_timeyend_time. - Si el endpoint del plan de programación devuelve
model_remains, OpenClaw da prioridad a la entrada del modelo de chat, obtiene la etiqueta de la ventana a partir de las marcas de tiempo cuando no existen los campos explícitoswindow_hours/window_minutese incluye el nombre del modelo en la etiqueta del plan.
- Las etiquetas de las ventanas proceden de los campos de horas/minutos del proveedor cuando están presentes y, después,
recurren al intervalo entre
- OpenAI (plan Codex/ChatGPT): tokens OAuth en los perfiles de autenticación (se envía el encabezado
ChatGPT-Account-Idcuando existe un id de cuenta). Muestra el plan de ChatGPT, las ventanas reiniciables de Codex y un saldo de créditos cuando se proporciona. Los créditos siguen siendo créditos del proveedor; OpenClaw no los etiqueta como dólares.OPENAI_ADMIN_KEYañade el coste de la organización durante 30 días y el historial de uso de completaciones cuando la clave tiene acceso al panel de uso. Las credenciales de inferencia nunca se reenvían a las API de la organización. - OpenRouter: clave de API o clave de API respaldada por OAuth (
OPENROUTER_API_KEYo un perfil de autenticación). Combina el endpoint de créditos de la cuenta con el endpoint de cuota de la clave, por lo que el saldo/gasto de la cuenta, el presupuesto de la clave y el uso diario/semanal/mensual aparecen cuando la credencial permite acceder a ellos. Cualquiera de los dos endpoints puede enriquecer la instantánea de forma independiente. - Venice: clave de API mediante el entorno, la configuración o el almacén de autenticación (
VENICE_API_KEY). Muestra los saldos en USD y DIEM, además del uso de la asignación de épocas de DIEM cuando se proporciona. - Xiaomi MiMo: dos superficies de uso independientes. El pago por uso utiliza una clave de API
(
XIAOMI_API_KEY); el plan de tokens utiliza una clave independiente (XIAOMI_TOKEN_PLAN_API_KEY). Actualmente, ninguno de los dos proporciona ventanas de cuota. - z.ai: clave de API mediante el entorno, la configuración o el almacén de autenticación (
ZAI_API_KEYoZ_AI_API_KEY).