Concept internals
Nutzungsverfolgung
Was es ist
- Ruft Nutzung/Kontingent direkt vom Nutzungsendpunkt jedes Providers ab. Keine geschätzte Provider-Abrechnung; ausschließlich vom Provider gemeldete Plannamen, Kontingentzeiträume, Guthaben, Ausgaben, Budgets, täglicher Kostenverlauf, Token-/Modellzuordnung oder Zusammenfassungen des Kontostatus.
- Die menschenlesbare Ausgabe für Kontingentzeiträume wird auf
X% leftnormalisiert, selbst wenn ein Provider verbrauchtes Kontingent, verbleibendes Kontingent oder nur Rohwerte meldet. Provider ohne zurücksetzbare Kontingentzeiträume zeigen stattdessen einen Provider-Zusammenfassungstext an (beispielsweise ein Guthaben). - Das sitzungsbezogene
/statusund das Toolsession_statusgreifen auf das Transkriptprotokoll der Sitzung zurück, wenn im Live-Sitzungssnapshot Token-/Modelldaten fehlen. Dieser Rückgriff ergänzt fehlende Token-/Cache-Zähler, kann die Bezeichnung des aktiven Laufzeitmodells wiederherstellen und bevorzugt den größeren promptorientierten Gesamtwert, wenn Sitzungsmetadaten fehlen oder kleiner sind (totalTokensFresh !== true, null oder unter dem aus dem Transkript abgeleiteten Wert). Live-Werte ungleich null haben stets Vorrang vor diesem Rückgriff.
Wo es angezeigt wird
/statusin Chats: Statuskarte mit Sitzungstoken und geschätzten Kosten (nur Modelle mit API-Schlüssel). Die Provider-Nutzung wird, sofern verfügbar, für den Provider des aktuellen Modells als normalisierter ZeitraumX% leftoder als Provider-Zusammenfassungstext angezeigt./usage off|tokens|fullin Chats: Nutzungsfußzeile pro Antwort./usage costin Chats: lokale Kostenzusammenfassung, aggregiert aus OpenClaw-Sitzungsprotokollen.- CLI:
openclaw status --usagegibt eine vollständige Aufschlüsselung von Nutzung und Kontingent pro Provider aus. - CLI:
openclaw models statuslistet OAuth-/Token-Authentifizierungsprofile auf und zeigt neben jedem Provider, für den eine solche vorhanden ist, eine Zusammenfassung des Nutzungszeitraums an. - Control UI: Nutzung zeigt Karten für Provider-Plan und -Abrechnung oberhalb der aus OpenClaw-Sitzungen abgeleiteten Token- und geschätzten Kostenanalyse. Anmeldedaten für die Admin-APIs von Anthropic und OpenAI ergänzen vom Provider gemeldete Ausgaben für heute, 7 Tage und 30 Tage, tägliche Trends, Token-Gesamtwerte, meistgenutzte Modelle und Kostenkategorien.
- Control UI: Das Kontextkreis-Popover des Chat-Eingabefelds zeigt die Plannutzung für Abonnement-Provider – Balken pro Zeitraum (5 Stunden, wöchentlich, modellspezifisch) mit Rücksetzzeiten, den Provider-Plan, sofern bekannt (beispielsweise
Max (20x)), und Guthaben für zusätzliche Nutzung. Über einen Plan abgerechnete Sitzungen blenden Dollar-Schätzungen pro Token aus; über die API abgerechnete Sitzungen behaltenEst. costund die Kostenaufschlüsselung nach Typ bei. Claude-Code-CLI-Konfigurationen (claude-cli) verwenden dieselbe Anthropic-Abonnementnutzung. - macOS-Menüleiste: Unter Kontext wird ein Hauptabschnitt „Nutzung“ angezeigt, wenn Snapshots der Provider-Nutzung verfügbar sind. Siehe Menüleiste.
openclaw channels list gibt die Provider-Nutzung nicht mehr aus; stattdessen verweist es Benutzer auf openclaw status oder openclaw models list.
Kostenverlauf von Anthropic und OpenAI
Abonnementkontingent und API-Abrechnung sind unterschiedliche Provider-Oberflächen:
- Anmeldedaten für Anthropic-Abonnements/-Konfigurationen zeigen weiterhin Claude-Kontingentzeiträume und optionale Budgets für zusätzliche Nutzung an. Legen Sie
ANTHROPIC_ADMIN_KEYoderANTHROPIC_ADMIN_API_KEYfest, um stattdessen den Verlauf der organisationsweiten Usage and Cost API anzuzeigen. Provider-Anmeldedaten von Anthropic, die mitsk-ant-adminbeginnen, werden automatisch erkannt. - OpenAI-ChatGPT-/Codex-OAuth zeigt weiterhin Plan, Kontingentzeiträume und Guthaben an. Legen Sie
OPENAI_ADMIN_KEYfest, um stattdessen den Verlauf der organisationsweiten Kosten und Abschlussnutzung anzuzeigen; legen Sie optionalOPENAI_PROJECT_IDfest, um ihn auf ein Projekt zu beschränken. OpenClaw sendet niemals Inferenz-Anmeldedaten ausOPENAI_API_KEY, der Provider-Konfiguration oder Authentifizierungsprofilen an Organisations-APIs, da diese Schlüssel zu benutzerdefinierten Endpunkten gehören können.
Admin-Anmeldedaten haben Vorrang, da sie die tatsächliche Organisationsabrechnung bereitstellen. OpenClaw kombiniert diese vom Provider gemeldeten Gesamtwerte nicht mit seinen lokalen Sitzungsschätzungen; die beiden Abschnitte beantworten absichtlich unterschiedliche Fragen.
Standardmodus der Nutzungsfußzeile
/usage off|tokens|full legt die Fußzeile für eine Sitzung fest und wird für diese
Sitzung gespeichert. messages.responseUsage legt diesen Modus als Ausgangswert für Sitzungen fest, die noch keinen
ausgewählt haben, sodass die Fußzeile standardmäßig aktiviert sein kann, ohne jedes Mal /usage einzugeben.
Legen Sie einen Modus für jeden Kanal oder eine kanalspezifische Zuordnung mit einem default-Rückgriff fest:
{ "messages": { "responseUsage": "tokens", // oder: { "default": "off", "discord": "full" } },}Akzeptierte Werte: "off", "tokens", "full" und der veraltete Alias "on" (wird als "tokens" behandelt).
Drei unterschiedliche Sitzungszustände
Das Feld responseUsage einer Sitzung kann drei Zustände darstellen, die jeweils
unterschiedliche Semantiken haben:
| Zustand | Gespeicherter Wert | Wirksamer Modus |
|---|---|---|
| Nicht gesetzt / übernehmen | undefined (nicht vorhanden) |
Greift auf den Konfigurationsstandard messages.responseUsage, dann auf off zurück. |
| Explizit aus | "off" (gespeichert) |
Immer aus; ein Konfigurationsstandard ungleich „aus“ kann die Fußzeile nicht erneut aktivieren. |
| Explizit ein | "tokens" oder "full" (gespeichert) |
Dieser Modus gilt unabhängig vom Konfigurationsstandard. |
Rangfolge
Wirksamer Modus = Sitzungsüberschreibung → Kanalkonfigurationseintrag → default → off.
Ein explizites /usage off wird als Literalwert "off" in der
Sitzung dauerhaft gespeichert und ist nicht dasselbe wie „nicht gesetzt“. Ein Standardwert messages.responseUsage,
der nicht „aus“ ist, kann die Fußzeile nicht wieder aktivieren, nachdem der Benutzer sie ausdrücklich deaktiviert hat.
Zurücksetzen oder Ausschalten
/usage offerzwingt das Ausschalten der Fußzeile und speichert diese Auswahl dauerhaft. Ein konfigurierter Standardwert ungleich „aus“ kann dies nicht überschreiben./usage reset(Aliasse:default,inherit,inherited,clear,unpin) löscht die Sitzungsüberschreibung. Die Sitzung übernimmt anschließend den wirksamen Konfigurationsstandard (messages.responseUsage). Ist kein Standard konfiguriert, bleibt die Fußzeile ausgeschaltet.- Ein vollständiges Zurücksetzen der Sitzung (
/resetoder/new) oder ein Sitzungswechsel behält die explizite Einstellung des Nutzungsmodus bei, sodass die Anzeigeauswahl des Benutzers Sitzungswechsel überdauert. Nur/usage reset(und seine Aliasse) löscht die Überschreibung.
Umschaltverhalten
/usage ohne Argumente wechselt zyklisch: aus → Token → vollständig → aus. Der Ausgangspunkt
des Zyklus ist der wirksame aktuelle Modus (die Sitzungsüberschreibung greift, wenn sie nicht gesetzt ist,
auf den Konfigurationsstandard zurück), sodass der Zyklus stets dem entspricht, was
der Benutzer derzeit in der Fußzeile sieht.
Konfiguration
Ohne Konfiguration bleibt das bisherige Verhalten bestehen (Fußzeile aus, bis /usage). Verwenden Sie
/usage reset, um eine Sitzungsüberschreibung zu löschen und den konfigurierten Standard erneut zu übernehmen.
Benutzerdefinierte /usage full-Fußzeile
/usage tokens rendert stets eine einfache Usage: X in / Y out-Zeile (zuzüglich Cache- und
geschätzter Kostenzusätze, sofern verfügbar). Nur /usage full rendert die nachfolgend beschriebene
umfangreichere Fußzeile.
/usage full zeigt eine integrierte kompakte Fußzeile mit Modell, Reasoning, schnell/langsam,
Kontextfenster und Kosten an, sofern diese Felder verfügbar sind. Für die integrierte Fußzeile
ist keine Vorlagendatei erforderlich.
messages.usageTemplate ist ausschließlich für fortgeschrittene benutzerdefinierte Layouts vorgesehen. Der Wert ist ein
JSON-Dateipfad (unterstützt ~) oder ein Inline-Objekt und ersetzt die integrierte
Fußzeile, wenn er gültig ist. Ein Dateipfad wird überwacht und bei Änderungen live neu geladen.
{ "messages": { "usageTemplate": "~/.openclaw/usage-footer.json" }}Fehlende oder leere Vorlagen greifen ohne Meldung auf die integrierte Fußzeile zurück. Nicht lesbare oder ungültige konfigurierte Vorlagen (fehlerhaftes JSON oder eine Struktur ohne renderbare Ausgabebestandteile) greifen ebenfalls auf die integrierte Fußzeile zurück und geben eine Warnung für den Betreiber aus.
Beginnen Sie benutzerdefinierte Vorlagen mit der integrierten Struktur und bearbeiten Sie anschließend die Teile, die Sie ändern möchten:
{ "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}" }, ], }, },}Struktur
{ "schema": "openclaw.usageBar.v1", "scales": { "<name>": "Glyphen von niedrig bis hoch" }, // Zeichenfolge (1 Glyphe/Zeichen) oder Array "aliases": { "<table>": { "<value>": "<label>" } }, "output": { "sep": "", // verbindet verbleibende Bestandteile "default": [/* pieces */], // Rückgriff für jede Oberfläche "surfaces": { "discord": [/* pieces */], "telegram": [/* pieces */], }, },}Jede Oberfläche ist eine geordnete Liste von Bestandteilen; die Engine rendert jeden Bestandteil, verwirft
leere und verbindet die verbleibenden mit sep. Eine Oberfläche ohne Eintrag verwendet
output.default.
Vertragspfade
Ein Bestandteil liest Werte über einen Punktpfad aus dem Vertrag pro Durchlauf. Nicht vorhandene Werte sind
leer (sodass eine when-Bedingung oder ein |fallback den Bestandteil sauber hält).
| Pfad | Bedeutung |
|---|---|
surface |
Kanal-ID (discord/telegram/usw.) |
agentId / chat_type |
ID des zuständigen Agenten / Art der Chat-Oberfläche |
model.id / model.display_name / model.provider |
Modell-ID / Anzeigename / Provider-ID |
model.actual, model.resolved_ref |
tatsächlich für den Turn verwendete Provider-/Modellreferenz |
model.requested |
angeforderte Provider-/Modellreferenz (vor dem Fallback) |
model.reasoning |
Aufwand (off bis xhigh) |
model.is_fallback / model.is_override |
boolescher Wert: Fallback verwendet / Modell festgelegt |
model.override_source / model.auth_mode |
Bezeichnung der Override-Quelle / Anmeldedatenmodus (oauth, api-key, token, mixed, aws-sdk, unknown) |
state.fast_mode |
boolescher Wert: schnell oder langsam |
state.compactions |
Anzahl der Compactions für die Sitzung |
context.max_tokens / context.used_tokens / context.pct_used |
Fensterbudget / belegte Token / 0–100 verwendet |
usage.input_tokens / usage.output_tokens / usage.total_tokens |
Turn-Aggregat |
usage.cache_read_tokens / usage.cache_write_tokens |
Cache-Lese- und Cache-Schreib-Token für den Turn |
usage.has_tokens / usage.has_split_tokens / usage.has_total_only_tokens |
Schutzbedingungen für die Token-Anzeige |
usage.cache_hit_pct |
Anteil der Cache-Lese-Token an allen Prompt-Token |
usage.last.input_tokens / usage.last.output_tokens / usage.last.cache_hit_pct |
nur der letzte Modellaufruf (enthält außerdem cache_read_tokens, cache_write_tokens, total_tokens) |
cost.turn_usd / cost.available |
geschätzte Turn-Kosten / ob eine Kostentabelle aufgelöst wurde |
timing.duration_ms |
Turn-Dauer nach Wanduhrzeit |
identity.name / identity.emoji / identity.avatar |
Name / Emoji / Avatar der Agentenidentität |
session.id |
Sitzungs-ID |
(Provider-Zeitfenster für Ratenbegrenzungen sind nicht Teil dieses Vertrags; derzeit gibt es keinen Pfad mit einem Array-Wert, daher kann ein each-Element über nichts iterieren.)
Verben
Leiten Sie einen Wert von links nach rechts durch Verben; ein Segment, das kein Verb ist, dient als Fallback.
| Verb | Wirkung | Beispiel |
|---|---|---|
num |
kompakte Anzahl | 272000 -> 272k |
fixed:N |
N Dezimalstellen (0..100, Standardwert 2) |
0.0377 |
dur |
Sekunden in eine Dauer umwandeln | 14820 -> 4h07m |
pct |
% anhängen |
96 -> 96% |
inv |
100 - x |
um „verwendet“ in „verbleibend“ umzuwandeln |
alias:TABLE |
in aliases nachschlagen, nicht aufgeführte Werte unverändert ausgeben |
medium -> 🌗 |
meter:W:SCALE |
W-Zellen-Glyphenleiste für einen Wert von 0–100 | [⣿⣿⠐⠐⠐] (meter:1 = eine Glyphe) |
fixed:N akzeptiert nur eine vollständige dezimale Ganzzahl von 0 bis 100. Ungültige
Genauigkeitsargumente führen dazu, dass diese Interpolation leer bleibt.
meter:W:SCALE akzeptiert nur eine vollständige dezimale Ganzzahl als Breite von 1 bis 100. Lassen Sie die Breite leer, um den Standardwert 5 (meter::braille) zu verwenden; ungültige
Breiten führen dazu, dass diese Interpolation leer bleibt.
Elementformen
{ "text": "📚 {context.max_tokens|num}" }: Literal + Interpolation.{ "when": "<path>", "text": "..." }: nur rendern, wenn der Pfad einen Wahrheitswert ergibt.{ "map": "<path>", "cases": { "true": "⚡", "false": "🐌" } }: Wert einer Glyphe zuordnen (ein_default-Fall deckt nicht übereinstimmende Werte ab).{ "each": "<array-path>", "item": "{label}" }: über einen Pfad mit Array-Wert iterieren (kein aktueller Vertragspfad ist ein Array).
Beispiel
{ "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}", }, ], }, },}rendert beispielsweise claude-sonnet-4-6 🌗 🐌 | 📚 [⣿⣿⣿⣿⣧]272k.
Provider + Anmeldedaten
Die Nutzung wird ausgeblendet, wenn keine verwendbare Provider-Authentifizierung für Nutzungsdaten aufgelöst werden kann. OpenClaw
erkennt automatisch aktivierte Provider-Plugins, die
contracts.usageProviders deklarieren und sowohl resolveUsageAuth als auch
fetchUsageSnapshot implementieren; es gibt keine separate Zulassungsliste für Core-Provider. Der statische
Vertrag begrenzt den Umfang der Erkennung, ohne jedes Provider-Plugin zu importieren. Jedes
Plugin ist für seinen Upstream-Endpunkt und die Zuordnung der Antworten zuständig. Der
gemeinsame Snapshot hält Plannamen, Kontingentfenster, Salden, Ausgaben und Budgets
Provider-neutral für Verbraucher in CLI, App und Control UI.
- Anthropic (Claude): OAuth-Token in Authentifizierungsprofilen. Wenn dem OAuth-Token der
Geltungsbereich
user:profilefehlt, erfolgt bei entsprechender Konfiguration ein Fallback auf eineclaude.ai-Websitzung (CLAUDE_AI_SESSION_KEY,CLAUDE_WEB_SESSION_KEYoder einsessionKey=-Cookie inCLAUDE_WEB_COOKIE). Modellspezifische Limits sowie aktivierte monatliche Ausgaben/Budgets für zusätzliche Nutzung werden einbezogen, wenn Anthropic sie meldet. Ein expliziter Anthropic-Admin-API-Schlüssel oder ein automatisch erkanntessk-ant-admin...-Providerprofil zeigt stattdessen die Organisationskosten der letzten 30 Tage und den Verlauf der Messages API. - ClawRouter: API-Schlüssel (
CLAWROUTER_API_KEY). Zeigt ein monatliches Budgetfenster und ein typisiertes USD-Budget an, wenn es konfiguriert ist; andernfalls werden die Gesamtausgaben und eine Zusammenfassung von Anfragen, Token und Kosten angezeigt. - DeepSeek: API-Schlüssel über Umgebung/Konfiguration/Authentifizierungsspeicher (
DEEPSEEK_API_KEY). Zeigt jeden vom Provider gemeldeten Währungssaldo an. - GitHub Copilot: OAuth-Token in Authentifizierungsprofilen.
- Gemini CLI: OAuth-Token in Authentifizierungsprofilen.
- MiniMax: API-Schlüssel oder MiniMax-OAuth-Authentifizierungsprofil. OpenClaw behandelt
minimax,minimax-cnundminimax-portalals dieselbe MiniMax-Kontingentoberfläche, bevorzugt vorhandenes gespeichertes MiniMax-OAuth und verwendet andernfalls als FallbackMINIMAX_CODE_PLAN_KEY,MINIMAX_CODING_API_KEYoderMINIMAX_API_KEY. Die Nutzungsabfrage leitet den Coding-Plan-Host ausmodels.providers.minimax-portal.baseUrlodermodels.providers.minimax.baseUrlab, wenn diese konfiguriert sind, und verwendet andernfalls den MiniMax-CN-Host. Die Rohfelderusage_percent/usagePercentvon MiniMax geben das verbleibende Kontingent an, daher invertiert OpenClaw sie vor der Anzeige; anzahlbasierte Felder haben Vorrang, wenn sie vorhanden sind.- Fensterbezeichnungen stammen, sofern vorhanden, aus den Stunden-/Minutenfeldern des Providers und
verwenden anschließend als Fallback die Spanne
start_time/end_time. - Wenn der Coding-Plan-Endpunkt
model_remainszurückgibt, bevorzugt OpenClaw den Chatmodelleintrag, leitet die Fensterbezeichnung aus Zeitstempeln ab, wenn explizite Felderwindow_hours/window_minutesfehlen, und nimmt den Modellnamen in die Planbezeichnung auf.
- Fensterbezeichnungen stammen, sofern vorhanden, aus den Stunden-/Minutenfeldern des Providers und
verwenden anschließend als Fallback die Spanne
- OpenAI (Codex-/ChatGPT-Plan): OAuth-Token in Authentifizierungsprofilen (der
ChatGPT-Account-Id-Header wird gesendet, wenn eine Konto-ID vorhanden ist). Zeigt den ChatGPT-Plan, zurücksetzbare Codex-Fenster und einen Kreditsaldo an, wenn diese gemeldet werden. Kredite bleiben Provider- Kredite; OpenClaw kennzeichnet sie nicht als Dollar.OPENAI_ADMIN_KEYergänzt die Organisationskosten der letzten 30 Tage und den Verlauf der Completions-Nutzung, wenn der Schlüssel Zugriff auf das Usage Dashboard hat. Anmeldedaten für Inferenz werden niemals an Organisations-APIs weitergeleitet. - OpenRouter: API-Schlüssel oder OAuth-gestützter API-Schlüssel (
OPENROUTER_API_KEYoder ein Authentifizierungsprofil). Kombiniert den Endpunkt für Kontoguthaben mit dem Endpunkt für Schlüssellimits, sodass Kontosaldo/-ausgaben, Schlüsselbudget und tägliche/wöchentliche/monatliche Nutzung angezeigt werden, wenn die Anmeldedaten darauf zugreifen können. Beide Endpunkte können den Snapshot unabhängig voneinander anreichern. - Venice: API-Schlüssel über Umgebung/Konfiguration/Authentifizierungsspeicher (
VENICE_API_KEY). Zeigt USD- und DIEM-Salden sowie die Nutzung der DIEM-Epochenzuweisung an, wenn diese gemeldet werden. - Xiaomi MiMo: zwei separate Nutzungsoberflächen. Die nutzungsabhängige Abrechnung verwendet einen API-Schlüssel
(
XIAOMI_API_KEY); der Token-Plan verwendet einen separaten Schlüssel (XIAOMI_TOKEN_PLAN_API_KEY). Derzeit meldet keine der beiden Oberflächen Kontingentfenster. - z.ai: API-Schlüssel über Umgebung/Konfiguration/Authentifizierungsspeicher (
ZAI_API_KEYoderZ_AI_API_KEY).