Concept internals
تتبّع الاستخدام
ماهيته
- يسحب الاستخدام/الحصة الخاصة بموفّر الخدمة مباشرةً من نقطة نهاية الاستخدام لكل موفّر. لا توجد تقديرات لفوترة الموفّر؛ بل تقتصر البيانات على أسماء الخطط التي يبلّغ عنها الموفّر، ونوافذ الحصة، والأرصدة، والإنفاق، والميزانيات، وسجل التكلفة اليومية، وإسناد الرموز/النماذج، أو ملخصات حالة الحساب.
- تُطبَّع مخرجات نافذة الحصة المقروءة للبشر إلى
X% متبقية، حتى عندما يبلّغ الموفّر عن الحصة المستهلكة، أو الحصة المتبقية، أو الأعداد الخام فقط. أما الموفّرون الذين لا يتيحون نوافذ حصة قابلة لإعادة التعيين، فيُعرض لهم نص ملخص الموفّر بدلًا من ذلك (مثل الرصيد). - يعود
/statusعلى مستوى الجلسة وأداةsession_statusإلى سجل نص الجلسة عندما تفتقد لقطة الجلسة المباشرة بيانات الرموز/النموذج. يملأ هذا الرجوع عدادات الرموز/ذاكرة التخزين المؤقت المفقودة، ويمكنه استعادة تسمية نموذج وقت التشغيل النشط، ويفضّل الإجمالي الأكبر الموجّه للموجّه النصي عندما تكون بيانات الجلسة الوصفية مفقودة أو أصغر (totalTokensFresh !== true، أو صفرًا، أو أقل من القيمة المشتقة من النص). وتكون الأولوية دائمًا للقيم المباشرة غير الصفرية على بيانات الرجوع.
مواضع ظهوره
/statusفي المحادثات: بطاقة حالة تعرض رموز الجلسة والتكلفة التقديرية (لنماذج مفتاح API فقط). يظهر استخدام الموفّر لموفّر النموذج الحالي عند توفره، في صورة نافذة مطبّعة بالشكلX% متبقيةأو نص ملخص الموفّر./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 بـالتكلفة التقديريةوتحليل التكلفة حسب النوع. تعيد إعدادات 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 وCost API الخاص بالمؤسسة بدلًا من ذلك. تُكتشف تلقائيًا بيانات اعتماد موفّر Anthropic التي تبدأ بـsk-ant-admin. - يواصل OAuth الخاص بـ OpenAI ChatGPT/Codex عرض الخطة، ونوافذ الحصة، ورصيد الاعتمادات. عيّن
OPENAI_ADMIN_KEYلعرض سجل تكلفة المؤسسة واستخدام الإكمال بدلًا من ذلك؛ ويمكنك اختياريًا تعيين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 دائمًا سطرًا عاديًا بالشكل الاستخدام: X إدخال / Y إخراج (مع لاحقات ذاكرة التخزين المؤقت
والتكلفة التقديرية عند توفرها). ولا يعرض التذييل الأكثر تفصيلًا
الموصوف أدناه سوى /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>": "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 */], }, },}كل سطح عبارة عن قائمة مرتبة من الأجزاء؛ يعرض المحرك كل جزء، ويحذف
الفارغ منها، ويصل الأجزاء المتبقية باستخدام 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
تلقائيًا Plugins المزوّدين المفعّلة التي تعلن
contracts.usageProviders وتنفّذ كلًا من resolveUsageAuth و
fetchUsageSnapshot؛ ولا توجد قائمة سماح منفصلة للمزوّدين في النواة. يحافظ العقد
الثابت على نطاق الاكتشاف دون استيراد Plugin كل مزوّد. يمتلك كل
Plugin نقطة النهاية الخارجية الخاصة به وتحويل استجابتها. تُبقي اللقطة
المشتركة أسماء الخطط ونوافذ الحصص والأرصدة والإنفاق والميزانيات
محايدة تجاه المزوّد لمستهلكي CLI والتطبيق وواجهة التحكم.
- Anthropic (Claude): رموز OAuth في ملفات تعريف المصادقة. إذا كان رمز OAuth يفتقر إلى
نطاق
user:profile، يُرجع إلى جلسة ويب علىclaude.ai(CLAUDE_AI_SESSION_KEYأوCLAUDE_WEB_SESSION_KEYأو ملف تعريف ارتباطsessionKey=فيCLAUDE_WEB_COOKIE) عند تعيينها. تُضمّن الحدود الخاصة بالنماذج والإنفاق/الميزانيات الشهرية للاستخدام الإضافي المفعّل عندما تُبلغ Anthropic عنها. بدلًا من ذلك، يعرض مفتاح Anthropic Admin API الصريح، أو ملف تعريف مزوّدsk-ant-admin...المكتشف تلقائيًا، تكلفة المؤسسة خلال 30 يومًا وسجل Messages API. - ClawRouter: مفتاح API (
CLAWROUTER_API_KEY). يعرض نافذة ميزانية شهرية وميزانية محددة النوع بالدولار الأمريكي عند إعدادها؛ وإلا فيعرض إجمالي الإنفاق وملخصًا للطلبات/الرموز/التكلفة. - 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 يومًا وسجل استخدام الإكمالات عندما يمتلك المفتاح صلاحية الوصول إلى 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).