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:

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 دائمًا سطرًا عاديًا بالشكل الاستخدام: X إدخال / Y إخراج (مع لاحقات ذاكرة التخزين المؤقت والتكلفة التقديرية عند توفرها). ولا يعرض التذييل الأكثر تفصيلًا الموصوف أدناه سوى /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>": "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}" }: تكرار مسار بقيمة مصفوفة (لا يوجد حاليًا أي مسار مصفوفة في العقد).

مثال

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 تلقائيًا 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).

ذو صلة

Was this useful?
On this page

On this page