Concept internals
उपयोग ट्रैकिंग
यह क्या है
- प्रदाता उपयोग/कोटा सीधे उनके उपयोग endpoints से खींचता है।
- कोई अनुमानित लागत नहीं; केवल प्रदाता-रिपोर्टेड कोटा विंडो या खाता-स्थिति सारांश।
- मानव-पठनीय कोटा-विंडो स्थिति आउटपुट को
X% leftमें सामान्यीकृत किया जाता है, भले ही upstream API consumed quota, remaining quota, या केवल raw counts रिपोर्ट करे। जिन प्रदाताओं के पास resettable quota windows नहीं हैं, वे इसके बजाय प्रदाता सारांश पाठ दिखा सकते हैं, जैसे balance। - सत्र-स्तर
/statusऔरsession_statusनवीनतम transcript usage entry पर fallback कर सकते हैं जब live session snapshot sparse हो। यह fallback missing token/cache counters भरता है, active runtime model label पुनर्प्राप्त कर सकता है, और session metadata missing या छोटा होने पर बड़े prompt-oriented total को प्राथमिकता देता है। मौजूदा nonzero live values फिर भी जीतती हैं।
यह कहां दिखता है
- chats में
/status: session tokens + estimated cost (केवल API key) के साथ emoji-rich status card। Provider usage current model provider के लिए, उपलब्ध होने पर, normalizedX% leftwindow या provider summary text के रूप में दिखता है। - chats में
/usage off|tokens|full: प्रति-response usage footer। - chats में
/usage cost: OpenClaw session logs से aggregated local cost summary। - CLI:
openclaw status --usageपूरा per-provider breakdown प्रिंट करता है। - CLI:
openclaw channels listprovider config के साथ वही usage snapshot प्रिंट करता है (skip करने के लिए--no-usageइस्तेमाल करें)। - macOS menu bar: Context के अंतर्गत "Usage" section (केवल उपलब्ध होने पर)।
डिफॉल्ट usage footer mode
/usage off|tokens|full किसी session के लिए footer सेट करता है और उस
session के लिए याद रखा जाता है। messages.responseUsage उन sessions के लिए mode seed करता है जिन्होंने
कोई mode नहीं चुना है, ताकि हर बार /usage टाइप किए बिना footer default रूप से on हो सके।
हर channel के लिए एक mode सेट करें, या default fallback के साथ per-channel map:
{ "messages": { "responseUsage": "tokens", // or: { "default": "off", "discord": "full" } },}तीन अलग-अलग session states
किसी session के responseUsage field में तीन representable states हैं, हर एक की
semantics अलग है:
| State | Stored value | Effective mode |
|---|---|---|
| Unset / inherit | undefined (absent) |
messages.responseUsage config default, फिर off तक falls through। |
| Explicit off | "off" (stored) |
हमेशा off — non-off config default footer को दोबारा enable नहीं कर सकता। |
| Explicit on | "tokens" या "full" (stored) |
वही mode, config default की परवाह किए बिना। |
प्राथमिकता
Effective mode = session override → channel config entry → default → off.
Explicit /usage off session में literal value "off" के रूप में persisted होता है,
"unset" जैसा नहीं। इसका मतलब है कि non-off messages.responseUsage
default, user द्वारा explicit disable करने के बाद footer को वापस on नहीं कर सकता।
Reset करना बनाम off करना
/usage off— footer को off करने के लिए मजबूर करता है और उस choice को persist करता है। Configured non-off default इसे override नहीं कर सकता।/usage reset(aliases:inherit,clear,default) — session override clear करता है। फिर session effective config default (messages.responseUsage) को inherits करता है। अगर कोई default configured नहीं है, तो footer off रहता है (पहले जैसा ही)। इसे explicitly footer on किए बिना "default पर वापस जाने" के लिए इस्तेमाल करें।- Full session reset (
/resetया/new) या session rollover explicit usage-mode preference को preserves करता है ताकि user की display choice session rollovers के बाद भी बनी रहे। केवल/usage reset(और उसके aliases) वास्तव में override clear करते हैं।
Toggle behavior
बिना arguments के /usage cycle करता है: off → tokens → full → off। Cycle का starting point
effective current mode होता है (unset होने पर session override config default तक falling through
करता है), इसलिए cycle हमेशा उस चीज़ से consistent रहता है जो
user footer में देखता है।
Config
Config न होने पर previous behavior बना रहता है (footer /usage तक off)। किसी session override को clear करने और configured default को फिर से inherit करने के लिए
/usage reset इस्तेमाल करें।
Custom /usage full footer
/usage full model, reasoning, fast/slow,
context window, और cost के साथ built-in compact footer दिखाता है जब ये fields उपलब्ध हों। Token और cache fields
custom templates के लिए उपलब्ध रहते हैं। कोई template file जरूरी नहीं है।
messages.usageTemplate केवल advanced custom layouts के लिए है। Value एक
JSON file path (~ supported) या inline object है, और valid होने पर यह built-in
footer को replace करता है:
{ "messages": { "usageTemplate": "~/.openclaw/usage-footer.json" }}Missing या empty templates चुपचाप built-in footer पर fall back करते हैं। Unreadable या invalid configured templates भी built-in footer पर fall back करते हैं और operator warning emit करते हैं।
Custom templates को built-in shape से शुरू करें, फिर वे parts edit करें जिन्हें आप बदलना चाहते हैं:
{ "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": "\u00A0| 📚[{context.pct_used|meter:5:braille}]{context.max_tokens|num}", }, { "when": "cost.turn_usd", "text": "\u00A0💰{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": "\u00A0| 📚[{context.pct_used|meter:5:braille}]{context.max_tokens|num}", }, { "when": "cost.turn_usd", "text": "\u00A0💰{cost.turn_usd|fixed:4}" }, ], }, },}Shape
{ "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 */ ], }, },}हर surface pieces की ordered list है; engine हर item render करता है, empties drop करता है,
और survivors को sep से join करता है। Entry न होने वाली surface
output.default इस्तेमाल करती है।
Contract Paths
एक piece per-turn contract से dot-path द्वारा values पढ़ता है। Absent values
empty होते हैं (इसलिए when guard या |fallback piece को clean रखता है)।
| Path | Meaning |
|---|---|
surface |
channel id (discord/telegram/etc.) |
model.provider / model.display_name |
provider id / model id |
model.reasoning |
effort (off से xhigh तक) |
model.is_fallback / model.is_override |
bool: fallback used / model pinned |
state.fast_mode |
bool: fast vs slow |
context.max_tokens / context.pct_used |
window budget / 0-100 used |
usage.input_tokens / usage.output_tokens / usage.total_tokens |
turn aggregate |
usage.has_split_tokens / usage.has_total_only_tokens / usage.cache_hit_pct |
token display guards और cache percent |
usage.last.input_tokens / usage.last.output_tokens / usage.last.cache_hit_pct |
केवल final model call |
cost.turn_usd |
estimated turn cost |
identity.name / identity.emoji |
agent name / चुना हुआ emoji |
(Provider rate-limit windows इस contract में नहीं हैं।)
Verbs
Value को verbs से left to right pipe करें; non-verb segment fallback है।
| Verb | Effect | Example |
|---|---|---|
num |
compact count | 272000 -> 272k |
fixed:N |
N decimals (default 2) | 0.0377 |
dur |
seconds to duration | 14820 -> 4h07m |
pct |
% append करें |
96 -> 96% |
inv |
100 - x |
used को remaining में बदलने के लिए |
alias:TABLE |
aliases में lookup, unlisted हो तो echo |
medium -> 🌗 |
meter:W:SCALE |
0-100 value पर W-cell glyph bar | [⣿⣿⠐⠐⠐] (meter:1 = one glyph) |
Piece forms
{ "text": "📚 {context.max_tokens|num}" }: literal + interpolation।{ "when": "<path>", "text": "..." }: path truthy होने पर ही render करें।{ "map": "<path>", "cases": { "true": "⚡", "false": "🐌" } }: value to glyph।{ "each": "limits.windows", "item": "{label}" }: array iterate करें।
Example
{ "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}", }, ], }, },}render करता है, जैसे claude-sonnet-4-6 🌗 🐌 | 📚 [⣿⣿⣿⣿⣧]272k।
Providers + credentials
- Anthropic (Claude): auth प्रोफाइलों में OAuth टोकन।
- GitHub Copilot: auth प्रोफाइलों में OAuth टोकन।
- Gemini CLI: auth प्रोफाइलों में OAuth टोकन।
- JSON उपयोग
statsपर वापस चला जाता है;stats.cachedकोcacheReadमें सामान्यीकृत किया जाता है।
- JSON उपयोग
- OpenAI Codex: auth प्रोफाइलों में OAuth टोकन (मौजूद होने पर accountId उपयोग किया जाता है)।
- MiniMax: API कुंजी या MiniMax OAuth auth प्रोफाइल। OpenClaw
minimax,minimax-cn, औरminimax-portalको समान MiniMax quota सतह मानता है, मौजूद होने पर संग्रहीत MiniMax OAuth को प्राथमिकता देता है, और अन्यथाMINIMAX_CODE_PLAN_KEY,MINIMAX_CODING_API_KEY, याMINIMAX_API_KEYपर वापस चला जाता है। उपयोग polling, configured होने परmodels.providers.minimax-portal.baseUrlयाmodels.providers.minimax.baseUrlसे Coding Plan host निकालता है, और अन्यथा MiniMax CN host का उपयोग करता है। MiniMax के rawusage_percent/usagePercentफ़ील्ड का अर्थ शेष quota है, इसलिए OpenClaw उन्हें display से पहले उलट देता है; count-based फ़ील्ड मौजूद होने पर प्राथमिकता पाते हैं।- Coding-plan window labels मौजूद होने पर provider के hours/minutes फ़ील्ड से आते हैं,
फिर
start_time/end_timespan पर वापस चले जाते हैं। - अगर coding-plan endpoint
model_remainsलौटाता है, तो OpenClaw chat-model entry को प्राथमिकता देता है, explicitwindow_hours/window_minutesफ़ील्ड अनुपस्थित होने पर timestamps से window label निकालता है, और plan label में model name शामिल करता है।
- Coding-plan window labels मौजूद होने पर provider के hours/minutes फ़ील्ड से आते हैं,
फिर
- Xiaomi MiMo: env/config/auth store (
XIAOMI_API_KEY) के ज़रिए API कुंजी। - z.ai: env/config/auth store के ज़रिए API कुंजी।
- DeepSeek: env/config/auth store (
DEEPSEEK_API_KEY) के ज़रिए API कुंजी। OpenClaw DeepSeek के balance endpoint को call करता है और percent-left quota window के बजाय provider-reported balance को text के रूप में दिखाता है।
जब कोई usable provider usage auth हल नहीं किया जा सकता, तो उपयोग छिपा दिया जाता है। Providers plugin-specific usage auth logic दे सकते हैं; अन्यथा OpenClaw auth profiles, environment variables, या config से matching OAuth/API-key credentials पर वापस चला जाता है।