الواجهات الداخلية للإضافات
هذا هو مرجع البنية العميقة. للاطلاع على الأدلة العملية، راجع:
- تثبيت الإضافات واستخدامها — دليل المستخدم
- البدء — أول درس تعليمي للإضافات
- إضافات القنوات — إنشاء قناة مراسلة
- إضافات المزوّد — إنشاء مزوّد نماذج
- نظرة عامة على SDK — خريطة الاستيراد وواجهة برمجة التسجيل
نموذج القدرات العام
القدرات هي نموذج الإضافة الأصلية العام داخل 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.registerVideoGenerationProvider(...) | qwen |
| جلب الويب | api.registerWebFetchProvider(...) | firecrawl |
| البحث على الويب | api.registerWebSearchProvider(...) | google |
| القناة / المراسلة | api.registerChannel(...) | msteams, matrix |
موقف التوافق الخارجي
تم اعتماد نموذج القدرات في النواة ويُستخدم بواسطة الإضافات المضمّنة/الأصلية اليوم، لكن توافق الإضافات الخارجية ما يزال يحتاج إلى معيار أكثر إحكامًا من مجرد “إنه مُصدَّر، إذًا فهو ثابت.” الإرشادات الحالية:- الإضافات الخارجية الحالية: أبقِ التكاملات المعتمدة على الخطافات تعمل؛ واعتبر ذلك خط الأساس للتوافق
- الإضافات المضمّنة/الأصلية الجديدة: فضّل تسجيل القدرات الصريح بدلًا من الوصولات الخاصة بالمورّد أو التصاميم الجديدة المعتمدة على الخطافات فقط
- الإضافات الخارجية التي تعتمد تسجيل القدرات: مسموح بها، لكن تعامل مع أسطح المساعدة الخاصة بالقدرات على أنها قابلة للتطور ما لم توضح الوثائق صراحةً أن العقد مستقر
- واجهات تسجيل القدرات هي الاتجاه المقصود
- تظل الخطافات القديمة المسار الأكثر أمانًا لتجنّب الكسر للإضافات الخارجية أثناء الانتقال
- ليست كل المسارات الفرعية المساعدة المُصدَّرة متساوية؛ فضّل العقد الضيق الموثّق، لا الصادرات المساعدة العرضية
أشكال الإضافات
يصنّف 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واجهاتها الخلفية لفهم الوسائط - تُعد الإضافة
voice-callإضافة ميزة: فهي تملك نقل المكالمات والأدوات وCLI والمسارات وجسر تدفق الوسائط في Twilio، لكنها تستهلك قدرات الكلام المشتركة + النسخ الفوري والصوت الفوري بدلًا من استيراد إضافات المورّدين مباشرةً
- يبقى OpenAI في إضافة واحدة حتى لو امتد عبر نماذج النص والكلام والصور والفيديو مستقبلًا
- ويمكن لمورّد آخر فعل الشيء نفسه لمساحة عمله الخاصة
- لا تهتم القنوات بأي إضافة مورّد تملك المزوّد؛ بل تستهلك عقد القدرة المشتركة الذي تكشفه النواة
- الإضافة = حد الملكية
- القدرة = عقد النواة الذي يمكن لعدة إضافات تنفيذه أو استهلاكه
- تعريف القدرة المفقودة في النواة
- كشفها عبر واجهة الإضافة/وقت التشغيل بطريقة مكتوبة النوع
- ربط القنوات/الميزات بهذه القدرة
- والسماح لإضافات المورّدين بتسجيل التنفيذات
طبقات القدرات
استخدم هذا النموذج الذهني عند تقرير موضع الشيفرة:- طبقة القدرات الأساسية: التنسيق المشترك، والسياسة، والرجوع الاحتياطي، وقواعد دمج الإعدادات، ودلالات التسليم، والعقود المكتوبة النوع
- طبقة إضافات المورّد: واجهات برمجة التطبيقات الخاصة بالمورّد، والمصادقة، وفهارس النماذج، وتوليف الكلام، وتوليد الصور، والواجهات الخلفية المستقبلية للفيديو، ونقاط نهاية الاستخدام
- طبقة إضافة القناة/الميزة: تكامل Slack/Discord/voice-call/… إلخ الذي يستهلك القدرات الأساسية ويعرضها على سطح ما
- تملك النواة سياسة TTS أثناء الرد، وترتيب الرجوع، والتفضيلات، وتسليم القناة
- تملك
openaiوelevenlabsوmicrosoftتنفيذات التوليف - وتستهلك
voice-callمساعد وقت تشغيل TTS للهاتف
مثال على إضافة شركة متعددة القدرات
يجب أن تبدو إضافة الشركة متماسكة من الخارج. إذا كان لدى OpenClaw عقود مشتركة للنماذج، والكلام، والنسخ الفوري، والصوت الفوري، وفهم الوسائط، وتوليد الصور، وتوليد الفيديو، وجلب الويب، والبحث على الويب، فيمكن لمورّد أن يملك كل أسطحه في مكان واحد:- إضافة واحدة تملك سطح المورّد
- وما تزال النواة تملك عقود القدرات
- وتستهلك القنوات وإضافات الميزات مساعدات
api.runtime.*، لا شيفرة المورّد - ويمكن لاختبارات العقود تأكيد أن الإضافة سجلت القدرات التي تدّعي ملكيتها
مثال قدرة: فهم الفيديو
يعامل OpenClaw بالفعل فهم الصورة/الصوت/الفيديو على أنه قدرة مشتركة واحدة. وينطبق نموذج الملكية نفسه هنا:- تعرّف النواة عقد فهم الوسائط
- تسجّل إضافات المورّدين
describeImageوtranscribeAudioوdescribeVideoحسب الحاجة - تستهلك القنوات وإضافات الميزات السلوك الأساسي المشترك بدلًا من الربط المباشر مع شيفرة المورّد
api.registerVideoGenerationProvider(...) مقابله.
هل تحتاج إلى قائمة تحقق عملية للنشر؟ راجع
كتاب طبخ القدرات.
العقود وفرضها
سطح واجهة الإضافة مكتوب النوع ومركزي عمدًا فيOpenClawPluginApi. يحدد هذا العقد نقاط التسجيل المدعومة و
مساعدات وقت التشغيل التي يمكن أن تعتمد عليها الإضافة.
لماذا يهم هذا:
- يحصل مؤلفو الإضافات على معيار داخلي واحد ومستقر
- تستطيع النواة رفض الملكية المكررة مثل تسجيل إضافتين لمعرّف المزوّد نفسه
- يمكن لبدء التشغيل عرض تشخيصات عملية للتسجيلات غير السليمة
- يمكن لاختبارات العقود فرض ملكية الإضافات المضمّنة ومنع الانحراف الصامت
- فرض التسجيل وقت التشغيل يتحقق سجل الإضافات من التسجيلات أثناء تحميل الإضافات. أمثلة: معرّفات المزوّدين المكررة، ومعرّفات مزوّدي الكلام المكررة، والتسجيلات غير السليمة تنتج تشخيصات للإضافة بدلًا من سلوك غير معرّف.
- اختبارات العقود تُلتقط الإضافات المضمّنة في سجلات عقود أثناء تشغيل الاختبارات حتى يتمكن OpenClaw من تأكيد الملكية صراحةً. ويُستخدم هذا اليوم لمزوّدي النماذج، ومزوّدي الكلام، ومزوّدي البحث على الويب، وملكية التسجيل المضمّن.
ما الذي يجب أن يكون ضمن عقد
عقود الإضافات الجيدة تكون:- مكتوبة النوع
- صغيرة
- خاصة بالقدرة
- مملوكة للنواة
- قابلة لإعادة الاستخدام من عدة إضافات
- قابلة للاستهلاك من القنوات/الميزات دون معرفة بالمورّد
- سياسة خاصة بالمورّد مخفية داخل النواة
- منافذ هروب خاصة بإضافة واحدة تتجاوز السجل
- شيفرة قناة تصل مباشرةً إلى تنفيذ خاص بمورّد
- كائنات وقت تشغيل ارتجالية ليست جزءًا من
OpenClawPluginApiأوapi.runtime
نموذج التنفيذ
تعمل إضافات OpenClaw الأصلية داخل العملية مع Gateway. وهي غير معزولة. والإضافة الأصلية المحمّلة لها حد الثقة على مستوى العملية نفسه مثل شيفرة النواة. الآثار المترتبة:- يمكن للإضافة الأصلية تسجيل أدوات ومعالجات شبكية وخطافات وخدمات
- يمكن أن يتسبب خطأ في إضافة أصلية في تعطل البوابة أو زعزعة استقرارها
- تعادل الإضافة الأصلية الخبيثة تنفيذ شيفرة عشوائية داخل عملية OpenClaw
@openclaw/<id> افتراضيًا، أو لاحقة نوعية معتمدة مثل
-provider أو -plugin أو -speech أو -sandbox أو -media-understanding عندما
تكشف الحزمة عمدًا دور إضافة أضيق.
ملاحظة ثقة مهمة:
- يثق
plugins.allowفي معرّفات الإضافات، لا في مصدرها. - وتعمد إضافة مساحة عمل تحمل المعرف نفسه لإضافة مضمّنة إلى تظليل النسخة المضمّنة عندما تكون إضافة مساحة العمل هذه مفعّلة/مدرجة في قائمة السماح.
- وهذا سلوك طبيعي ومفيد للتطوير المحلي واختبار التصحيحات والإصلاحات السريعة.
حد التصدير
يصدّر OpenClaw القدرات، لا وسائل الراحة الخاصة بالتنفيذ. أبقِ تسجيل القدرات عامًا. وقلّص صادرات المساعدة غير التعاقدية:- المسارات الفرعية الخاصة بمساعدة الإضافات المضمّنة
- المسارات الفرعية لسباكة وقت التشغيل غير المقصودة كواجهة عامة
- مساعدات الراحة الخاصة بالمورّد
- مساعدات الإعداد/التجهيز التي تُعد تفاصيل تنفيذ
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 - تعزيز تسميات/عناصر نائبة في واجهة التحكم
- عرض بيانات التثبيت/الفهرس الوصفية
ما الذي يخزنه المحمّل مؤقتًا
يحتفظ 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للبحث الرخيص عن المصادقة البيئية قبل تحميل وقت التشغيل، وproviderAuthChoicesمن أجل تسميات التجهيز/اختيار المصادقة الرخيصة وبيانات أعلام CLI الوصفية قبل تحميل وقت التشغيل - خطافات وقت الإعداد:
catalog/ القديمdiscoveryبالإضافة إلىapplyConfigDefaults - خطافات وقت التشغيل:
normalizeModelId,normalizeTransport,normalizeConfig,applyNativeStreamingUsageCompat,resolveConfigApiKey,resolveSyntheticAuth,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 في البيان عندما يكون لدى المزوّد بيانات اعتماد
بيئية ينبغي لمسارات المصادقة/الحالة/منتقي النموذج العامة رؤيتها من دون تحميل
وقت تشغيل الإضافة. واستخدم providerAuthChoices في البيان عندما يجب أن تعرف
أسطح CLI الخاصة بالتجهيز/اختيار المصادقة معرّف اختيار المزوّد وتسميات
المجموعة وربط المصادقة البسيط بعَلَم واحد من دون تحميل وقت تشغيل المزوّد. وأبقِ
envVars الخاصة بوقت تشغيل المزوّد لتلميحات موجّهة للمشغل مثل تسميات التجهيز أو
متغيرات إعداد OAuth client-id/client-secret.
ترتيب الخطافات واستخدامها
بالنسبة إلى إضافات النموذج/المزوّد، يستدعي 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 | shouldDeferSyntheticProfileAuth | خفض أولوية العناصر النائبة المخزنة لملفات التعريف الاصطناعية خلف مصادقة البيئة/الإعدادات | عندما يخزن المزوّد ملفات تعريف بعناصر نائبة اصطناعية يجب ألا تسبق غيرها |
| 10 | resolveDynamicModel | بديل متزامن لمعرّفات النماذج المملوكة للمزوّد غير الموجودة بعد في السجل المحلي | عندما يقبل المزوّد معرّفات نماذج علوية عشوائية |
| 11 | prepareDynamicModel | إحماء غير متزامن، ثم يعمل resolveDynamicModel مرة أخرى | عندما يحتاج المزوّد إلى بيانات وصفية شبكية قبل حل المعرّفات غير المعروفة |
| 12 | normalizeResolvedModel | إعادة كتابة نهائية قبل أن يستخدم المشغل المضمّن النموذج المحلول | عندما يحتاج المزوّد إلى إعادة كتابة للنقل لكنه ما يزال يستخدم نقلًا أساسيًا |
| 13 | contributeResolvedModelCompat | إضافة أعلام توافق لنماذج المورّد خلف نقل متوافق آخر | عندما يتعرف المزوّد على نماذجه الخاصة في وسائل نقل وكيلة من دون أن يستولي على المزوّد |
| 14 | capabilities | بيانات وصفية مملوكة للمزوّد عن النصوص المسجلة/الأدوات تُستخدمها النواة المشتركة | عندما يحتاج المزوّد إلى خصائص لعائلته في النصوص المسجلة/المزوّد |
| 15 | normalizeToolSchemas | تطبيع مخططات الأدوات قبل أن يراها المشغل المضمّن | عندما يحتاج المزوّد إلى تنظيف مخططات خاص بعائلة النقل |
| 16 | inspectToolSchemas | إظهار تشخيصات مخططات مملوكة للمزوّد بعد التطبيع | عندما يريد المزوّد تحذيرات كلمات مفتاحية من دون تعليم النواة قواعد خاصة به |
| 17 | resolveReasoningOutputMode | تحديد عقد خرج الاستدلال الأصلي أم الموسوم | عندما يحتاج المزوّد إلى استدلال موسوم/خرج نهائي بدلًا من الحقول الأصلية |
| 18 | prepareExtraParams | تطبيع معلمات الطلب قبل أغلفة خيارات البث العامة | عندما يحتاج المزوّد إلى معلمات طلب افتراضية أو تنظيف معلمات خاص به |
| 19 | createStreamFn | استبدال مسار البث العادي بالكامل بنقل مخصص | عندما يحتاج المزوّد إلى بروتوكول سلكي مخصص، لا مجرد غلاف |
| 20 | wrapStreamFn | غلاف للبث بعد تطبيق الأغلفة العامة | عندما يحتاج المزوّد إلى أغلفة لترويسات/هيئة الطلب/توافق النموذج من دون نقل مخصص |
| 21 | resolveTransportTurnState | إرفاق ترويسات أو بيانات وصفية أصلية لكل دور من النقل | عندما يريد المزوّد أن ترسل وسائل النقل العامة هوية دور أصلية خاصة به |
| 22 | resolveWebSocketSessionPolicy | إرفاق ترويسات WebSocket أصلية أو سياسة تهدئة للجلسة | عندما يريد المزوّد ضبط ترويسات الجلسة أو سياسة الرجوع في وسائل النقل العامة عبر WS |
| 23 | formatApiKey | منسق ملف تعريف المصادقة: يصبح الملف المخزن سلسلة apiKey لوقت التشغيل | عندما يخزن المزوّد بيانات مصادقة إضافية ويحتاج إلى شكل رمز وقت تشغيل مخصص |
| 24 | refreshOAuth | تجاوز تحديث OAuth لنقاط تحديث مخصصة أو سياسة فشل التحديث | عندما لا يناسب المزوّد محدّثات pi-ai المشتركة |
| 25 | buildAuthDoctorHint | تلميح إصلاح يُلحق عند فشل تحديث OAuth | عندما يحتاج المزوّد إلى إرشاد إصلاح مصادقة مملوك له بعد فشل التحديث |
| 26 | matchesContextOverflowError | مطابق مملوك للمزوّد لخطأ تجاوز نافذة السياق | عندما يملك المزوّد أخطاء تجاوز أولية قد تفوتها الاستدلالات العامة |
| 27 | classifyFailoverReason | تصنيف سبب الرجوع المملوك للمزوّد | عندما يستطيع المزوّد تحويل أخطاء API/النقل الأولية إلى تجاوز حد المعدل/الحمل الزائد/… إلخ |
| 28 | isCacheTtlEligible | سياسة ذاكرة المطالبات المؤقتة لمزوّدي الوكلاء/النقل الخلفي | عندما يحتاج المزوّد إلى بوابة TTL خاصة بالوكيل |
| 29 | buildMissingAuthMessage | بديل عن رسالة استرداد المصادقة المفقودة العامة | عندما يحتاج المزوّد إلى تلميح استرداد خاص به عند فقدان المصادقة |
| 30 | suppressBuiltInModel | إخفاء النماذج العلوية القديمة مع تلميح خطأ اختياري للمستخدم | عندما يحتاج المزوّد إلى إخفاء صفوف قديمة أو استبدالها بتلميح خاص به |
| 31 | augmentModelCatalog | صفوف فهرس اصطناعية/نهائية تُلحق بعد الاكتشاف | عندما يحتاج المزوّد إلى صفوف توافق أمامي اصطناعية في models list والمنتقيات |
| 32 | isBinaryThinking | تبديل تشغيل/إيقاف للاستدلال لدى المزوّدين ثنائيي التفكير | عندما يكشف المزوّد تفكيرًا ثنائيًا تشغيل/إيقاف فقط |
| 33 | supportsXHighThinking | دعم استدلال xhigh لنماذج محددة | عندما يريد المزوّد xhigh لمجموعة فرعية من النماذج فقط |
| 34 | resolveDefaultThinkingLevel | مستوى /think الافتراضي لعائلة نماذج محددة | عندما يملك المزوّد سياسة /think الافتراضية لعائلة نماذج |
| 35 | isModernModelRef | مطابق النماذج الحديثة لمرشحات الملفات الحية واختيار الاختبار الدخاني | عندما يملك المزوّد مطابقة النماذج المفضلة الحية/الاختبارية |
| 36 | prepareRuntimeAuth | استبدال بيانات اعتماد مهيأة بالرمز/المفتاح الفعلي وقت التشغيل قبل الاستدلال مباشرةً | عندما يحتاج المزوّد إلى تبادل رمز أو بيانات اعتماد قصيرة العمر للطلب |
| 37 | resolveUsageAuth | حل بيانات اعتماد الاستخدام/الفوترة لـ /usage والأسطح المشابهة | عندما يحتاج المزوّد إلى تحليل رمز استخدام/حصة مخصص أو بيانات اعتماد استخدام مختلفة |
| 38 | fetchUsageSnapshot | جلب لقطات الاستخدام/الحصة الخاصة بالمزوّد وتطبيعها بعد حل المصادقة | عندما يحتاج المزوّد إلى نقطة نهاية استخدام أو محلل حمولة خاص به |
| 39 | createEmbeddingProvider | بناء مهايئ تضمين مملوك للمزوّد للذاكرة/البحث | عندما ينتمي سلوك تضمين الذاكرة إلى إضافة المزوّد |
| 40 | buildReplayPolicy | إعادة سياسة إعادة تشغيل تتحكم في معالجة النصوص المسجلة للمزوّد | عندما يحتاج المزوّد إلى سياسة نصوص مسجلة مخصصة (مثل إزالة كتل التفكير) |
| 41 | sanitizeReplayHistory | إعادة كتابة سجل إعادة التشغيل بعد التنظيف العام للنصوص المسجلة | عندما يحتاج المزوّد إلى إعادة كتابة خاصة به بعد مساعدات الضغط المشتركة |
| 42 | validateReplayTurns | تحقق نهائي من أدوار إعادة التشغيل أو إعادة تشكيلها قبل المشغل المضمّن | عندما يحتاج نقل المزوّد إلى تحقق أشد بعد التنظيف العام |
| 43 | onModelSelected | تنفيذ آثار جانبية مملوكة للمزوّد بعد الاختيار | عندما يحتاج المزوّد إلى قياس عن بُعد أو حالة مملوكة له عند تفعيل نموذج |
normalizeModelId وnormalizeTransport وnormalizeConfig أولًا من
إضافة المزوّد المطابقة، ثم تنتقل إلى إضافات مزوّد أخرى قادرة على الخطافات
إلى أن يغير أحدها فعليًا معرّف النموذج أو النقل/الإعدادات. وهذا يُبقي
وسائط الأسماء البديلة/التوافق الخاصة بالمزوّدات تعمل من دون مطالبة المستدعي
بمعرفة أي إضافة مضمّنة تملك إعادة الكتابة. وإذا لم يعِد أي خطاف مزوّد
كتابة مدخل إعداد مدعوم من Google-family، فإن مطبّع إعدادات Google المضمّن
يطبق تنظيف التوافق هذا على أي حال.
إذا احتاج المزوّد إلى بروتوكول سلكي مخصص بالكامل أو منفذ طلبات مخصص،
فهذه فئة مختلفة من الامتداد. هذه الخطافات مخصصة لسلوك المزوّد
الذي ما يزال يعمل على حلقة الاستدلال العادية في OpenClaw.
مثال مزوّد
أمثلة مضمّنة
- تستخدم Anthropic
resolveDynamicModelوcapabilitiesوbuildAuthDoctorHint، وresolveUsageAuth، وfetchUsageSnapshot، وisCacheTtlEligible، وresolveDefaultThinkingLevel، وapplyConfigDefaults، وisModernModelRef، وwrapStreamFnلأنها تملك توافق Claude 4.6 المستقبلي، وتلميحات عائلة المزوّد، وإرشادات إصلاح المصادقة، وتكامل نقطة نهاية الاستخدام، وأهلية ذاكرة المطالبات المؤقتة، والقيم الافتراضية المعتمدة على المصادقة، وسياسة التفكير الافتراضية/التكيفية لـ Claude، وتشكيل البث الخاص بـ Anthropic للترويسات التجريبية و/fast/serviceTierوcontext1m. - تظل مساعدات البث الخاصة بـ Claude في Anthropic ضمن
الفاصل العام
api.ts/contract-api.tsالخاص بالإضافة المضمّنة في الوقت الحالي. ويصدّر سطح الحزمة هذاwrapAnthropicProviderStreamوresolveAnthropicBetasوresolveAnthropicFastModeوresolveAnthropicServiceTierوبناة أغلفة Anthropic منخفضة المستوى بدلًا من توسيع SDK العام حول قواعد الترويسات التجريبية الخاصة بمزوّد واحد. - تستخدم OpenAI
resolveDynamicModelوnormalizeResolvedModelوcapabilitiesإضافةً إلىbuildMissingAuthMessageوsuppressBuiltInModelوaugmentModelCatalogوsupportsXHighThinkingوisModernModelRefلأنها تملك توافق GPT-5.4 المستقبلي، والتطبيع المباشر لـ OpenAIopenai-completions->openai-responses، وتلميحات المصادقة المدركة لـ Codex، وإخفاء Spark، وصفوف قائمة OpenAI الاصطناعية، وسياسة التفكير/النماذج الحية لـ GPT-5؛ وتمتلك عائلة البثopenai-responses-defaultsأغلفة OpenAI Responses الأصلية المشتركة لترويسات الإسناد، و/fast/serviceTier، وإسهاب النص، والبحث الأصلي على الويب لـ Codex، وتشكيل حمولة توافق الاستدلال، وإدارة سياق Responses. - تستخدم OpenRouter
catalogإضافةً إلىresolveDynamicModelوprepareDynamicModelلأن المزوّد تمريري وقد يكشف عن معرّفات نماذج جديدة قبل تحديث فهرس OpenClaw الثابت؛ كما يستخدمcapabilitiesوwrapStreamFnوisCacheTtlEligibleلإبقاء ترويسات الطلب الخاصة بالمزوّد، وبيانات التوجيه الوصفية، وترقيعات الاستدلال، وسياسة ذاكرة المطالبات المؤقتة خارج النواة. وتأتي سياسة إعادة التشغيل الخاصة به من عائلة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 الأساسية لكنه يملك تطبيع النقل/عنوان الأساس، وسياسة رجوع تحديث OAuth، وخيار النقل الافتراضي، وصفوف فهرس Codex الاصطناعية، وتكامل نقطة نهاية استخدام ChatGPT؛ وهو يشارك عائلة البثopenai-responses-defaultsنفسها مع OpenAI المباشر. - يستخدم Google AI Studio وGemini CLI OAuth
resolveDynamicModel، وbuildReplayPolicy، وsanitizeReplayHistory، وresolveReasoningOutputMode، وwrapStreamFn، وisModernModelRefلأن عائلة إعادة التشغيلgoogle-geminiتملك الرجوع المستقبلي لـ Gemini 3.1، والتحقق الأصلي من إعادة تشغيل Gemini، وتنظيف إعادة التشغيل عند الإقلاع، ووضع خرج الاستدلال الموسوم، ومطابقة النماذج الحديثة، بينما تملك عائلة البثgoogle-thinkingتطبيع حمولة التفكير لـ Gemini؛ كما يستخدم Gemini CLI OAuth أيضًاformatApiKeyوresolveUsageAuthوfetchUsageSnapshotلتنسيق الرموز وتحليل الرموز وربط نقطة نهاية الحصة. - يستخدم Anthropic Vertex
buildReplayPolicyعبر عائلة إعادة التشغيلanthropic-by-modelبحيث يبقى تنظيف إعادة التشغيل الخاص بـ Claude محصورًا في معرّفات Claude بدلًا من كل نقلanthropic-messages. - تستخدم Amazon Bedrock
buildReplayPolicyوmatchesContextOverflowError، وclassifyFailoverReason، وresolveDefaultThinkingLevelلأنها تملك تصنيف أخطاء Bedrock الخاصة بتجاوز الحمل/عدم الجاهزية/تجاوز السياق لحركة Anthropic-on-Bedrock؛ ومع ذلك تظل سياسة إعادة التشغيل لديها مشتركة مع حاجزanthropic-by-modelالخاص بـ Claude فقط. - تستخدم OpenRouter وKilocode وOpencode وOpencode Go
buildReplayPolicyعبر عائلة إعادة التشغيلpassthrough-geminiلأنها توكّل نماذج Gemini عبر وسائل نقل متوافقة مع OpenAI وتحتاج إلى تنظيف thought-signature الخاص بـ Gemini من دون تحقق إعادة تشغيل Gemini الأصلي أو إعادة كتابة الإقلاع. - يستخدم MiniMax
buildReplayPolicyعبر عائلة إعادة التشغيلhybrid-anthropic-openaiلأن مزوّدًا واحدًا يملك دلالات رسائل Anthropic والدلالات المتوافقة مع OpenAI معًا؛ وهو يبقي إسقاط كتل التفكير الخاصة بـ Claude على جانب Anthropic فقط مع إعادة تجاوز وضع خرج الاستدلال إلى الوضع الأصلي، بينما تملك عائلة البثminimax-fast-modeإعادة كتابة نماذج fast-mode على مسار البث المشترك. - يستخدم Moonshot
catalogإضافةً إلىwrapStreamFnلأنه ما يزال يستخدم نقل OpenAI المشترك لكنه يحتاج إلى تطبيع حمولة التفكير المملوك للمزوّد؛ وتقوم عائلة البثmoonshot-thinkingبربط الإعدادات وحالة/thinkبحمولة التفكير الثنائية الأصلية الخاصة به. - يستخدم Kilocode
catalogوcapabilitiesوwrapStreamFnوisCacheTtlEligibleلأنه يحتاج إلى ترويسات طلب مملوكة للمزوّد، وتطبيع حمولة الاستدلال، وتلميحات نصوص Gemini المسجلة، وبوابة TTL لذاكرة Anthropic؛ وتُبقي عائلة البث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 الأصلي، وإعادة كتابة الأسماء البديلة لوضع Grok السريع، وtool_streamالافتراضي، وتنظيف الأدوات الصارمة / حمولة الاستدلال، وإعادة استخدام المصادقة الاحتياطية للأدوات المملوكة للإضافة، وحل نماذج 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، والرجوع، وتسليم الرد في النواة.
- استخدم مزوّدي الكلام لسلوك التوليف المملوك للمورّد.
- يُطبَّع الإدخال القديم
edgeالخاص بـ Microsoft إلى معرّف المزوّد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: مسار الطريق ضمن خادم HTTP الخاص بـ Gateway.auth: مطلوب. استخدم"gateway"لطلب مصادقة البوابة العادية، أو"plugin"للمصادقة التي تديرها الإضافة/للتحقق من webhook.match: اختياري."exact"(الافتراضي) أو"prefix".replaceExisting: اختياري. يسمح للإضافة نفسها باستبدال تسجيل مسار موجود خاص بها.handler: أعِدtrueعندما يكون المسار قد عالج الطلب.
- تمت إزالة
api.registerHttpHandler(...)وسيؤدي إلى خطأ عند تحميل الإضافة. استخدمapi.registerHttpRoute(...)بدلًا منه. - يجب أن تصرّح مسارات الإضافات عن
authصراحةً. - تُرفض تعارضات
path + matchالدقيقة ما لم يكنreplaceExisting: true، ولا يمكن لإضافة أن تستبدل مسارًا لإضافة أخرى. - تُرفض المسارات المتداخلة التي لها مستويات
authمختلفة. أبقِ سلاسل السقوطexact/prefixعلى مستوى المصادقة نفسه فقط. - لا تستقبل مسارات
auth: "plugin"نطاقات وقت تشغيل المشغل تلقائيًا. فهي مخصصة لـ webhook/التحقق من التوقيع الذي تديره الإضافة، لا لاستدعاءات مساعدات Gateway المميّزة. - تعمل مسارات
auth: "gateway"داخل نطاق وقت تشغيل طلب Gateway، لكن هذا النطاق محافظ عمدًا:- تبقي مصادقة حامل الرمز بالسر المشترك (
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
- تبقي مصادقة حامل الرمز بالسر المشترك (
- القاعدة العملية: لا تفترض أن مسار إضافة بمصادقة البوابة هو سطح إدارة ضمني. إذا احتاج مسارك إلى سلوك خاص بالمدير فقط، فاطلب وضع مصادقة حاملًا للهوية ووثّق عقد ترويسة
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من أجل ربط الإعداد/المصادقة/الرد/الويب هوك المشترك. ويُعد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-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، ومساعدات الإخفاء، ومساعدات علامات التوجيه، وأدوات النص الآمن. - ينبغي للفواصل الخاصة بالموافقات في القنوات أن تفضّل عقد
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، ومساعدات الترويسات التجريبية، وتحليل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في الشيفرة الجديدة. - فضّل أولًا البدائيات المستقرة الضيقة. فالمسارات الفرعية الأحدث للإعداد/الربط/الرد/
الملاحظات/العقد/الوارد/الترابط/الأوامر/المدخلات السرية/الويب هوك/البنية/
قائمة السماح/الحالة/أداة الرسائل هي العقد المقصودة للعمل الجديد
في الإضافات المضمّنة والخارجية.
ويجب أن يكون تحليل/مطابقة الأهداف على
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.
استخدم هذا عندما تحتاج القناة إلى أقران/مجموعات معتمدة على الإعدادات مثل:
- أقران الرسائل المباشرة المعتمدين على قائمة السماح
- خرائط القنوات/المجموعات المهيأة
- بدائل دليل ثابتة على مستوى الحساب
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، يستخدم OpenClawcatalog
فحص القنوات للقراءة فقط
إذا كانت إضافتك تسجل قناة، ففضّل تنفيذ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.json مع openclaw.extensions:
name/<fileBase>.
إذا كانت إضافتك تستورد تبعيات npm، فثبّتها في ذلك الدليل حتى
يتوفر node_modules (npm install / pnpm install).
حاجز أمني: يجب أن يبقى كل مدخل في openclaw.extensions داخل دليل الإضافة
بعد حل الروابط الرمزية. وتُرفض المداخل التي تخرج من دليل الحزمة.
ملاحظة أمنية: يثبّت openclaw plugins install تبعيات الإضافة باستخدام
npm install --omit=dev --ignore-scripts (من دون نصوص دورة حياة، ومن دون تبعيات تطوير وقت التشغيل). أبقِ أشجار تبعيات الإضافات
“JavaScript/TypeScript خالصة” وتجنب الحزم التي تتطلب بناء 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 لقرارات التنسيق الخارجيshowConfigured: إخفاء القناة من أسطح سرد القنوات المهيأة عند ضبطها علىfalsequickstartAllowFrom: إدخال القناة في تدفق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()
منفذًا وفوّضه صراحةً:
إضافة قدرة جديدة
عندما تحتاج إضافة إلى سلوك لا يناسب الواجهة الحالية، لا تتجاوز نظام الإضافات بوصول خاص. بل أضف القدرة المفقودة. التسلسل الموصى به:- تعريف العقد الأساسي حدّد السلوك المشترك الذي ينبغي أن تملكه النواة: السياسة، والرجوع، ودمج الإعدادات، ودورة الحياة، والدلالات المواجهة للقناة، وشكل مساعد وقت التشغيل.
- إضافة أسطح تسجيل/وقت تشغيل للإضافات مكتوبة النوع
وسّع
OpenClawPluginApiو/أوapi.runtimeبأصغر سطح قدرة مكتوب النوع ومفيد. - ربط المستهلكين في النواة + القنوات/الميزات يجب أن تستهلك القنوات وإضافات الميزات القدرة الجديدة من خلال النواة، لا عبر استيراد تنفيذ مورّد مباشرةً.
- تسجيل تنفيذات المورّدين ثم تسجل إضافات المورّدين واجهاتها الخلفية مقابل القدرة.
- إضافة تغطية للعقود أضف اختبارات حتى تبقى الملكية وشكل التسجيل صريحين مع مرور الوقت.
قائمة تحقق القدرة
عند إضافة قدرة جديدة، يجب أن يلمس التنفيذ عادةً هذه الأسطح معًا:- أنواع العقود الأساسية في
src/<capability>/types.ts - مساعد التشغيل/وقت التشغيل الأساسي في
src/<capability>/runtime.ts - سطح تسجيل واجهة الإضافة في
src/plugins/types.ts - ربط سجل الإضافات في
src/plugins/registry.ts - كشف وقت تشغيل الإضافة في
src/plugins/runtime/*عندما تحتاج إضافات الميزات/القنوات إلى استهلاكه - مساعدات الالتقاط/الاختبار في
src/test-utils/plugin-registration.ts - تأكيدات الملكية/العقود في
src/plugins/contracts/registry.ts - وثائق المشغل/الإضافة في
docs/
قالب القدرة
النمط الأدنى:- تملك النواة عقد القدرة + التنسيق
- تملك إضافات المورّدين تنفيذات المورّد
- تستهلك إضافات الميزات/القنوات مساعدات وقت التشغيل
- وتُبقي اختبارات العقود الملكية صريحة