الأجزاء الداخلية للإضافة
هذا هو المرجع المعماري المتعمق. للحصول على أدلة عملية، راجع:
- تثبيت الإضافات واستخدامها — دليل المستخدم
- البدء — أول برنامج تعليمي للإضافة
- إضافات القنوات — أنشئ قناة مراسلة
- إضافات الموفر — أنشئ موفر نماذج
- نظرة عامة على SDK — خريطة الاستيراد وواجهة API للتسجيل
نموذج الإمكانات العام
الإمكانات هي نموذج الإضافة الأصلية العام داخل OpenClaw. كل إضافة OpenClaw أصلية تُسجَّل وفق نوع واحد أو أكثر من أنواع الإمكانات:| الإمكانية | طريقة التسجيل | أمثلة على الإضافات |
|---|---|---|
| استدلال النص | api.registerProvider(...) | openai, anthropic |
| الواجهة الخلفية لاستدلال CLI | api.registerCliBackend(...) | openai, anthropic |
| الكلام | api.registerSpeechProvider(...) | elevenlabs, microsoft |
| النسخ الفوري | api.registerRealtimeTranscriptionProvider(...) | openai |
| الصوت الفوري | api.registerRealtimeVoiceProvider(...) | openai |
| فهم الوسائط | api.registerMediaUnderstandingProvider(...) | openai, google |
| إنشاء الصور | api.registerImageGenerationProvider(...) | openai, google, fal, minimax |
| إنشاء الموسيقى | api.registerMusicGenerationProvider(...) | google, minimax |
| إنشاء الفيديو | api.registerVideoGenerationProvider(...) | qwen |
| جلب الويب | api.registerWebFetchProvider(...) | firecrawl |
| بحث الويب | api.registerWebSearchProvider(...) | google |
| القناة / المراسلة | api.registerChannel(...) | msteams, matrix |
الموقف تجاه التوافق الخارجي
تم اعتماد نموذج الإمكانات في النواة ويُستخدم بواسطة الإضافات الأصلية/المضمّنة اليوم، لكن توافق الإضافات الخارجية لا يزال يحتاج إلى معيار أكثر صرامة من “تم تصديره، إذن فهو ثابت.” الإرشادات الحالية:- الإضافات الخارجية الحالية: حافظ على عمل عمليات الدمج القائمة على الخطافات؛ واعتبر هذا هو خط الأساس للتوافق
- الإضافات الأصلية/المضمّنة الجديدة: فضّل التسجيل الصريح للإمكانات بدلًا من الوصولات الخاصة بالمورّد أو التصميمات الجديدة المعتمدة على الخطافات فقط
- الإضافات الخارجية التي تعتمد تسجيل الإمكانات: هذا مسموح، لكن اعتبر أسطح المساعدة الخاصة بالإمكانات في طور التطور ما لم تذكر الوثائق صراحةً أن العقد ثابت
- واجهات API لتسجيل الإمكانات هي الاتجاه المقصود
- تبقى الخطافات القديمة المسار الأكثر أمانًا لتجنّب الأعطال للإضافات الخارجية أثناء الانتقال
- ليست كل المسارات الفرعية المصدّرة متساوية؛ فضّل العقد الموثّق الضيق، وليس صادرات المساعدة العرضية
أشكال الإضافات
يصنّف OpenClaw كل إضافة محمّلة إلى شكل بناءً على سلوك التسجيل الفعلي الخاص بها (وليس فقط البيانات الوصفية الثابتة):- plain-capability — يسجّل نوع إمكانية واحدًا فقط (على سبيل المثال
إضافة موفر فقط مثل
mistral) - hybrid-capability — يسجّل عدة أنواع من الإمكانات (على سبيل المثال
openaiيملك استدلال النص والكلام وفهم الوسائط وإنشاء الصور) - hook-only — يسجّل الخطافات فقط (المكتوبة النوع أو المخصصة)، من دون إمكانات أو أدوات أو أوامر أو خدمات
- non-capability — يسجّل أدوات أو أوامر أو خدمات أو مسارات ولكن من دون إمكانات
openclaw plugins inspect <id> لرؤية شكل الإضافة وتفصيل
الإمكانات. راجع مرجع CLI للحصول على التفاصيل.
الخطافات القديمة
لا يزال الخطافbefore_agent_start مدعومًا كمسار توافق للإضافات
التي تعتمد على الخطافات فقط. لا تزال الإضافات القديمة الموجودة فعليًا تعتمد عليه.
الاتجاه:
- حافظ على عمله
- وثّقه على أنه قديم
- فضّل
before_model_resolveلأعمال تجاوز النموذج/الموفر - فضّل
before_prompt_buildلأعمال تعديل المطالبة - لا تزلْه إلا بعد انخفاض الاستخدام الفعلي وإثبات تغطية التركيبات لسلامة الترحيل
إشارات التوافق
عند تشغيلopenclaw doctor أو openclaw plugins inspect <id>، قد ترى
أحد هذه التصنيفات:
| الإشارة | المعنى |
|---|---|
| config valid | يتم تحليل الإعداد بشكل صحيح وتُحل الإضافات |
| compatibility advisory | تستخدم الإضافة نمطًا مدعومًا لكنه أقدم (مثل hook-only) |
| legacy warning | تستخدم الإضافة before_agent_start، وهو مهمل |
| hard error | الإعداد غير صالح أو فشل تحميل الإضافة |
hook-only ولا before_agent_start في تعطل إضافتك اليوم —
فـ hook-only مجرد إشارة استشارية، وbefore_agent_start لا يؤدي إلا إلى تحذير. تظهر هذه
الإشارات أيضًا في openclaw status --all وopenclaw plugins doctor.
نظرة عامة على البنية
يحتوي نظام الإضافات في OpenClaw على أربع طبقات:- البيان + الاكتشاف
يعثر OpenClaw على الإضافات المرشحة من المسارات المهيأة، وجذور مساحات العمل،
وجذور الامتدادات العامة، والامتدادات المضمّنة. يقرأ الاكتشاف بيانات
openclaw.plugin.jsonالأصلية بالإضافة إلى بيانات الحزم المجمعة المدعومة أولًا. - التمكين + التحقق تقرر النواة ما إذا كانت الإضافة المكتشفة ممكّنة أو معطّلة أو محظورة أو محددة لفتحة حصرية مثل الذاكرة.
- التحميل وقت التشغيل تُحمّل إضافات OpenClaw الأصلية داخل العملية عبر jiti وتسجّل الإمكانات في سجل مركزي. تُطبّع الحزم المتوافقة إلى سجلات في السجل من دون استيراد شيفرة وقت التشغيل.
- استهلاك الأسطح يقرأ باقي OpenClaw السجل لكشف الأدوات والقنوات وإعداد الموفر والخطافات ومسارات HTTP وأوامر CLI والخدمات.
- تأتي البيانات الوصفية وقت التحليل من
registerCli(..., { descriptors: [...] }) - يمكن لوحدة CLI الحقيقية الخاصة بالإضافة أن تبقى كسولة وتُسجَّل عند أول استدعاء
- يجب أن يعمل الاكتشاف + التحقق من الإعداد من بيانات البيان/المخطط من دون تنفيذ شيفرة الإضافة
- يأتي السلوك الأصلي وقت التشغيل من مسار
register(api)في وحدة الإضافة
إضافات القنوات وأداة الرسائل المشتركة
لا تحتاج إضافات القنوات إلى تسجيل أداة إرسال/تعديل/تفاعل منفصلة من أجل إجراءات الدردشة العادية. يحتفظ OpenClaw بأداةmessage مشتركة واحدة في النواة،
وتملك إضافات القنوات الاكتشاف والتنفيذ الخاصين بالقناة خلفها.
الحد الحالي هو:
- تملك النواة مضيف أداة
messageالمشتركة، وربط المطالبات، وإدارة الجلسات/الخيوط، وإرسال التنفيذ - تملك إضافات القنوات اكتشاف الإجراءات المحددة النطاق، واكتشاف الإمكانات، وأي أجزاء مخطط خاصة بالقناة
- تملك إضافات القنوات قواعد محادثة الجلسة الخاصة بالموفر، مثل كيفية ترميز معرّفات المحادثة لمعرّفات الخيوط أو وراثتها من المحادثات الأصلية
- تنفذ إضافات القنوات الإجراء النهائي عبر محول الإجراءات الخاص بها
ChannelMessageActionAdapter.describeMessageTool(...). يتيح هذا الاستدعاء الموحّد
للاكتشاف للإضافة إرجاع إجراءاتها المرئية وإمكاناتها ومساهمات
المخطط معًا حتى لا تنحرف هذه الأجزاء عن بعضها.
تمرر النواة النطاق وقت التشغيل إلى خطوة الاكتشاف هذه. تتضمن الحقول المهمة:
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentIdrequesterSenderIdالوارد والموثوق
message الأساسية.
ولهذا السبب تبقى تغييرات التوجيه الخاصة بالمشغّل المضمّن من عمل الإضافة: فالمشغّل
مسؤول عن تمرير هوية الدردشة/الجلسة الحالية إلى حد اكتشاف الإضافة حتى
تكشف أداة message المشتركة السطح الصحيح المملوك للقناة
للدور الحالي.
بالنسبة إلى مساعدات التنفيذ المملوكة للقناة، يجب أن تحتفظ الإضافات المضمّنة بوقت تشغيل
التنفيذ داخل وحدات الامتداد الخاصة بها. لم تعد النواة تملك أوقات تشغيل
إجراءات الرسائل لـ Discord أو Slack أو Telegram أو WhatsApp تحت src/agents/tools.
نحن لا ننشر مسارات فرعية منفصلة plugin-sdk/*-action-runtime، ويجب على الإضافات المضمّنة
استيراد شيفرة وقت التشغيل المحلية الخاصة بها مباشرةً من
وحداتها المملوكة للامتداد.
ينطبق الحد نفسه على مسارات SDK المسماة باسم الموفّر بشكل عام: يجب ألا
تستورد النواة الحاويات الملائمة الخاصة بالقنوات مثل Slack أو Discord أو Signal أو
WhatsApp أو الامتدادات المشابهة. إذا احتاجت النواة إلى سلوك ما، فإما أن تستهلك
الحاوية api.ts / runtime-api.ts الخاصة بالإضافة المضمّنة، أو أن ترفع الحاجة
إلى إمكانية عامة ضيقة في SDK المشترك.
بالنسبة إلى استطلاعات الرأي تحديدًا، يوجد مسارا تنفيذ:
outbound.sendPollهو الأساس المشترك للقنوات التي تناسب نموذج الاستطلاع الشائعactions.handleAction("poll")هو المسار المفضل لدلالات الاستطلاع الخاصة بالقناة أو معلمات الاستطلاع الإضافية
نموذج ملكية الإمكانات
يعامل OpenClaw الإضافة الأصلية على أنها حد الملكية الخاص بـ شركة أو ميزة، وليس كحقيبة تجمع عمليات دمج غير مترابطة. وهذا يعني:- يجب أن تملك إضافة الشركة عادةً جميع الأسطح المرتبطة بتلك الشركة في OpenClaw
- يجب أن تملك إضافة الميزة عادةً كامل سطح الميزة التي تقدمها
- يجب أن تستهلك القنوات الإمكانات الأساسية المشتركة بدلًا من إعادة تنفيذ سلوك الموفّر بشكل مخصص
- تملك الإضافة المضمّنة
openaiسلوك موفّر نماذج OpenAI وسلوك OpenAI للكلام + الصوت الفوري + فهم الوسائط + إنشاء الصور - تملك الإضافة المضمّنة
elevenlabsسلوك الكلام لـ ElevenLabs - تملك الإضافة المضمّنة
microsoftسلوك الكلام لـ Microsoft - تملك الإضافة المضمّنة
googleسلوك موفّر نماذج Google بالإضافة إلى سلوك Google لفهم الوسائط + إنشاء الصور + بحث الويب - تملك الإضافة المضمّنة
firecrawlسلوك جلب الويب لـ Firecrawl - تملك الإضافات المضمّنة
minimaxوmistralوmoonshotوzaiالواجهات الخلفية الخاصة بها لفهم الوسائط - تملك الإضافة المضمّنة
qwenسلوك موفّر النص لـ Qwen بالإضافة إلى سلوك فهم الوسائط وإنشاء الفيديو - الإضافة
voice-callهي إضافة ميزة: فهي تملك نقل المكالمات والأدوات وCLI والمسارات وجسر تدفق الوسائط لـ Twilio، لكنها تستهلك إمكانات الكلام المشتركة بالإضافة إلى النسخ الفوري والصوت الفوري بدلًا من استيراد إضافات المورّد مباشرةً
- تعيش OpenAI داخل إضافة واحدة حتى لو كانت تمتد عبر نماذج النص والكلام والصور والفيديو مستقبلًا
- يمكن لمورّد آخر أن يفعل الشيء نفسه لمساحة السطح الخاصة به
- لا تهتم القنوات بأي إضافة مورّد تملك الموفّر؛ فهي تستهلك عقد الإمكانية المشتركة الذي تكشفه النواة
- الإضافة = حد الملكية
- الإمكانية = عقد النواة الذي يمكن لعدة إضافات تنفيذه أو استهلاكه
- تعريف الإمكانية المفقودة في النواة
- كشفها عبر واجهة API/وقت التشغيل الخاصة بالإضافة بطريقة مكتوبة النوع
- ربط القنوات/الميزات بهذه الإمكانية
- السماح لإضافات المورّدين بتسجيل التنفيذات
طبقات الإمكانات
استخدم هذا النموذج الذهني عند تحديد المكان الذي تنتمي إليه الشيفرة:- طبقة إمكانات النواة: التنسيق المشترك، والسياسات، والتراجع، وقواعد دمج الإعداد، ودلالات التسليم، والعقود المكتوبة النوع
- طبقة إضافة المورّد: واجهات API الخاصة بالمورّد، والمصادقة، وكتالوجات النماذج، وتوليف الكلام، وإنشاء الصور، والواجهات الخلفية المستقبلية للفيديو، ونقاط نهاية الاستخدام
- طبقة إضافة القناة/الميزة: تكامل Slack/Discord/voice-call/إلخ الذي يستهلك إمكانات النواة ويعرضها على سطح معين
- تملك النواة سياسة TTS وقت الرد، وترتيب التراجع، والتفضيلات، وتسليم القناة
- تملك
openaiوelevenlabsوmicrosoftتنفيذات التوليف - تستهلك
voice-callمساعد وقت تشغيل TTS الخاص بالهاتف
مثال على إضافة شركة متعددة الإمكانات
يجب أن تبدو إضافة الشركة متماسكة من الخارج. إذا كان لدى OpenClaw عقود مشتركة للنماذج والكلام والنسخ الفوري والصوت الفوري وفهم الوسائط وإنشاء الصور وإنشاء الفيديو وجلب الويب وبحث الويب، فيمكن لمورّد أن يملك جميع أسطحه في مكان واحد:- إضافة واحدة تملك سطح المورّد
- لا تزال النواة تملك عقود الإمكانات
- تستهلك إضافات القنوات والميزات مساعدات
api.runtime.*، وليس شيفرة المورّد - يمكن لاختبارات العقود التأكد من أن الإضافة سجّلت الإمكانات التي تدّعي ملكيتها
مثال على الإمكانية: فهم الفيديو
يعامل OpenClaw بالفعل فهم الصور/الصوت/الفيديو على أنه إمكانية مشتركة واحدة. وينطبق نموذج الملكية نفسه هنا:- تعرّف النواة عقد فهم الوسائط
- تسجّل إضافات المورّدين
describeImageوtranscribeAudioوdescribeVideoبحسب الاقتضاء - تستهلك إضافات القنوات والميزات سلوك النواة المشترك بدلًا من الربط المباشر بشيفرة المورّد
api.registerVideoGenerationProvider(...) وفقه.
هل تحتاج إلى قائمة تحقق عملية واضحة؟ راجع
دليل وصفات الإمكانات.
العقود والإنفاذ
سطح واجهة API للإضافات مكتوب النوع ومركزي بشكل متعمد داخلOpenClawPluginApi. يعرّف هذا العقد نقاط التسجيل المدعومة و
مساعدات وقت التشغيل التي يمكن للإضافة الاعتماد عليها.
لماذا هذا مهم:
- يحصل مؤلفو الإضافات على معيار داخلي ثابت واحد
- يمكن للنواة رفض الملكية المكررة مثل تسجيل إضافتين لمعرّف الموفّر نفسه
- يمكن لبدء التشغيل إظهار تشخيصات قابلة للتنفيذ للتسجيلات غير الصحيحة
- يمكن لاختبارات العقود فرض ملكية الإضافات المضمّنة ومنع الانحراف الصامت
- إنفاذ التسجيل وقت التشغيل يتحقق سجل الإضافات من التسجيلات أثناء تحميل الإضافات. أمثلة: معرّفات الموفّرين المكررة، ومعرّفات موفّري الكلام المكررة، والتسجيلات غير الصحيحة تؤدي إلى تشخيصات للإضافات بدلًا من سلوك غير معرّف.
- اختبارات العقود تُلتقط الإضافات المضمّنة في سجلات العقود أثناء تشغيل الاختبارات حتى يتمكن OpenClaw من تأكيد الملكية بشكل صريح. ويُستخدم هذا اليوم مع موفّري النماذج، وموفّري الكلام، وموفّري بحث الويب، وملكية تسجيل الإضافات المضمّنة.
ما الذي يجب أن ينتمي إلى عقد
عقود الإضافات الجيدة تكون:- مكتوبة النوع
- صغيرة
- خاصة بإمكانية محددة
- مملوكة للنواة
- قابلة لإعادة الاستخدام بواسطة عدة إضافات
- قابلة للاستهلاك من القنوات/الميزات دون معرفة بالمورّد
- سياسات خاصة بالمورّد مخفية داخل النواة
- منافذ هروب مخصصة لإضافة واحدة تتجاوز السجل
- شيفرة قناة تصل مباشرة إلى تنفيذ خاص بمورّد
- كائنات وقت تشغيل مخصصة ليست جزءًا من
OpenClawPluginApiأوapi.runtime
نموذج التنفيذ
تعمل إضافات OpenClaw الأصلية داخل العملية مع Gateway. وهي ليست معزولة. تملك الإضافة الأصلية المحمّلة حد الثقة على مستوى العملية نفسه الذي تملكه شيفرة النواة. الآثار المترتبة:- يمكن للإضافة الأصلية تسجيل أدوات ومعالجات شبكة وخطافات وخدمات
- يمكن لخطأ في إضافة أصلية أن يتسبب في تعطل البوابة أو زعزعة استقرارها
- الإضافة الأصلية الخبيثة تعادل تنفيذ شيفرة عشوائية داخل عملية OpenClaw
@openclaw/<id> افتراضيًا، أو لاحقة نوعية معتمدة مثل
-provider أو -plugin أو -speech أو -sandbox أو -media-understanding عندما
تكشف الحزمة عمدًا عن دور إضافة أضيق.
ملاحظة مهمة بشأن الثقة:
plugins.allowيثق في معرّفات الإضافات، وليس في مصدرها.- إضافة مساحة عمل لها المعرّف نفسه الذي تملكه إضافة مضمّنة تحجب عمدًا النسخة المضمّنة عندما تكون إضافة مساحة العمل تلك مفعّلة/مدرجة في قائمة السماح.
- هذا طبيعي ومفيد للتطوير المحلي، واختبار التصحيحات، والإصلاحات السريعة.
حد التصدير
يكشف OpenClaw عن الإمكانات، وليس عن وسائل تنفيذ مريحة. أبقِ تسجيل الإمكانات عامًا. وقلّص صادرات المساعدات غير التعاقدية:- المسارات الفرعية الخاصة بمساعدات الإضافات المضمّنة
- المسارات الفرعية الخاصة ببنية وقت التشغيل غير المقصود أن تكون واجهة API عامة
- مساعدات الراحة الخاصة بالمورّد
- مساعدات الإعداد/التهيئة التي تُعد تفاصيل تنفيذ
plugin-sdk/feishu وplugin-sdk/feishu-setup وplugin-sdk/zalo,
plugin-sdk/zalo-setup والعديد من حدود plugin-sdk/matrix*. تعامل مع هذه
على أنها صادرات محجوزة لتفاصيل التنفيذ، وليس كنمط SDK موصى به
للإضافات الخارجية الجديدة.
مسار التحميل
عند بدء التشغيل، ينفّذ OpenClaw تقريبًا ما يلي:- اكتشاف جذور الإضافات المرشحة
- قراءة البيانات الأصلية أو بيانات الحزم المتوافقة وبيانات الحزمة الوصفية
- رفض المرشحين غير الآمنين
- تطبيع إعداد الإضافات (
plugins.enabled,allow,deny,entries,slots,load.paths) - تقرير حالة التمكين لكل مرشح
- تحميل الوحدات الأصلية المفعّلة عبر jiti
- استدعاء خطافات
register(api)الأصلية (أوactivate(api)— وهو اسم بديل قديم) وجمع التسجيلات داخل سجل الإضافات - كشف السجل لأسطح الأوامر/وقت التشغيل
activate هو اسم بديل قديم لـ register — إذ يحلّ المحمّل أيهما موجود (def.register ?? def.activate) ويستدعيه في النقطة نفسها. تستخدم جميع الإضافات المضمّنة register؛ ويفضَّل استخدام register للإضافات الجديدة.سلوك البيان أولًا
البيان هو مصدر الحقيقة لمستوى التحكم. يستخدمه OpenClaw من أجل:- تحديد الإضافة
- اكتشاف القنوات/المهارات/مخطط الإعداد المعلن أو إمكانات الحزمة
- التحقق من
plugins.entries.<id>.config - زيادة تسميات/عناصر نائبة في واجهة Control UI
- عرض بيانات التثبيت/الكتالوج الوصفية
- الحفاظ على واصفات التفعيل والإعداد منخفضة التكلفة من دون تحميل وقت تشغيل الإضافة
activation وsetup في البيان ضمن مستوى التحكم.
فهي واصفات بيانات وصفية فقط لتخطيط التفعيل واكتشاف الإعداد؛
ولا تحل محل تسجيل وقت التشغيل أو register(...) أو setupEntry.
يفضّل اكتشاف الإعداد الآن المعرّفات المملوكة للواصفات مثل setup.providers و
setup.cliBackends لتضييق نطاق الإضافات المرشحة قبل الرجوع إلى
setup-api للإضافات التي لا تزال تحتاج إلى خطافات وقت تشغيل خاصة بالإعداد. وإذا
ادّعت أكثر من إضافة مكتشفة ملكية معرّف موفّر إعداد أو واجهة خلفية CLI نفسه بعد تطبيعه،
فإن البحث عن الإعداد يرفض المالك الملتبس بدلًا من الاعتماد على ترتيب
الاكتشاف.
ما الذي يخزّنه المحمّل مؤقتًا
يحتفظ OpenClaw بذاكرات تخزين مؤقتة قصيرة داخل العملية من أجل:- نتائج الاكتشاف
- بيانات سجل البيانات الوصفية
- سجلات الإضافات المحمّلة
- اضبط
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE=1أوOPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE=1لتعطيل هذه الذاكرات المؤقتة. - اضبط نوافذ التخزين المؤقت باستخدام
OPENCLAW_PLUGIN_DISCOVERY_CACHE_MSوOPENCLAW_PLUGIN_MANIFEST_CACHE_MS.
نموذج السجل
لا تقوم الإضافات المحمّلة بتعديل المتغيرات العامة العشوائية في النواة مباشرةً. بل تسجّل في سجل إضافات مركزي. يتتبع السجل ما يلي:- سجلات الإضافات (الهوية، المصدر، الأصل، الحالة، التشخيصات)
- الأدوات
- الخطافات القديمة والخطافات المكتوبة النوع
- القنوات
- الموفّرون
- معالجات Gateway RPC
- مسارات HTTP
- مسجّلات CLI
- الخدمات الخلفية
- الأوامر المملوكة للإضافة
- وحدة الإضافة -> التسجيل في السجل
- وقت تشغيل النواة -> استهلاك السجل
استدعاءات ربط المحادثة
يمكن للإضافات التي تربط محادثة أن تتفاعل عند حسم الموافقة. استخدمapi.onConversationBindingResolved(...) لتلقي استدعاء بعد الموافقة على
طلب الربط أو رفضه:
status:"approved"أو"denied"decision:"allow-once"أو"allow-always"أو"deny"binding: الربط المحسوم للطلبات الموافق عليهاrequest: ملخص الطلب الأصلي، وتلميح الفصل، ومعرّف المرسل، و بيانات المحادثة الوصفية
خطافات وقت تشغيل الموفّر
أصبحت إضافات الموفّر الآن تحتوي على طبقتين:- بيانات البيان الوصفية:
providerAuthEnvVarsمن أجل البحث منخفض الكلفة عن مصادقة الموفّر عبر متغيرات البيئة قبل تحميل وقت التشغيل، وproviderAuthAliasesلمتغيرات الموفّر التي تشترك في المصادقة، وchannelEnvVarsمن أجل البحث منخفض الكلفة عن إعداد/بيئة القناة قبل تحميل وقت التشغيل، بالإضافة إلىproviderAuthChoicesمن أجل تسميات منخفضة الكلفة لخيار المصادقة/الإعداد وبيانات أعلام CLI الوصفية قبل تحميل وقت التشغيل - خطافات وقت الإعداد:
catalog/discoveryالقديم بالإضافة إلىapplyConfigDefaults - خطافات وقت التشغيل:
normalizeModelId,normalizeTransport,normalizeConfig,applyNativeStreamingUsageCompat,resolveConfigApiKey,resolveSyntheticAuth,resolveExternalAuthProfiles,shouldDeferSyntheticProfileAuth,resolveDynamicModel,prepareDynamicModel,normalizeResolvedModel,contributeResolvedModelCompat,capabilities,normalizeToolSchemas,inspectToolSchemas,resolveReasoningOutputMode,prepareExtraParams,createStreamFn,wrapStreamFn,resolveTransportTurnState,resolveWebSocketSessionPolicy,formatApiKey,refreshOAuth,buildAuthDoctorHint,matchesContextOverflowError,classifyFailoverReason,isCacheTtlEligible,buildMissingAuthMessage,suppressBuiltInModel,augmentModelCatalog,isBinaryThinking,supportsXHighThinking,resolveDefaultThinkingLevel,isModernModelRef,prepareRuntimeAuth,resolveUsageAuth,fetchUsageSnapshot,createEmbeddingProvider,buildReplayPolicy,sanitizeReplayHistory,validateReplayTurns,onModelSelected
providerAuthEnvVars في البيان عندما يملك الموفّر بيانات اعتماد قائمة على
متغيرات البيئة يجب أن تراها مسارات المصادقة/الحالة/منتقي النماذج العامة من دون تحميل
وقت تشغيل الإضافة. استخدم providerAuthAliases في البيان عندما يجب أن يعيد
معرّف موفّر واحد استخدام متغيرات البيئة الخاصة بمعرّف موفّر آخر، وملفات
المصادقة، والمصادقة المدعومة بالإعداد، وخيار الإعداد لمفتاح API.
استخدم providerAuthChoices في البيان عندما يجب أن تعرف أسطح CLI الخاصة
بالإعداد/اختيار المصادقة معرّف خيار الموفّر، وتسميات المجموعات، وربط المصادقة
البسيط ذي العلم الواحد من دون تحميل وقت تشغيل الموفّر. أبقِ envVars في وقت تشغيل
الموفّر للتلميحات الموجهة للمشغّل مثل تسميات الإعداد أو
متغيرات إعداد OAuth الخاصة بـ client-id/client-secret.
استخدم channelEnvVars في البيان عندما تكون لدى القناة مصادقة أو إعداد قائم
على متغيرات البيئة يجب أن تراه مسارات الرجوع إلى متغيرات shell العامة، أو فحوصات
الإعداد/الحالة، أو مطالبات الإعداد من دون تحميل وقت تشغيل القناة.
ترتيب الخطافات واستخدامها
بالنسبة إلى إضافات النموذج/الموفّر، يستدعي OpenClaw الخطافات تقريبًا بهذا الترتيب. ويمثل عمود “متى يُستخدم” دليل القرار السريع.| # | الخطاف | ما الذي يفعله | متى يُستخدم |
|---|---|---|---|
| 1 | catalog | ينشر إعداد الموفّر داخل models.providers أثناء توليد models.json | عندما يملك الموفّر كتالوجًا أو إعدادات افتراضية لـ base URL |
| 2 | applyConfigDefaults | يطبق إعدادات افتراضية عامة يملكها الموفّر أثناء تشكيل الإعداد | عندما تعتمد الإعدادات الافتراضية على وضع المصادقة أو البيئة أو دلالات عائلة نماذج الموفّر |
| — | (البحث عن النموذج المدمج) | يحاول OpenClaw أولًا المسار العادي عبر السجل/الكتالوج | (ليس خطاف إضافة) |
| 3 | normalizeModelId | يطبّع الأسماء البديلة القديمة أو التجريبية لمعرّفات النماذج قبل البحث | عندما يملك الموفّر تنظيف الأسماء البديلة قبل حل النموذج القياسي |
| 4 | normalizeTransport | يطبّع api / baseUrl الخاص بعائلة الموفّر قبل التجميع العام للنموذج | عندما يملك الموفّر تنظيف النقل لمعرّفات موفّر مخصصة ضمن عائلة النقل نفسها |
| 5 | normalizeConfig | يطبّع models.providers.<id> قبل حل وقت التشغيل/الموفّر | عندما يحتاج الموفّر إلى تنظيف للإعداد يجب أن يبقى مع الإضافة؛ وتوفّر مساعدات Google-family المضمّنة أيضًا دعمًا احتياطيًا لإدخالات Google المدعومة في الإعداد |
| 6 | applyNativeStreamingUsageCompat | يطبق إعادة كتابة توافق استخدام البث الأصلي على موفّري الإعداد | عندما يحتاج الموفّر إلى إصلاحات لبيانات استخدام البث الأصلي الوصفية بحسب نقطة النهاية |
| 7 | resolveConfigApiKey | يحل مصادقة علامة البيئة لموفّري الإعداد قبل تحميل مصادقة وقت التشغيل | عندما يملك الموفّر حلًا خاصًا به لمفتاح API عبر علامة البيئة؛ كما يملك amazon-bedrock هنا محللًا مدمجًا لعلامات بيئة AWS |
| 8 | resolveSyntheticAuth | يكشف المصادقة المحلية/المستضافة ذاتيًا أو المدعومة بالإعداد من دون حفظ نص واضح | عندما يستطيع الموفّر العمل باستخدام علامة اعتماد اصطناعية/محلية |
| 9 | resolveExternalAuthProfiles | يضيف ملفات مصادقة خارجية يملكها الموفّر؛ والقيمة الافتراضية لـ persistence هي runtime-only لبيانات الاعتماد المملوكة لـ CLI/التطبيق | عندما يعيد الموفّر استخدام بيانات اعتماد مصادقة خارجية من دون حفظ رموز تحديث منسوخة |
| 10 | shouldDeferSyntheticProfileAuth | يخفض أولوية العناصر النائبة الاصطناعية المحفوظة خلف المصادقة المدعومة بالبيئة/الإعداد | عندما يخزن الموفّر ملفات تعريف اصطناعية نائبة يجب ألا تفوز بالأسبقية |
| 11 | resolveDynamicModel | تراجع متزامن لمعرّفات النماذج المملوكة للموفّر وغير الموجودة بعد في السجل المحلي | عندما يقبل الموفّر معرّفات نماذج علوية عشوائية |
| 12 | prepareDynamicModel | تهيئة غير متزامنة، ثم يُشغَّل resolveDynamicModel مرة أخرى | عندما يحتاج الموفّر إلى بيانات وصفية شبكية قبل حل المعرّفات غير المعروفة |
| 13 | normalizeResolvedModel | إعادة كتابة نهائية قبل أن يستخدم المشغّل المضمّن النموذج المحلول | عندما يحتاج الموفّر إلى إعادة كتابة للنقل مع الاستمرار في استخدام نقل أساسي |
| 14 | contributeResolvedModelCompat | يضيف أعلام توافق لنماذج المورّد الموجودة خلف نقل متوافق آخر | عندما يتعرف الموفّر على نماذجه الخاصة فوق نواقل وكيلة من دون الاستحواذ على الموفّر |
| 15 | capabilities | بيانات وصفية للنصوص/الأدوات يملكها الموفّر وتستخدمها منطق النواة المشتركة | عندما يحتاج الموفّر إلى خصائص خاصة بالنصوص أو بعائلة الموفّر |
| 16 | normalizeToolSchemas | يطبّع مخططات الأدوات قبل أن يراها المشغّل المضمّن | عندما يحتاج الموفّر إلى تنظيف مخططات خاص بعائلة النقل |
| 17 | inspectToolSchemas | يكشف تشخيصات المخططات المملوكة للموفّر بعد التطبيع | عندما يريد الموفّر تحذيرات بشأن الكلمات المفتاحية من دون تعليم النواة قواعد خاصة بموفّر معين |
| 18 | resolveReasoningOutputMode | يختار عقد مخرجات الاستدلال الأصلي مقابل العقد الموسوم | عندما يحتاج الموفّر إلى استدلال موسوم/مخرجات نهائية بدلًا من الحقول الأصلية |
| 19 | prepareExtraParams | تطبيع معلمات الطلب قبل أغلفة خيارات البث العامة | عندما يحتاج الموفّر إلى معلمات طلب افتراضية أو تنظيف معلمات خاص بكل موفّر |
| 20 | createStreamFn | يستبدل بالكامل مسار البث العادي بنقل مخصص | عندما يحتاج الموفّر إلى بروتوكول سلكي مخصص، وليس مجرد غلاف |
| 21 | wrapStreamFn | غلاف للبث بعد تطبيق الأغلفة العامة | عندما يحتاج الموفّر إلى أغلفة توافق لطلب الرؤوس/الجسم/النموذج من دون نقل مخصص |
| 22 | resolveTransportTurnState | يرفق رؤوس نقل أصلية أو بيانات وصفية لكل دور | عندما يريد الموفّر أن ترسل النواقل العامة هوية الدور الأصلية الخاصة به |
| 23 | resolveWebSocketSessionPolicy | يرفق رؤوس WebSocket أصلية أو سياسة تبريد للجلسة | عندما يريد الموفّر أن تضبط نواقل WS العامة رؤوس الجلسة أو سياسة التراجع |
| 24 | formatApiKey | منسّق ملف المصادقة: يتحول الملف المخزن إلى سلسلة apiKey وقت التشغيل | عندما يخزن الموفّر بيانات مصادقة وصفية إضافية ويحتاج إلى شكل رمز وقت تشغيل مخصص |
| 25 | refreshOAuth | تجاوز لتحديث OAuth من أجل نقاط تحديث مخصصة أو سياسة فشل التحديث | عندما لا يناسب الموفّر أدوات التحديث المشتركة pi-ai |
| 26 | buildAuthDoctorHint | تلميح إصلاح يُلحق عند فشل تحديث OAuth | عندما يحتاج الموفّر إلى إرشاد إصلاح مصادقة مملوك له بعد فشل التحديث |
| 27 | matchesContextOverflowError | مطابق تجاوز نافذة السياق المملوك للموفّر | عندما يملك الموفّر أخطاء تجاوز خام قد تفوّتها الاستدلالات العامة |
| 28 | classifyFailoverReason | تصنيف سبب التبديل الاحتياطي المملوك للموفّر | عندما يستطيع الموفّر تحويل أخطاء API/النقل الخام إلى تجاوز حد المعدل/حمل زائد/إلخ |
| 29 | isCacheTtlEligible | سياسة التخزين المؤقت للمطالبة لموفّري الوكيل/الترحيل | عندما يحتاج الموفّر إلى ضبط TTL خاص بالوكيل |
| 30 | buildMissingAuthMessage | بديل لرسالة استرداد المصادقة المفقودة العامة | عندما يحتاج الموفّر إلى تلميح خاص به لاسترداد المصادقة المفقودة |
| 31 | suppressBuiltInModel | إخفاء النماذج العلوية القديمة مع تلميح اختياري مرئي للمستخدم | عندما يحتاج الموفّر إلى إخفاء الصفوف العلوية القديمة أو استبدالها بتلميح من المورّد |
| 32 | augmentModelCatalog | صفوف كتالوج اصطناعية/نهائية تُضاف بعد الاكتشاف | عندما يحتاج الموفّر إلى صفوف توافق أمامي اصطناعية في models list والمنتقيات |
| 33 | isBinaryThinking | تبديل تشغيل/إيقاف للاستدلال لدى موفّري binary-thinking | عندما لا يوفّر الموفّر إلا تشغيل/إيقاف للاستدلال |
| 34 | supportsXHighThinking | دعم الاستدلال xhigh لنماذج محددة | عندما يريد الموفّر تفعيل xhigh لمجموعة فرعية فقط من النماذج |
| 35 | resolveDefaultThinkingLevel | مستوى /think الافتراضي لعائلة نماذج محددة | عندما يملك الموفّر سياسة /think الافتراضية لعائلة نماذج |
| 36 | isModernModelRef | مطابق النموذج الحديث لمرشحات الملفات الحية واختيار smoke | عندما يملك الموفّر مطابقة النماذج المفضلة في الاختبارات الحية/الدخانية |
| 37 | prepareRuntimeAuth | يستبدل بيانات اعتماد مهيأة بالرمز/المفتاح الفعلي وقت التشغيل مباشرة قبل الاستدلال | عندما يحتاج الموفّر إلى تبادل رمز أو بيانات اعتماد طلب قصيرة العمر |
| 38 | resolveUsageAuth | يحل بيانات اعتماد الاستخدام/الفوترة من أجل /usage والأسطح المرتبطة بالحالة | عندما يحتاج الموفّر إلى تحليل مخصص لرمز الاستخدام/الحصة أو إلى بيانات اعتماد استخدام مختلفة |
| 39 | fetchUsageSnapshot | يجلب ويطبّع لقطات الاستخدام/الحصة الخاصة بالمورّد بعد حل المصادقة | عندما يحتاج الموفّر إلى نقطة نهاية استخدام خاصة به أو إلى محلل حمولة خاص به |
| 40 | createEmbeddingProvider | يبني محول embedding مملوكًا للموفّر من أجل الذاكرة/البحث | عندما ينتمي سلوك embedding الخاص بالذاكرة إلى إضافة الموفّر |
| 41 | buildReplayPolicy | يعيد سياسة replay تتحكم في معالجة النصوص الخاصة بالموفّر | عندما يحتاج الموفّر إلى سياسة نصوص مخصصة (على سبيل المثال، إزالة كتل التفكير) |
| 42 | sanitizeReplayHistory | يعيد كتابة سجل replay بعد التنظيف العام للنصوص | عندما يحتاج الموفّر إلى إعادة كتابة replay خاصة به تتجاوز مساعدات الضغط المشتركة |
| 43 | validateReplayTurns | التحقق النهائي من أدوار replay أو إعادة تشكيلها قبل المشغّل المضمّن | عندما يحتاج نقل الموفّر إلى تحقق أكثر صرامة من الأدوار بعد التنقية العامة |
| 44 | onModelSelected | يشغّل آثارًا جانبية بعد الاختيار يملكها الموفّر | عندما يحتاج الموفّر إلى القياس عن بُعد أو إلى حالة مملوكة له عندما يصبح النموذج نشطًا |
normalizeModelId وnormalizeTransport وnormalizeConfig تتحقق أولًا من
إضافة الموفّر المطابقة، ثم تنتقل إلى إضافات الموفّر الأخرى القادرة على استخدام الخطافات
إلى أن تقوم إحداها فعلًا بتغيير معرّف النموذج أو النقل/الإعداد. وهذا يُبقي
الأغلفة الوسيطة للأسماء البديلة/التوافق الخاصة بالموفّرين تعمل من دون أن يتطلب ذلك من
المستدعي معرفة أي إضافة مضمّنة تملك إعادة الكتابة. وإذا لم يُعِد أي خطاف موفّر
كتابة إدخال إعداد مدعوم من Google-family، فسيظل مطبّع إعداد Google
المضمّن يطبّق تنظيف التوافق هذا.
إذا كان الموفّر يحتاج إلى بروتوكول سلكي مخصص بالكامل أو منفّذ طلبات مخصص،
فهذه فئة مختلفة من الامتداد. هذه الخطافات مخصصة لسلوك الموفّر
الذي لا يزال يعمل على حلقة الاستدلال العادية في OpenClaw.
مثال على موفّر
أمثلة مضمّنة
- يستخدم Anthropic الخطافات
resolveDynamicModelوcapabilitiesوbuildAuthDoctorHintوresolveUsageAuthوfetchUsageSnapshotوisCacheTtlEligibleوresolveDefaultThinkingLevelوapplyConfigDefaultsوisModernModelRef، وwrapStreamFnلأنه يملك التوافق الأمامي لـ Claude 4.6، وتلميحات عائلة الموفّر، وإرشادات إصلاح المصادقة، وتكامل نقطة نهاية الاستخدام، وأهلية التخزين المؤقت للمطالبة، والإعدادات الافتراضية الواعية بالمصادقة، وسياسة التفكير الافتراضي/التكيفي لـ Claude، وتشكيل البث الخاص بـ Anthropic لرؤوس beta و/fast/serviceTierوcontext1m. - تبقى مساعدات البث الخاصة بـ Claude التابعة لـ Anthropic ضمن
الحد العام
api.ts/contract-api.tsالخاص بالإضافة المضمّنة في الوقت الحالي. ويقوم سطح الحزمة هذا بتصديرwrapAnthropicProviderStreamوresolveAnthropicBetasوresolveAnthropicFastModeوresolveAnthropicServiceTierوبناة الأغلفة ذات المستوى الأدنى الخاصة بـ Anthropic بدلًا من توسيع SDK العام حول قواعد رؤوس beta الخاصة بموفّر واحد. - تستخدم OpenAI الخطافات
resolveDynamicModelوnormalizeResolvedModelوcapabilitiesبالإضافة إلىbuildMissingAuthMessageوsuppressBuiltInModelوaugmentModelCatalogوsupportsXHighThinkingوisModernModelRefلأنها تملك التوافق الأمامي لـ GPT-5.4، وتطبيعopenai-completions->openai-responsesالمباشر في OpenAI، وتلميحات المصادقة الواعية بـ Codex، وإخفاء Spark، والصفوف الاصطناعية لقائمة OpenAI، وسياسة التفكير / النموذج الحي الخاصة بـ GPT-5؛ وتمتلك عائلة البثopenai-responses-defaultsأغلفة OpenAI Responses الأصلية المشتركة من أجل رؤوس الإسناد، و/fast/serviceTier، وإسهاب النص، وبحث الويب الأصلي لـ Codex، وتشكيل الحمولة المتوافق مع الاستدلال، وإدارة سياق Responses. - تستخدم OpenRouter
catalogبالإضافة إلىresolveDynamicModelوprepareDynamicModelلأن الموفّر يعمل كتمرير مباشر وقد يكشف عن معرّفات نماذج جديدة قبل تحديث الكتالوج الثابت في OpenClaw؛ كما يستخدمcapabilitiesوwrapStreamFnوisCacheTtlEligibleلإبقاء رؤوس الطلبات الخاصة بالموفّر، وبيانات التوجيه الوصفية، وترقيعات الاستدلال، وسياسة التخزين المؤقت للمطالبة خارج النواة. وتأتي سياسة replay الخاصة به من عائلةpassthrough-gemini، بينما تمتلك عائلة البثopenrouter-thinkingحقن الاستدلال عبر الوكيل وتخطي النماذج غير المدعومة /auto. - يستخدم GitHub Copilot
catalogوauthوresolveDynamicModelوcapabilitiesبالإضافة إلىprepareRuntimeAuthوfetchUsageSnapshotلأنه يحتاج إلى تسجيل دخول الجهاز المملوك للموفّر، وسلوك التراجع عن النموذج، وخصائص نصوص Claude، وتبادل رمز GitHub إلى رمز Copilot، ونقطة نهاية استخدام مملوكة للموفّر. - تستخدم OpenAI Codex الخطافات
catalogوresolveDynamicModelوnormalizeResolvedModelوrefreshOAuthوaugmentModelCatalogبالإضافة إلىprepareExtraParamsوresolveUsageAuthوfetchUsageSnapshotلأنها لا تزال تعمل على نواقل OpenAI الأساسية لكنها تملك تطبيع النقل/base URL، وسياسة التراجع لتحديث OAuth، وخيار النقل الافتراضي، وصفوف كتالوج Codex الاصطناعية، وتكامل نقطة نهاية استخدام ChatGPT؛ وهي تشترك في عائلة البثopenai-responses-defaultsنفسها مع OpenAI المباشرة. - تستخدم Google AI Studio وGemini CLI OAuth الخطافات
resolveDynamicModel،buildReplayPolicy، وsanitizeReplayHistory، وresolveReasoningOutputMode، وwrapStreamFn، وisModernModelRefلأن عائلة replaygoogle-geminiتملك التراجع المتوافق أماميًا لـ Gemini 3.1، والتحقق الأصلي من replay في Gemini، وتنقية replay عند التمهيد، ووضع مخرجات الاستدلال الموسوم، ومطابقة النماذج الحديثة، بينما تمتلك عائلة البثgoogle-thinkingتطبيع حمولة التفكير في Gemini؛ كما يستخدم Gemini CLI OAuth أيضًاformatApiKeyوresolveUsageAuthوfetchUsageSnapshotمن أجل تنسيق الرمز، وتحليل الرمز، وربط نقطة نهاية الحصة. - يستخدم Anthropic Vertex
buildReplayPolicyعبر عائلة replayanthropic-by-modelبحيث يبقى تنظيف replay الخاص بـ Claude محصورًا ضمن معرّفات Claude بدلًا من كل نقلanthropic-messages. - يستخدم Amazon Bedrock الخطافات
buildReplayPolicyوmatchesContextOverflowErrorوclassifyFailoverReasonوresolveDefaultThinkingLevelلأنه يملك تصنيف الأخطاء الخاصة بـ Bedrock مثل تقييد المعدل/عدم الجاهزية/تجاوز السياق لحركة Anthropic-on-Bedrock؛ بينما تظل سياسة replay الخاصة به تشترك في الحارس نفسهanthropic-by-modelالمخصص لـ Claude فقط. - تستخدم OpenRouter وKilocode وOpencode وOpencode Go الخطاف
buildReplayPolicyعبر عائلة replaypassthrough-geminiلأنها توكّل نماذج Gemini عبر نواقل متوافقة مع OpenAI وتحتاج إلى تنقية thought-signature الخاصة بـ Gemini من دون تحقق replay أصلي لـ Gemini أو إعادة كتابة عند التمهيد. - تستخدم MiniMax
buildReplayPolicyعبر عائلة replayhybrid-anthropic-openaiلأن موفّرًا واحدًا يملك كلًا من دلالات رسائل Anthropic والدلالات المتوافقة مع OpenAI؛ وهو يُبقي إسقاط كتل التفكير الخاصة بـ Claude على جانب Anthropic فقط مع تجاوز وضع مخرجات الاستدلال إلى الوضع الأصلي، وتمتلك عائلة البثminimax-fast-modeإعادة كتابة نماذج fast-mode على مسار البث المشترك. - تستخدم Moonshot
catalogبالإضافة إلىwrapStreamFnلأنها لا تزال تستخدم نقل OpenAI المشترك لكنها تحتاج إلى تطبيع حمولة التفكير المملوك للموفّر؛ وتمتلك عائلة البثmoonshot-thinkingربط الإعداد بالإضافة إلى حالة/thinkبحمولة التفكير الثنائية الأصلية الخاصة بها. - تستخدم Kilocode
catalogوcapabilitiesوwrapStreamFnوisCacheTtlEligibleلأنها تحتاج إلى رؤوس طلبات مملوكة للموفّر، وتطبيع حمولة الاستدلال، وتلميحات نصوص Gemini، وضبط Anthropic لـ cache-TTL؛ وتُبقي عائلة البثkilocode-thinkingحقن تفكير Kilo على مسار البث الوكيل المشترك مع تخطيkilo/autoو معرّفات نماذج الوكيل الأخرى التي لا تدعم حمولات استدلال صريحة. - تستخدم Z.AI الخطافات
resolveDynamicModelوprepareExtraParamsوwrapStreamFn، وisCacheTtlEligibleوisBinaryThinkingوisModernModelRef، وresolveUsageAuthوfetchUsageSnapshotلأنها تملك التراجع لـ GLM-5، وإعداداتtool_streamالافتراضية، وتجربة المستخدم الخاصة بالتفكير الثنائي، ومطابقة النماذج الحديثة، بالإضافة إلى مصادقة الاستخدام + جلب الحصة؛ وتُبقي عائلة البثtool-stream-default-onغلافtool_streamالافتراضي التشغيل خارج الشيفرة اليدوية الخاصة بكل موفّر. - تستخدم xAI الخطافات
normalizeResolvedModelوnormalizeTransport، وcontributeResolvedModelCompatوprepareExtraParamsوwrapStreamFn، وresolveSyntheticAuthوresolveDynamicModelوisModernModelRefلأنها تملك تطبيع نقل xAI Responses الأصلي، وإعادة كتابة الأسماء البديلة لـ fast-mode في Grok، وtool_streamالافتراضي، وتنظيف strict-tool / حمولة الاستدلال، وإعادة استخدام مصادقة التراجع للأدوات المملوكة للإضافة، وحل نماذج Grok المتوافق أماميًا، وترقيعات التوافق المملوكة للموفّر مثل ملف تعريف مخطط أدوات xAI، والكلمات المفتاحية غير المدعومة في المخطط، وweb_searchالأصلي، وفك ترميز وسائط HTML في وسائط استدعاء الأدوات. - تستخدم Mistral وOpenCode Zen وOpenCode Go الخطاف
capabilitiesفقط لإبقاء خصائص النصوص/الأدوات خارج النواة. - تستخدم الموفّرات المضمّنة المعتمدة على الكتالوج فقط مثل
byteplusوcloudflare-ai-gateway، وhuggingfaceوkimi-codingوnvidiaوqianfan، وsyntheticوtogetherوveniceوvercel-ai-gatewayوvolcengineالخطافcatalogفقط. - تستخدم Qwen
catalogلموفّر النص الخاص بها بالإضافة إلى تسجيلات فهم الوسائط المشتركة وإنشاء الفيديو لأسطحها متعددة الوسائط. - تستخدم MiniMax وXiaomi
catalogبالإضافة إلى خطافات الاستخدام لأن سلوك/usageالخاص بهما مملوك للإضافة رغم أن الاستدلال لا يزال يعمل عبر النواقل المشتركة.
مساعدات وقت التشغيل
يمكن للإضافات الوصول إلى مساعدات أساسية محددة عبرapi.runtime. بالنسبة إلى TTS:
- يعيد
textToSpeechحمولة خرج TTS الأساسية العادية لأسطح الملفات/الملاحظات الصوتية. - يستخدم إعداد
messages.ttsالأساسي واختيار الموفّر. - يعيد مخزن PCM الصوتي + معدل العيّنة. ويجب على الإضافات إعادة أخذ العينات/الترميز للمورّدين.
listVoicesاختياري لكل موفّر. استخدمه لمنتقيات الأصوات المملوكة للمورّد أو تدفقات الإعداد.- يمكن أن تتضمن قوائم الأصوات بيانات وصفية أكثر غنى مثل اللغة والمنطقة، والجنس، ووسوم الشخصية لمنتقيات واعية بالموفّر.
- تدعم OpenAI وElevenLabs الاتصالات الهاتفية اليوم. أما Microsoft فلا تدعم ذلك.
api.registerSpeechProvider(...).
- أبقِ سياسة TTS، والتراجع، وتسليم الرد في النواة.
- استخدم موفّري الكلام لسلوك التوليف المملوك للمورّد.
- يُطبَّع إدخال Microsoft القديم
edgeإلى معرّف الموفّرmicrosoft. - نموذج الملكية المفضل موجّه للشركة: يمكن لإضافة مورّد واحدة أن تملك موفّري النص والكلام والصور وموفّري الوسائط المستقبلية مع إضافة OpenClaw لتلك العقود الخاصة بالإمكانات.
- أبقِ التنسيق، والتراجع، والإعداد، وربط القنوات في النواة.
- أبقِ سلوك المورّد داخل إضافة الموفّر.
- يجب أن يظل التوسع الإضافي مكتوب النوع: أساليب اختيارية جديدة، وحقول نتائج اختيارية جديدة، وإمكانات اختيارية جديدة.
- يتبع إنشاء الفيديو بالفعل النمط نفسه:
- تملك النواة عقد الإمكانية ومساعد وقت التشغيل
- تسجّل إضافات المورّدين
api.registerVideoGenerationProvider(...) - تستهلك إضافات الميزات/القنوات
api.runtime.videoGeneration.*
api.runtime.mediaUnderstanding.*هو السطح المشترك المفضل من أجل فهم الصور/الصوت/الفيديو.- يستخدم إعداد الصوت الأساسي الخاص بفهم الوسائط (
tools.media.audio) وترتيب التراجع الخاص بالموفّر. - يعيد
{ text: undefined }عندما لا يتم إنتاج خرج نسخ (على سبيل المثال عند تخطي إدخال غير مدعوم). - يبقى
api.runtime.stt.transcribeAudioFile(...)اسمًا بديلًا للتوافق.
api.runtime.subagent:
providerوmodelهما تجاوزان اختياريان لكل تشغيل، وليسا تغييرات دائمة للجلسة.- لا يلتزم OpenClaw بحقول التجاوز هذه إلا للمستدعين الموثوقين.
- بالنسبة إلى عمليات التراجع المملوكة للإضافة، يجب على المشغّلين تفعيل ذلك صراحةً عبر
plugins.entries.<id>.subagent.allowModelOverride: true. - استخدم
plugins.entries.<id>.subagent.allowedModelsلتقييد الإضافات الموثوقة بأهدافprovider/modelقياسية محددة، أو"*"للسماح بأي هدف بشكل صريح. - لا تزال عمليات الوكيل الفرعي للإضافات غير الموثوقة تعمل، لكن تُرفض طلبات التجاوز بدلًا من الرجوع بصمت إلى التراجع.
api.registerWebSearchProvider(...).
ملاحظات:
- أبقِ اختيار الموفّر، وحل بيانات الاعتماد، ودلالات الطلب المشتركة في النواة.
- استخدم موفّري بحث الويب لوسائط النقل الخاصة بالبحث المملوكة للمورّد.
api.runtime.webSearch.*هو السطح المشترك المفضل لإضافات الميزات/القنوات التي تحتاج إلى سلوك بحث من دون الاعتماد على غلاف أداة الوكيل.
api.runtime.imageGeneration
generate(...): إنشاء صورة باستخدام سلسلة موفّر إنشاء الصور المهيأة.listProviders(...): سرد موفّري إنشاء الصور المتاحين وإمكاناتهم.
مسارات Gateway HTTP
يمكن للإضافات كشف نقاط نهاية HTTP عبرapi.registerHttpRoute(...).
path: مسار التوجيه تحت خادم Gateway HTTP.auth: مطلوب. استخدم"gateway"لطلب مصادقة Gateway العادية، أو"plugin"للمصادقة/التحقق من webhook المُدار بواسطة الإضافة.match: اختياري."exact"(الافتراضي) أو"prefix".replaceExisting: اختياري. يسمح للإضافة نفسها باستبدال تسجيل المسار الحالي الخاص بها.handler: أعِدtrueعندما يكون المسار قد عالج الطلب.
- تمت إزالة
api.registerHttpHandler(...)وسيسبب خطأ عند تحميل الإضافة. استخدمapi.registerHttpRoute(...)بدلًا منه. - يجب أن تعلن مسارات الإضافة عن
authصراحةً. - تُرفض تعارضات
path + matchالمطابقة ما لم يكنreplaceExisting: true، ولا يمكن لإضافة أن تستبدل مسار إضافة أخرى. - تُرفض المسارات المتداخلة ذات مستويات
authالمختلفة. اجعل سلاسل التمريرexact/prefixعلى مستوى المصادقة نفسه فقط. - لا تتلقى المسارات ذات
auth: "plugin"نطاقات وقت تشغيل المشغّل تلقائيًا. فهي مخصصة لـ webhooks/التحقق من التوقيع المُدار بواسطة الإضافة، وليست لاستدعاءات مساعد Gateway المميّزة. - تعمل المسارات ذات
auth: "gateway"داخل نطاق وقت تشغيل طلب Gateway، لكن هذا النطاق متحفّظ عمدًا:- تبقي مصادقة bearer ذات السر المشترك (
gateway.auth.mode = "token"/"password") نطاقات وقت تشغيل مسار الإضافة مثبتة عندoperator.write، حتى إذا أرسل المستدعيx-openclaw-scopes - تلتزم أوضاع HTTP الموثوقة الحاملة للهوية (على سبيل المثال
trusted-proxyأوgateway.auth.mode = "none"على مدخل خاص) بـx-openclaw-scopesفقط عندما يكون الترويسة موجودة صراحةً - إذا غابت
x-openclaw-scopesعن طلبات مسار الإضافة الحاملة للهوية تلك، يعود نطاق وقت التشغيل إلىoperator.write
- تبقي مصادقة bearer ذات السر المشترك (
- القاعدة العملية: لا تفترض أن مسار الإضافة ذي مصادقة gateway هو سطح إداري ضمني. إذا كان مسارك يحتاج إلى سلوك إداري فقط، فاطلب وضع مصادقة حاملًا للهوية ووثّق عقد الترويسة
x-openclaw-scopesالصريح.
مسارات استيراد Plugin SDK
استخدم المسارات الفرعية لـ SDK بدلًا من الاستيراد الأحاديopenclaw/plugin-sdk عند
تأليف الإضافات:
openclaw/plugin-sdk/plugin-entryمن أجل بدائيات تسجيل الإضافات.openclaw/plugin-sdk/coreمن أجل العقد العام المشترك المواجه للإضافة.openclaw/plugin-sdk/config-schemaمن أجل تصدير مخطط Zod الجذر لـopenclaw.json(OpenClawSchema).- بدائيات القنوات الثابتة مثل
openclaw/plugin-sdk/channel-setup, وopenclaw/plugin-sdk/setup-runtime, وopenclaw/plugin-sdk/setup-adapter-runtime, وopenclaw/plugin-sdk/setup-tools, وopenclaw/plugin-sdk/channel-pairing, وopenclaw/plugin-sdk/channel-contract, وopenclaw/plugin-sdk/channel-feedback, وopenclaw/plugin-sdk/channel-inbound, وopenclaw/plugin-sdk/channel-lifecycle, وopenclaw/plugin-sdk/channel-reply-pipeline, وopenclaw/plugin-sdk/command-auth, وopenclaw/plugin-sdk/secret-input، وopenclaw/plugin-sdk/webhook-ingressمن أجل الربط المشترك الخاص بالإعداد/المصادقة/الرد/webhook. يمثّلchannel-inboundالموطن المشترك لمساعدات إزالة الارتداد، ومطابقة الإشارات، وسياسة الإشارات الواردة، وتنسيق الأظرف، وسياق ظرف الوارد. ويمثّلchannel-setupحد الإعداد الضيق للتثبيت الاختياري. ويمثّلsetup-runtimeسطح الإعداد الآمن لوقت التشغيل المستخدم من قبلsetupEntry/ بدء التشغيل المؤجل، بما في ذلك محولات ترقيع الإعداد الآمنة للاستيراد. ويمثّلsetup-adapter-runtimeحد محول إعداد الحساب الواعي بالبيئة. ويمثّلsetup-toolsحد المساعدات الصغير الخاص بـ CLI/الأرشيف/الوثائق (formatCliCommand,detectBinary,extractArchive,resolveBrewExecutable,formatDocsLink,CONFIG_DIR). - المسارات الفرعية الخاصة بالمجالات مثل
openclaw/plugin-sdk/channel-config-helpers, وopenclaw/plugin-sdk/allow-from, وopenclaw/plugin-sdk/channel-config-schema, وopenclaw/plugin-sdk/telegram-command-config, وopenclaw/plugin-sdk/channel-policy, وopenclaw/plugin-sdk/approval-gateway-runtime, وopenclaw/plugin-sdk/approval-handler-adapter-runtime, وopenclaw/plugin-sdk/approval-handler-runtime, وopenclaw/plugin-sdk/approval-runtime, وopenclaw/plugin-sdk/config-runtime, وopenclaw/plugin-sdk/infra-runtime, وopenclaw/plugin-sdk/agent-runtime, وopenclaw/plugin-sdk/lazy-runtime, وopenclaw/plugin-sdk/reply-history, وopenclaw/plugin-sdk/routing, وopenclaw/plugin-sdk/status-helpers, وopenclaw/plugin-sdk/text-runtime, وopenclaw/plugin-sdk/runtime-store، وopenclaw/plugin-sdk/directory-runtimeمن أجل مساعدات وقت التشغيل/الإعداد المشتركة. ويمثلtelegram-command-configالحد العام الضيق الخاص بتطبيع/التحقق من الأوامر المخصصة في Telegram، ويظل متاحًا حتى إذا أصبح سطح عقد Telegram المضمّن غير متاح مؤقتًا. ويمثلtext-runtimeالحد المشترك للنص/Markdown/التسجيل، بما في ذلك إزالة النص المرئي للمساعد، ومساعدات العرض/التقطيع في Markdown، ومساعدات الحجب، ومساعدات directive-tag، وأدوات النص الآمن. - ينبغي أن تفضّل الحدود الخاصة بالقنوات المعتمدة على الموافقة عقد
approvalCapabilityواحدًا على الإضافة. بعد ذلك تقرأ النواة مصادقة الموافقة، والتسليم، والعرض، والتوجيه الأصلي، وسلوك المعالج الأصلي الكسول عبر هذه الإمكانية الواحدة بدلًا من خلط سلوك الموافقة في حقول إضافات غير مرتبطة. - تم إهمال
openclaw/plugin-sdk/channel-runtimeولم يبق إلا كطبقة توافق للإضافات الأقدم. يجب على الشيفرة الجديدة استيراد البدائيات العامة الأضيق بدلًا منه، ويجب ألا تضيف شيفرة المستودع استيرادات جديدة من هذه الطبقة. - تبقى الأجزاء الداخلية للامتدادات المضمّنة خاصة. يجب على الإضافات الخارجية استخدام
المسارات الفرعية
openclaw/plugin-sdk/*فقط. ويمكن لشيفرة/اختبارات نواة OpenClaw استخدام نقاط الإدخال العامة في المستودع تحت جذر حزمة الإضافة مثلindex.js,api.js,runtime-api.js,setup-entry.js، والملفات ذات النطاق الضيق مثلlogin-qr-api.js. لا تستورد أبدًاsrc/*من حزمة إضافة داخل النواة أو من امتداد آخر. - تقسيم نقطة الإدخال في المستودع:
<plugin-package-root>/api.jsهو حاوية المساعدات/الأنواع، و<plugin-package-root>/runtime-api.jsهو حاوية وقت التشغيل فقط، و<plugin-package-root>/index.jsهو مدخل الإضافة المضمّنة، و<plugin-package-root>/setup-entry.jsهو مدخل إضافة الإعداد. - أمثلة موفّرين مضمّنين حالية:
- تستخدم Anthropic
api.js/contract-api.jsلمساعدات بث Claude مثلwrapAnthropicProviderStream، ومساعدات رؤوس beta، وتحليلservice_tier. - تستخدم OpenAI
api.jsلبناة الموفّر، ومساعدات النموذج الافتراضي، وبناة موفّر الزمن الحقيقي. - تستخدم OpenRouter
api.jsلباني الموفّر الخاص بها بالإضافة إلى مساعدات الإعداد/التهيئة، بينما يمكن لـregister.runtime.jsأن يعيد تصدير مساعداتplugin-sdk/provider-streamالعامة للاستخدام المحلي داخل المستودع.
- تستخدم Anthropic
- تفضّل نقاط الإدخال العامة المحمّلة عبر الواجهة لقطة إعداد وقت التشغيل النشطة عندما تكون موجودة، ثم تعود إلى ملف الإعداد المحلول على القرص عندما لا يكون OpenClaw قد بدأ بعد في تقديم لقطة وقت تشغيل.
- تبقى البدائيات العامة المشتركة هي عقد SDK العام المفضّل. ولا تزال هناك مجموعة
توافق صغيرة ومحجوزة من حدود المساعدات ذات العلامة التجارية الخاصة بالقنوات المضمّنة.
تعامل مع هذه على أنها حدود صيانة/توافق خاصة بالمضمّنات، وليست أهداف استيراد جديدة
لطرف ثالث؛ ويجب أن تظل العقود الجديدة العابرة للقنوات تهبط على
المسارات العامة
plugin-sdk/*أو على الحاويات المحلية للإضافةapi.js/runtime-api.js.
- تجنّب الحاوية الجذرية
openclaw/plugin-sdkفي الشيفرة الجديدة. - فضّل أولًا البدائيات الثابتة الضيقة. فالمسارات الفرعية الأحدث الخاصة بـ setup/pairing/reply/
feedback/contract/inbound/threading/command/secret-input/webhook/infra/
allowlist/status/message-tool هي العقد المقصود لأعمال الإضافات الجديدة
المضمّنة والخارجية.
ينتمي تحليل/مطابقة الهدف إلى
openclaw/plugin-sdk/channel-targets. وتنتمي بوابات إجراءات الرسائل ومساعدات معرّف رسالة التفاعل إلىopenclaw/plugin-sdk/channel-actions. - لا تُعد حاويات المساعدات الخاصة بالامتدادات المضمّنة ثابتة افتراضيًا. إذا كان
المساعد مطلوبًا فقط لامتداد مضمّن، فأبقِه خلف
الحد المحلي لذلك الامتداد
api.jsأوruntime-api.jsبدلًا من ترقيته إلىopenclaw/plugin-sdk/<extension>. - يجب أن تكون حدود المساعدات المشتركة الجديدة عامة، لا مرتبطة بعلامة قناة معينة. ينتمي
تحليل الأهداف المشترك إلى
openclaw/plugin-sdk/channel-targets؛ أما الأجزاء الداخلية الخاصة بالقناة فتظل خلف الحد المحليapi.jsأوruntime-api.jsللإضافة المالكة. - توجد مسارات فرعية خاصة بالإمكانات مثل
image-generation, وmedia-understanding، وspeechلأن الإضافات الأصلية/المضمّنة تستخدمها اليوم. ووجودها لا يعني بحد ذاته أن كل مساعد مُصدَّر هو عقدًا خارجيًا ثابتًا على المدى الطويل.
مخططات أداة الرسائل
يجب أن تملك الإضافات مساهمات المخطط الخاصة بالقناة فيdescribeMessageTool(...). أبقِ الحقول الخاصة بالمورّد داخل الإضافة، لا في النواة المشتركة.
بالنسبة إلى أجزاء المخطط المحمولة والمشتركة، أعد استخدام المساعدات العامة المصدّرة عبر
openclaw/plugin-sdk/channel-actions:
createMessageToolButtonsSchema()لحمولات على نمط شبكة الأزرارcreateMessageToolCardSchema()لحمولات البطاقات المهيكلة
حل أهداف القنوات
يجب أن تملك إضافات القنوات دلالات الأهداف الخاصة بالقناة. أبقِ مضيف الإرسال المشترك عامًا واستخدم سطح محول المراسلة لقواعد الموفّر:messaging.inferTargetChatType({ to })يقرر ما إذا كان الهدف المُطبَّع يجب أن يُعامل على أنهdirectأوgroupأوchannelقبل البحث في الدليل.messaging.targetResolver.looksLikeId(raw, normalized)يحدد للنواة ما إذا كان يجب على الإدخال تخطيه مباشرة إلى حل شبيه بالمعرّف بدلًا من البحث في الدليل.messaging.targetResolver.resolveTarget(...)هو مسار التراجع الخاص بالإضافة عندما تحتاج النواة إلى حل نهائي مملوك للموفّر بعد التطبيع أو بعد فشل البحث في الدليل.messaging.resolveOutboundSessionRoute(...)يملك إنشاء مسار الجلسة الصادر الخاص بالموفّر بمجرد حل الهدف.
- استخدم
inferTargetChatTypeلقرارات الفئة التي يجب أن تحدث قبل البحث بين النظراء/المجموعات. - استخدم
looksLikeIdلفحوصات “عامل هذا كمعرّف هدف صريح/أصلي”. - استخدم
resolveTargetللتراجع الخاص بالتطبيع عند الموفّر، وليس لبحث واسع في الدليل. - أبقِ المعرّفات الأصلية الخاصة بالموفّر مثل معرّفات الدردشة، ومعرّفات الخيوط، وJIDs،
والمقابض، ومعرّفات الغرف داخل قيم
targetأو المعلمات الخاصة بالموفّر، لا في حقول SDK العامة.
الأدلة المدعومة بالإعداد
يجب على الإضافات التي تستمد إدخالات الدليل من الإعداد أن تُبقي هذا المنطق داخل الإضافة وأن تعيد استخدام المساعدات المشتركة منopenclaw/plugin-sdk/directory-runtime.
استخدم هذا عندما تحتاج القناة إلى نظراء/مجموعات مدعومة بالإعداد مثل:
- نظراء الرسائل المباشرة المعتمدون على allowlist
- خرائط القنوات/المجموعات المهيأة
- بدائل الدليل الثابتة ضمن نطاق الحساب
directory-runtime تتعامل فقط مع العمليات العامة:
- تصفية الاستعلام
- تطبيق الحد
- مساعدات إزالة التكرار/التطبيع
- بناء
ChannelDirectoryEntry[]
كتالوجات الموفّرين
يمكن لإضافات الموفّرين تعريف كتالوجات نماذج للاستدلال عبرregisterProvider({ catalog: { run(...) { ... } } }).
يعيد catalog.run(...) الشكل نفسه الذي يكتبه OpenClaw داخل
models.providers:
{ provider }لإدخال موفّر واحد{ providers }لإدخالات موفّرين متعددة
catalog عندما تملك الإضافة معرّفات نماذج خاصة بالموفّر، أو إعدادات
افتراضية لـ base URL، أو بيانات وصفية للنماذج مقيدة بالمصادقة.
يتحكم catalog.order في توقيت دمج كتالوج الإضافة مقارنةً بموفّري OpenClaw
الضمنيين المدمجين:
simple: موفّرون عاديون يعتمدون على مفتاح API أو متغيرات البيئةprofile: موفّرون يظهرون عند وجود ملفات مصادقةpaired: موفّرون يصطنعون إدخالات متعددة مترابطة لموفّرينlate: المرور الأخير، بعد الموفّرين الضمنيين الآخرين
- لا يزال
discoveryيعمل كاسم بديل قديم - إذا تم تسجيل كل من
catalogوdiscovery، فإن OpenClaw يستخدمcatalog
فحص القنوات للقراءة فقط
إذا كانت إضافتك تسجّل قناة، ففضّل تنفيذplugin.config.inspectAccount(cfg, accountId) إلى جانب resolveAccount(...).
السبب:
resolveAccount(...)هو مسار وقت التشغيل. ويُسمح له بافتراض أن بيانات الاعتماد قد شُكّلت بالكامل، ويمكنه الفشل بسرعة عند غياب الأسرار المطلوبة.- يجب ألا تحتاج مسارات الأوامر المخصصة للقراءة فقط مثل
openclaw statusوopenclaw status --all، وopenclaw channels status، وopenclaw channels resolve، وتدفقات doctor/config repair إلى تشكيل بيانات اعتماد وقت التشغيل لمجرد وصف الإعداد.
inspectAccount(...):
- أعِد حالة وصفية للحساب فقط.
- حافظ على
enabledوconfigured. - ضمّن حقول مصدر/حالة بيانات الاعتماد عند الحاجة، مثل:
tokenSource,tokenStatusbotTokenSource,botTokenStatusappTokenSource,appTokenStatussigningSecretSource,signingSecretStatus
- لا تحتاج إلى إعادة قيم الرموز الخام لمجرد الإبلاغ عن
التوفر للقراءة فقط. إن إعادة
tokenStatus: "available"(وحقل المصدر المطابق) كافٍ لأوامر نمط الحالة. - استخدم
configured_unavailableعندما تكون بيانات الاعتماد مهيأة عبر SecretRef ولكنها غير متاحة في مسار الأوامر الحالي.
حزم Package packs
يمكن أن يتضمن دليل الإضافةpackage.json يحتوي على openclaw.extensions:
name/<fileBase>.
إذا كانت إضافتك تستورد تبعيات npm، فقم بتثبيتها في ذلك الدليل لكي
يصبح node_modules متاحًا (npm install / pnpm install).
حاجز أمان: يجب أن يبقى كل إدخال openclaw.extensions داخل دليل الإضافة
بعد حل الروابط الرمزية. وتُرفض الإدخالات التي تفلت من دليل الحزمة.
ملاحظة أمنية: يقوم openclaw plugins install بتثبيت تبعيات الإضافة باستخدام
npm install --omit=dev --ignore-scripts (من دون سكربتات دورة الحياة، ومن دون تبعيات تطوير وقت التشغيل). أبقِ أشجار تبعيات الإضافة
“JS/TS خالصة” وتجنب الحزم التي تتطلب بناء postinstall.
اختياري: يمكن أن يشير openclaw.setupEntry إلى وحدة خفيفة مخصصة للإعداد فقط.
عندما يحتاج OpenClaw إلى أسطح إعداد لإضافة قناة معطّلة، أو
عندما تكون إضافة القناة مفعّلة ولكنها لا تزال غير مهيأة، فإنه يحمّل setupEntry
بدلًا من مدخل الإضافة الكامل. وهذا يُبقي بدء التشغيل والإعداد أخف
عندما يقوم مدخل الإضافة الرئيسي أيضًا بربط الأدوات أو الخطافات أو غيرها من
الشيفرات الخاصة بوقت التشغيل فقط.
اختياري: يمكن أن يختار openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen
إضافة قناة إلى مسار setupEntry نفسه خلال
مرحلة بدء التشغيل السابقة للاستماع في البوابة، حتى عندما تكون القناة مهيأة بالفعل.
استخدم هذا فقط عندما يغطي setupEntry بالكامل سطح بدء التشغيل الذي يجب أن يوجد
قبل أن تبدأ البوابة في الاستماع. وعمليًا، يعني ذلك أن
مدخل الإعداد يجب أن يسجل كل إمكانية مملوكة للقناة يعتمد عليها بدء التشغيل، مثل:
- تسجيل القناة نفسها
- أي مسارات HTTP يجب أن تكون متاحة قبل أن تبدأ البوابة في الاستماع
- أي أساليب Gateway أو أدوات أو خدمات يجب أن توجد خلال النافذة نفسها
singleAccountKeysToMovenamedAccountPromotionKeysresolveSingleAccountPromotionTarget(...)
channels.<id>.accounts.* من دون تحميل مدخل الإضافة الكامل.
وتُعد Matrix المثال المضمّن الحالي: فهي تنقل فقط مفاتيح المصادقة/التمهيد إلى
حساب مُرقّى مسمى عندما تكون الحسابات المسماة موجودة بالفعل، ويمكنها
الحفاظ على مفتاح حساب افتراضي غير قياسي مهيأ بدلًا من إنشاء
accounts.default دائمًا.
تُبقي محولات ترقيع الإعداد تلك اكتشاف سطح العقود المضمّنة كسولًا. ويبقى وقت
الاستيراد خفيفًا؛ ولا يُحمّل سطح الترقية إلا عند أول استخدام بدلًا من
إعادة الدخول في بدء تشغيل القناة المضمّنة عند استيراد الوحدة.
عندما تتضمن أسطح بدء التشغيل تلك أساليب Gateway RPC، فأبقِها على
بادئة خاصة بالإضافة. وتبقى مساحات أسماء الإدارة الأساسية (config.*,
exec.approvals.*, wizard.*, update.*) محجوزة وتُحل دائمًا إلى
operator.admin، حتى إذا طلبت إضافة نطاقًا أضيق.
مثال:
بيانات وصفية لكتالوج القنوات
يمكن لإضافات القنوات الإعلان عن بيانات إعداد/اكتشاف وصفية عبرopenclaw.channel و
تلميحات التثبيت عبر openclaw.install. وهذا يُبقي بيانات الكتالوج في النواة خالية من البيانات.
مثال:
openclaw.channel المفيدة إلى جانب المثال الأدنى:
detailLabel: تسمية ثانوية لأسطح كتالوج/حالة أكثر غنىdocsLabel: تجاوز نص الرابط الخاص برابط الوثائقpreferOver: معرّفات إضافات/قنوات ذات أولوية أقل يجب أن يتفوق عليها إدخال الكتالوج هذاselectionDocsPrefix,selectionDocsOmitLabel,selectionExtras: عناصر تحكم في نص سطح الاختيارmarkdownCapable: يعلّم القناة على أنها قادرة على Markdown من أجل قرارات التنسيق الصادرexposure.configured: إخفاء القناة من أسطح سرد القنوات المهيأة عندما تكون القيمةfalseexposure.setup: إخفاء القناة من منتقيات الإعداد/التهيئة التفاعلية عندما تكون القيمةfalseexposure.docs: تعليم القناة على أنها داخلية/خاصة لأسطح التنقل في الوثائقshowConfigured/showInSetup: لا تزال الأسماء البديلة القديمة مقبولة للتوافق؛ ويُفضّلexposurequickstartAllowFrom: إدخال القناة في تدفقallowFromالقياسي الخاص بالبداية السريعةforceAccountBinding: فرض ربط الحساب صراحةً حتى عند وجود حساب واحد فقطpreferSessionLookupForAnnounceTarget: تفضيل البحث في الجلسة عند حل أهداف الإعلان
~/.openclaw/mpm/plugins.json~/.openclaw/mpm/catalog.json~/.openclaw/plugins/catalog.json
OPENCLAW_PLUGIN_CATALOG_PATHS (أو OPENCLAW_MPM_CATALOG_PATHS) إلى
ملف JSON واحد أو أكثر (مفصولة بفاصلة/فاصلة منقوطة/محدِّد PATH). يجب أن يحتوي كل ملف
على { "entries": [ { "name": "@scope/pkg", "openclaw": { "channel": {...}, "install": {...} } } ] }. كما يقبل المحلّل
"packages" أو "plugins" كأسماء بديلة قديمة للمفتاح "entries".
إضافات محرك السياق
تملك إضافات محرك السياق تنسيق سياق الجلسة الخاص بالاستيعاب، والتجميع، والضغط. سجّلها من إضافتك باستخدامapi.registerContextEngine(id, factory)، ثم اختر المحرك النشط عبر
plugins.slots.contextEngine.
استخدم هذا عندما تحتاج إضافتك إلى استبدال مسار السياق الافتراضي أو توسيعه
بدلًا من مجرد إضافة بحث في الذاكرة أو خطافات.
compact()
منفذًا وفوّضه بشكل صريح:
إضافة إمكانية جديدة
عندما تحتاج إضافة إلى سلوك لا يناسب واجهة API الحالية، فلا تتجاوز نظام الإضافات عبر وصول خاص مباشر. أضف الإمكانية المفقودة. التسلسل الموصى به:- تعريف عقد النواة قرر ما السلوك المشترك الذي يجب أن تملكه النواة: السياسة، والتراجع، ودمج الإعداد، ودورة الحياة، والدلالات المواجهة للقنوات، وشكل مساعد وقت التشغيل.
- إضافة أسطح تسجيل/وقت تشغيل مكتوبة النوع للإضافة
وسّع
OpenClawPluginApiو/أوapi.runtimeبأصغر سطح إمكانية مكتوب النوع ومفيد. - ربط مستهلكي النواة + القنوات/الميزات يجب أن تستهلك إضافات القنوات والميزات الإمكانية الجديدة عبر النواة، لا عبر استيراد تنفيذ مورّد مباشر.
- تسجيل تنفيذات المورّد بعد ذلك تسجّل إضافات المورّد الواجهات الخلفية الخاصة بها وفق الإمكانية.
- إضافة تغطية للعقود أضف اختبارات حتى تبقى الملكية وشكل التسجيل واضحين مع مرور الوقت.
قائمة تحقق الإمكانية
عندما تضيف إمكانية جديدة، يجب أن يلامس التنفيذ عادةً هذه الأسطح معًا:- أنواع عقد النواة في
src/<capability>/types.ts - المشغّل/مساعد وقت التشغيل الأساسي في
src/<capability>/runtime.ts - سطح تسجيل واجهة API للإضافة في
src/plugins/types.ts - ربط سجل الإضافات في
src/plugins/registry.ts - كشف وقت تشغيل الإضافة في
src/plugins/runtime/*عندما تحتاج إضافات الميزات/القنوات إلى استهلاكه - مساعدات الالتقاط/الاختبار في
src/test-utils/plugin-registration.ts - تأكيدات الملكية/العقد في
src/plugins/contracts/registry.ts - وثائق المشغّل/الإضافة في
docs/
قالب الإمكانية
النمط الأدنى:- تملك النواة عقد الإمكانية + التنسيق
- تملك إضافات المورّدين تنفيذات المورّد
- تستهلك إضافات الميزات/القنوات مساعدات وقت التشغيل
- تُبقي اختبارات العقود الملكية واضحة