بالنسبة إلى نموذج القدرات العام، وأشكال Plugins، وعقود الملكية/التنفيذ، راجع بنية Plugin. هذه الصفحة هي المرجع للآليات الداخلية: مسار التحميل، والسجل، وخطافات وقت التشغيل، ومسارات HTTP الخاصة بـ Gateway، ومسارات الاستيراد، وجداول المخططات.Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
مسار التحميل
عند بدء التشغيل، ينفذ OpenClaw تقريبًا ما يلي:- يكتشف جذور Plugins المرشحة
- يقرأ بيانات manifests الأصلية أو حزم التوافق وبيانات تعريف الحزمة
- يرفض المرشحين غير الآمنين
- يطبّع إعدادات Plugin (
plugins.enabled، وallow، وdeny، وentries، وslots، وload.paths) - يقرر التفعيل لكل مرشح
- يحمّل الوحدات الأصلية المفعّلة: تستخدم الوحدات المضمنة المبنية محمّلًا أصليًا؛ وتستخدم TypeScript المصدر المحلي التابع لطرف ثالث مسار Jiti الاحتياطي الطارئ
- يستدعي خطافات
register(api)الأصلية ويجمع التسجيلات في سجل Plugins - يعرّض السجل للأوامر وأسطح وقت التشغيل
activate اسم مستعار قديم لـ register — يحلّ المحمّل أيهما موجود (def.register ?? def.activate) ويستدعيه في النقطة نفسها. تستخدم كل Plugins المضمنة register؛ فضّل register عند إنشاء Plugins جديدة.سلوك manifest أولًا
يمثل manifest مصدر الحقيقة لمستوى التحكم. يستخدمه OpenClaw من أجل:- تحديد Plugin
- اكتشاف القنوات/Skills/مخطط الإعدادات المعلنة أو قدرات الحزمة
- التحقق من
plugins.entries.<id>.config - إثراء تسميات/عناصر نائبة في واجهة التحكم
- إظهار بيانات تعريف التثبيت/الفهرس
- الحفاظ على واصفات التفعيل والإعداد منخفضة الكلفة دون تحميل وقت تشغيل Plugin
activation وsetup على مستوى التحكم.
إنها واصفات بيانات تعريف فقط لتخطيط التفعيل واكتشاف الإعداد؛
ولا تستبدل تسجيل وقت التشغيل، أو register(...)، أو setupEntry.
يستخدم أوائل مستهلكي التفعيل الحي الآن تلميحات الأوامر والقنوات والمزوّدين من manifest
لتضييق تحميل Plugins قبل تجسيد السجل الأوسع:
- يضيّق تحميل CLI النطاق إلى Plugins التي تملك الأمر الأساسي المطلوب
- يضيّق إعداد القناة/حل Plugin النطاق إلى Plugins التي تملك معرّف القناة المطلوب
- يضيّق إعداد/حل وقت تشغيل المزوّد الصريح النطاق إلى Plugins التي تملك معرّف المزوّد المطلوب
- يستخدم تخطيط بدء تشغيل Gateway
activation.onStartupللاستيرادات الصريحة عند بدء التشغيل وإلغاء الاشتراك في بدء التشغيل؛ ولا تُحمّل Plugins التي لا تحتوي على بيانات تعريف بدء تشغيل إلا عبر محفزات تفعيل أضيق
all تستنتج
مجموعة معرّفات Plugins فعالة وصريحة من الإعدادات، وتخطيط بدء التشغيل، والقنوات
المعدّة، والفتحات، وقواعد التفعيل التلقائي. إذا كانت تلك المجموعة المستنتجة فارغة، فإن OpenClaw
يحمّل سجل وقت تشغيل فارغًا بدلًا من التوسيع إلى كل Plugin
قابل للاكتشاف.
يعرض مخطط التفعيل كلًا من API للمعرّفات فقط للمتصلين الحاليين وAPI
للخطة للتشخيصات الجديدة. تبلّغ إدخالات الخطة عن سبب اختيار Plugin،
مع فصل تلميحات المخطط الصريحة activation.* عن الرجوع إلى ملكية manifest
مثل providers، وchannels، وcommandAliases، وsetup.providers،
وcontracts.tools، والخطافات. هذا الفصل في الأسباب هو حد التوافق:
تستمر بيانات تعريف Plugin الحالية في العمل، بينما يمكن للكود الجديد اكتشاف التلميحات الواسعة
أو سلوك الرجوع دون تغيير دلالات تحميل وقت التشغيل.
يفضل اكتشاف الإعداد الآن المعرّفات المملوكة للواصف مثل setup.providers و
setup.cliBackends لتضييق Plugins المرشحة قبل الرجوع إلى
setup-api بالنسبة إلى Plugins التي لا تزال تحتاج إلى خطافات وقت التشغيل وقت الإعداد. تستخدم
قوائم إعداد المزوّد manifest providerAuthChoices، وخيارات الإعداد المشتقة من الواصف،
وبيانات تعريف فهرس التثبيت دون تحميل وقت تشغيل المزوّد. يُعد
setup.requiresRuntime: false الصريح حدًا فاصلًا للواصف فقط؛ أما حذف
requiresRuntime فيُبقي الرجوع القديم إلى setup-api للتوافق. إذا ادعى أكثر
من Plugin مكتشف واحد ملكية معرّف مزوّد إعداد أو خلفية CLI مُطبّع نفسه،
يرفض بحث الإعداد المالك الغامض بدلًا من الاعتماد على
ترتيب الاكتشاف. عندما يُنفذ وقت تشغيل الإعداد، تبلغ تشخيصات السجل
عن الانحراف بين setup.providers / setup.cliBackends والمزوّدين أو خلفيات CLI
المسجلة بواسطة setup-api دون حظر Plugins القديمة.
حد ذاكرة Plugin المؤقتة
لا يخزن OpenClaw نتائج اكتشاف Plugins أو بيانات سجل manifest المباشرة خلف نوافذ زمنية مرتبطة بالساعة. يجب أن تصبح عمليات التثبيت، وتعديلات manifest، وتغييرات مسارات التحميل مرئية في القراءة الصريحة التالية لبيانات التعريف أو عند إعادة بناء اللقطة. قد يحتفظ محلل ملف manifest بذاكرة مؤقتة محدودة لتوقيع الملف، مقيّدة بمسار manifest المفتوح، وinode، والحجم، والطوابع الزمنية؛ هذه الذاكرة المؤقتة لا تتجنب إلا إعادة تحليل البايتات غير المتغيرة، ويجب ألا تخزن إجابات الاكتشاف أو السجل أو المالك أو السياسة. المسار السريع الآمن لبيانات التعريف هو ملكية كائنات صريحة، لا ذاكرة مؤقتة مخفية. يجب أن تمرر مسارات بدء تشغيل Gateway الساخنةPluginMetadataSnapshot الحالي،
أو PluginLookUpTable المشتق، أو سجل manifest صريحًا عبر سلسلة الاستدعاءات.
يمكن للتحقق من الإعدادات، والتفعيل التلقائي عند بدء التشغيل، وتهيئة Plugin، واختيار المزوّد
إعادة استخدام تلك الكائنات ما دامت تمثل الإعدادات الحالية ومخزون
Plugins. لا يزال بحث الإعداد يعيد بناء بيانات تعريف manifest عند الطلب
ما لم يتلق مسار الإعداد المحدد سجل manifest صريحًا؛ أبق ذلك
كخيار رجوع لمسار بارد بدلًا من إضافة ذاكرات مؤقتة مخفية للبحث. عند تغيّر الإدخال،
أعد بناء اللقطة واستبدلها بدلًا من تعديلها أو الاحتفاظ
بنسخ تاريخية.
يجب إعادة حساب العروض فوق سجل Plugins النشط ومساعدات تهيئة القنوات المضمنة
من السجل/الجذر الحالي. لا بأس بالخرائط قصيرة العمر
داخل استدعاء واحد لإزالة تكرار العمل أو حماية إعادة الدخول؛ ويجب ألا تصبح ذاكرات مؤقتة
لبيانات تعريف العملية.
بالنسبة إلى تحميل Plugins، تكون طبقة الذاكرة المؤقتة الدائمة هي تحميل وقت التشغيل. قد تعيد استخدام
حالة المحمّل عند تحميل الكود أو المشغولات المثبتة فعليًا، مثل:
PluginLoaderCacheStateوسجلات وقت التشغيل النشطة المتوافقة- ذاكرات jiti/module المؤقتة وذاكرات محمّل السطح العام المستخدمة لتجنب استيراد سطح وقت التشغيل نفسه مرارًا
- ذاكرات نظام الملفات المؤقتة لمشغولات Plugin المثبتة
- خرائط قصيرة العمر لكل استدعاء لتطبيع المسارات أو حل التكرارات
- نتائج الاكتشاف
- سجلات manifest المباشرة
- سجلات manifest المعاد بناؤها من فهرس Plugins المثبت
- بحث مالك المزوّد، أو إخماد النموذج، أو سياسة المزوّد، أو بيانات تعريف المشغولات العامة
- أي إجابة أخرى مشتقة من manifest حيث يجب أن يكون manifest أو الفهرس المثبت أو مسار التحميل المتغير مرئيًا عند القراءة التالية لبيانات التعريف
نموذج السجل
لا تعدّل Plugins المحمّلة متغيرات عامة عشوائية في القلب مباشرة. إنها تسجل في سجل Plugins مركزي. يتتبع السجل:- سجلات Plugins (الهوية، والمصدر، والمنشأ، والحالة، والتشخيصات)
- الأدوات
- الخطافات القديمة والخطافات المكتوبة
- القنوات
- المزوّدين
- معالجات Gateway RPC
- مسارات HTTP
- مسجلات CLI
- خدمات الخلفية
- الأوامر المملوكة لـ Plugin
- وحدة Plugin -> تسجيل السجل
- وقت تشغيل القلب -> استهلاك السجل
استدعاءات ربط المحادثة
يمكن لـ Plugins التي تربط محادثة أن تتفاعل عند حل موافقة. استخدمapi.onConversationBindingResolved(...) لتلقي استدعاء بعد الموافقة على طلب الربط
أو رفضه:
status:"approved"أو"denied"decision:"allow-once"، أو"allow-always"، أو"deny"binding: الربط المحلول للطلبات الموافق عليهاrequest: ملخص الطلب الأصلي، وتلميح الفصل، ومعرّف المرسل، وبيانات تعريف المحادثة
خطافات وقت تشغيل المزوّد
تحتوي Plugins الخاصة بالمزوّد على ثلاث طبقات:- بيانات تعريف manifest للبحث منخفض الكلفة قبل وقت التشغيل:
setup.providers[].envVars، وتوافقproviderAuthEnvVarsالمهمل، وproviderAuthAliases، وproviderAuthChoices، وchannelEnvVars. - خطافات وقت الإعدادات:
catalog(القديمdiscovery) بالإضافة إلىapplyConfigDefaults. - خطافات وقت التشغيل: أكثر من 40 خطافًا اختياريًا تغطي المصادقة، وحل النماذج، وتغليف التدفق، ومستويات التفكير، وسياسة الإعادة، ونقاط نهاية الاستخدام. راجع القائمة الكاملة ضمن ترتيب الخطافات واستخدامها.
setup.providers[].envVars عندما يكون لدى المزوّد بيانات اعتماد قائمة على env
يجب أن تراها مسارات المصادقة/الحالة/منتقي النماذج العامة دون
تحميل وقت تشغيل Plugin. لا يزال providerAuthEnvVars المهمل يُقرأ بواسطة
محول التوافق خلال نافذة الإهمال، وتتلقى Plugins غير المضمنة
التي تستخدمه تشخيص manifest. استخدم manifest providerAuthAliases
عندما يجب أن يعيد معرّف مزوّد واحد استخدام env vars، وملفات المصادقة،
والمصادقة المدعومة بالإعدادات، وخيار تهيئة مفتاح API الخاصة بمعرّف مزوّد آخر. استخدم manifest
providerAuthChoices عندما يجب أن تعرف أسطح CLI الخاصة بالتهيئة/اختيار المصادقة
معرّف اختيار المزوّد، وتسميات المجموعات، وتوصيل مصادقة بسيط بعلم واحد دون
تحميل وقت تشغيل المزوّد. أبقِ وقت تشغيل المزوّد
envVars للتلميحات الموجهة للمشغل مثل تسميات التهيئة أو متغيرات إعداد OAuth
client-id/client-secret.
استخدم manifest channelEnvVars عندما تحتوي قناة على مصادقة أو إعداد قائم على env
يجب أن تراه مسارات الرجوع إلى shell-env العامة، أو فحوص الإعدادات/الحالة، أو مطالبات الإعداد
دون تحميل وقت تشغيل القناة.
ترتيب الخطافات واستخدامها
بالنسبة إلى Plugins الخاصة بالنموذج/المزوّد، يستدعي OpenClaw الخطافات بهذا الترتيب التقريبي. عمود “متى تستخدم” هو دليل القرار السريع. حقول المزوّد الخاصة بالتوافق فقط التي لم يعد OpenClaw يستدعيها، مثلProviderPlugin.capabilities وsuppressBuiltInModel، غير مدرجة هنا عمدًا.
| # | الخطاف | ما الذي يفعله | متى يُستخدم |
|---|---|---|---|
| 1 | catalog | نشر إعدادات الموفّر في models.providers أثناء توليد models.json | عندما يملك الموفّر كتالوجًا أو قيَمًا افتراضية لعنوان URL الأساسي |
| 2 | applyConfigDefaults | تطبيق القيَم الافتراضية العامة للإعدادات التي يملكها الموفّر أثناء تجسيد الإعدادات | عندما تعتمد القيَم الافتراضية على نمط المصادقة أو البيئة أو دلالات عائلة نماذج الموفّر |
| — | (البحث المدمج عن النماذج) | يحاول OpenClaw مسار السجل/الكتالوج العادي أولًا | (ليس خطاف Plugin) |
| 3 | normalizeModelId | تطبيع الأسماء المستعارة القديمة أو التجريبية لمعرّفات النماذج قبل البحث | عندما يملك الموفّر تنظيف الأسماء المستعارة قبل حلّ النموذج القانوني |
| 4 | normalizeTransport | تطبيع api / baseUrl لعائلة الموفّر قبل تجميع النموذج العام | عندما يملك الموفّر تنظيف النقل لمعرّفات الموفّرين المخصصة ضمن عائلة النقل نفسها |
| 5 | normalizeConfig | تطبيع models.providers.<id> قبل حلّ وقت التشغيل/الموفّر | عندما يحتاج الموفّر إلى تنظيف إعدادات يجب أن يبقى مع Plugin؛ وتعمل مساعدات عائلة Google المضمّنة أيضًا كدعم احتياطي لإدخالات إعدادات Google المدعومة |
| 6 | applyNativeStreamingUsageCompat | تطبيق عمليات إعادة كتابة توافق استخدام البث الأصلي على موفّري الإعدادات | عندما يحتاج الموفّر إلى إصلاحات لبيانات استخدام البث الأصلي الوصفية المدفوعة بنقطة النهاية |
| 7 | resolveConfigApiKey | حلّ مصادقة علامة البيئة لموفّري الإعدادات قبل تحميل مصادقة وقت التشغيل | عندما يملك الموفّر حلًّا لمفتاح واجهة برمجة التطبيقات بعلامة بيئة مملوكًا له؛ ويملك amazon-bedrock أيضًا محللًا مدمجًا لعلامات بيئة AWS هنا |
| 8 | resolveSyntheticAuth | إظهار مصادقة محلية/مستضافة ذاتيًا أو مدعومة بالإعدادات دون حفظ النص الصريح | عندما يستطيع الموفّر العمل بعلامة اعتماد اصطناعية/محلية |
| 9 | resolveExternalAuthProfiles | تركيب ملفات تعريف المصادقة الخارجية التي يملكها الموفّر؛ تكون القيمة الافتراضية لـ persistence هي runtime-only لبيانات الاعتماد المملوكة لـ CLI/التطبيق | عندما يعيد الموفّر استخدام بيانات اعتماد مصادقة خارجية دون حفظ رموز التحديث المنسوخة؛ أعلن contracts.externalAuthProviders في البيان |
| 10 | shouldDeferSyntheticProfileAuth | خفض أولوية عناصر نائب ملفات التعريف الاصطناعية المخزنة خلف مصادقة مدعومة بالبيئة/الإعدادات | عندما يخزن الموفّر ملفات تعريف نائبة اصطناعية لا ينبغي أن تفوز بالأسبقية |
| 11 | resolveDynamicModel | احتياطي متزامن لمعرّفات النماذج التي يملكها الموفّر وغير الموجودة بعد في السجل المحلي | عندما يقبل الموفّر معرّفات نماذج عشوائية من المنبع |
| 12 | prepareDynamicModel | تهيئة غير متزامنة، ثم يعمل resolveDynamicModel مرة أخرى | عندما يحتاج الموفّر إلى بيانات وصفية من الشبكة قبل حلّ المعرّفات غير المعروفة |
| 13 | normalizeResolvedModel | إعادة الكتابة النهائية قبل أن يستخدم المشغّل المضمّن النموذج المحلول | عندما يحتاج الموفّر إلى عمليات إعادة كتابة للنقل لكنه ما زال يستخدم نقلًا أساسيًا |
| 14 | contributeResolvedModelCompat | المساهمة بأعلام التوافق لنماذج المورّد خلف نقل آخر متوافق | عندما يتعرّف الموفّر على نماذجه الخاصة على نقلات وكيلة دون السيطرة على الموفّر |
| 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 | تصنيف سبب تجاوز الفشل المملوك للموفّر | عندما يستطيع الموفّر تعيين أخطاء واجهة برمجة التطبيقات/النقل الخام إلى حد المعدل/الحمل الزائد/إلخ |
| 28 | isCacheTtlEligible | سياسة ذاكرة التخزين المؤقت للمطالبة لموفّري الوكيل/النقل الخلفي | عندما يحتاج الموفّر إلى تقييد TTL للتخزين المؤقت خاص بالوكيل |
| 29 | buildMissingAuthMessage | بديل لرسالة الاسترداد العامة عند غياب المصادقة | عندما يحتاج الموفّر إلى تلميح استرداد خاص به عند غياب المصادقة |
| 30 | augmentModelCatalog | صفوف كتالوج اصطناعية/نهائية تُلحق بعد الاكتشاف | عندما يحتاج الموفّر إلى صفوف توافق أمامي اصطناعية في models list وأدوات الاختيار |
| 31 | resolveThinkingProfile | مجموعة مستويات /think خاصة بالنموذج، وتسميات العرض، والقيمة الافتراضية | عندما يعرّض الموفّر سلّم تفكير مخصصًا أو تسمية ثنائية لنماذج محددة |
| 32 | isBinaryThinking | خطاف توافق تبديل الاستدلال تشغيل/إيقاف | عندما يعرّض الموفّر التفكير الثنائي فقط تشغيل/إيقاف |
| 33 | supportsXHighThinking | خطاف توافق دعم الاستدلال xhigh | عندما يريد الموفّر xhigh على مجموعة فرعية فقط من النماذج |
| 34 | resolveDefaultThinkingLevel | خطاف توافق مستوى /think الافتراضي | عندما يملك الموفّر سياسة /think الافتراضية لعائلة نماذج |
| 35 | isModernModelRef | مطابق النماذج الحديثة لمرشحات الملفات التعريفية الحية واختيار اختبارات الدخان | عندما يملك الموفّر مطابقة النماذج المفضلة للاختبار الحي/اختبار الدخان |
| 36 | prepareRuntimeAuth | تحويل اعتماد مضبوط إلى رمز/مفتاح وقت التشغيل الفعلي قبل الاستدلال مباشرة | عندما يحتاج الموفّر إلى تبادل رمز أو اعتماد طلب قصير العمر |
| 37 | resolveUsageAuth | حل بيانات اعتماد الاستخدام/الفوترة لـ /usage والأسطح ذات الصلة بالحالة | يحتاج المزوّد إلى تحليل مخصص لرمز الاستخدام/الحصة أو بيانات اعتماد استخدام مختلفة |
| 38 | fetchUsageSnapshot | جلب لقطات الاستخدام/الحصة الخاصة بالمزوّد وتطبيعها بعد حل المصادقة | يحتاج المزوّد إلى نقطة نهاية استخدام خاصة بالمزوّد أو محلل حمولة |
| 39 | createEmbeddingProvider | بناء محوّل تضمين مملوك للمزوّد للذاكرة/البحث | سلوك تضمين الذاكرة يتبع Plugin المزوّد |
| 40 | buildReplayPolicy | إرجاع سياسة إعادة تشغيل تتحكم في التعامل مع النص المنسوخ للمزوّد | يحتاج المزوّد إلى سياسة نص منسوخ مخصصة (على سبيل المثال، إزالة كتل التفكير) |
| 41 | sanitizeReplayHistory | إعادة كتابة سجل إعادة التشغيل بعد تنظيف النص المنسوخ العام | يحتاج المزوّد إلى عمليات إعادة كتابة لإعادة التشغيل خاصة بالمزوّد تتجاوز مساعدات Compaction المشتركة |
| 42 | validateReplayTurns | التحقق النهائي من دور إعادة التشغيل أو إعادة تشكيله قبل المشغّل المضمّن | يحتاج نقل المزوّد إلى تحقق أكثر صرامة من الأدوار بعد التنظيف العام |
| 43 | onModelSelected | تشغيل الآثار الجانبية اللاحقة للاختيار والمملوكة للمزوّد | يحتاج المزوّد إلى قياس عن بُعد أو حالة مملوكة للمزوّد عندما يصبح نموذج ما نشطًا |
normalizeModelId وnormalizeTransport وnormalizeConfig تتحقق أولاً من
Plugin المزوّد المطابق، ثم تمر عبر Plugins المزوّدين الآخرين القادرين على
الخطافات إلى أن يغيّر أحدهم فعلياً معرّف النموذج أو النقل/الإعداد. يحافظ ذلك على
عمل طبقات المواءمة/الأسماء المستعارة للمزوّدين دون أن يتطلب من المستدعي معرفة أي
Plugin مضمن يملك إعادة الكتابة. إذا لم يُعد أي خطاف مزوّد كتابة إدخال إعداد
مدعوم من عائلة Google، فسيظل مطبّع إعداد Google المضمّن يطبّق تنظيف التوافق ذلك.
إذا كان المزوّد يحتاج إلى بروتوكول سلكي مخصص بالكامل أو منفّذ طلبات مخصص، فذلك
صنف مختلف من الامتدادات. هذه الخطافات مخصصة لسلوك المزوّد الذي لا يزال يعمل على
حلقة الاستدلال العادية في OpenClaw.
مثال على مزوّد
أمثلة مضمّنة
تجمع Plugins المزوّدين المضمّنة الخطافات أعلاه لتناسب احتياجات كل مورّد في الفهرس، والمصادقة، والتفكير، وإعادة التشغيل، والاستخدام. تعيش مجموعة الخطافات المعتمدة مع كل Plugin تحتextensions/؛ توضّح هذه الصفحة الأشكال بدلاً من
محاكاة القائمة.
Pass-through catalog providers
Pass-through catalog providers
يسجّل OpenRouter وKilocode وZ.AI وxAI
catalog بالإضافة إلى
resolveDynamicModel / prepareDynamicModel حتى يتمكنوا من إظهار معرّفات
النماذج القادمة من المنبع قبل فهرس OpenClaw الثابت.OAuth and usage endpoint providers
OAuth and usage endpoint providers
يقرن GitHub Copilot وGemini CLI وChatGPT Codex وMiniMax وXiaomi وz.ai
prepareRuntimeAuth أو formatApiKey مع resolveUsageAuth +
fetchUsageSnapshot لامتلاك تبادل الرموز والتكامل مع /usage.Replay and transcript cleanup families
Replay and transcript cleanup families
تتيح العائلات المشتركة المسماة (
google-gemini وpassthrough-gemini
وanthropic-by-model وhybrid-anthropic-openai) للمزوّدين الاشتراك في
سياسة النص عبر buildReplayPolicy بدلاً من أن يعيد كل Plugin تنفيذ التنظيف.Catalog-only providers
Catalog-only providers
تسجّل
byteplus وcloudflare-ai-gateway وhuggingface وkimi-coding
وnvidia وqianfan وsynthetic وtogether وvenice
وvercel-ai-gateway وvolcengine فقط catalog وتستخدم حلقة الاستدلال
المشتركة.Anthropic-specific stream helpers
Anthropic-specific stream helpers
تعيش ترويسات Beta، و
/fast / serviceTier، وcontext1m داخل سطح
api.ts / contract-api.ts العام في Plugin Anthropic
(wrapAnthropicProviderStream وresolveAnthropicBetas
وresolveAnthropicFastMode وresolveAnthropicServiceTier) بدلاً من SDK
العام.مساعدات وقت التشغيل
يمكن لـ Plugins الوصول إلى مساعدات أساسية محددة عبرapi.runtime. بالنسبة إلى TTS:
- يعيد
textToSpeechحمولة خرج TTS الأساسية العادية لأسطح الملفات/الملاحظات الصوتية. - يستخدم إعداد
messages.ttsالأساسي واختيار المزوّد. - يعيد مخزن صوت PCM المؤقت + معدل العينة. يجب على Plugins إعادة أخذ العينات/الترميز للمزوّدين.
listVoicesاختياري لكل مزوّد. استخدمه لمنتقيات الصوت أو تدفقات الإعداد المملوكة للمورّد.- يمكن أن تتضمن قوائم الأصوات بيانات وصفية أغنى مثل اللغة المحلية، والنوع، ووسوم الشخصية للمنتقيات الواعية بالمزوّد.
- يدعم OpenAI وElevenLabs الاتصالات الهاتفية اليوم. ولا يدعمها Microsoft.
api.registerSpeechProvider(...).
- أبقِ سياسة TTS، والرجوع الاحتياطي، وتسليم الرد في النواة.
- استخدم مزوّدي الكلام لسلوك التركيب المملوك للمورّد.
- يتم تطبيع إدخال Microsoft القديم
edgeإلى معرّف المزوّدmicrosoft. - نموذج الملكية المفضل موجّه للشركات: يمكن لـ Plugin مورّد واحد أن يملك مزوّدي النص، والكلام، والصورة، والوسائط المستقبلية مع إضافة OpenClaw لعقود القدرات تلك.
- أبقِ التنسيق، والرجوع الاحتياطي، والإعداد، وربط القنوات في النواة.
- أبقِ سلوك المورّد في Plugin المزوّد.
- يجب أن يبقى التوسع الإضافي ذا أنواع محددة: طرائق اختيارية جديدة، وحقول نتائج اختيارية جديدة، وقدرات اختيارية جديدة.
- يتبع توليد الفيديو بالفعل النمط نفسه:
- تملك النواة عقد القدرة ومساعد وقت التشغيل
- تسجّل Plugins المورّدين
api.registerVideoGenerationProvider(...) - تستهلك Plugins الميزات/القنوات
api.runtime.videoGeneration.*
api.runtime.mediaUnderstanding.*هو السطح المشترك المفضل لفهم الصور/الصوت/الفيديو.extractStructuredWithModel(...)هو السطح المواجه لـ Plugin للاستخراج المحدود المملوك للمزوّد والذي يبدأ بالصورة. ضمّن إدخال صورة واحداً على الأقل؛ إدخالات النص سياق تكميلي. تملك Plugins المنتجات مساراتها ومخططاتها بينما يملك OpenClaw حد المزوّد/وقت التشغيل.- يستخدم إعداد صوت فهم الوسائط الأساسي (
tools.media.audio) وترتيب رجوع المزوّد. - يعيد
{ text: undefined }عندما لا يُنتج أي خرج نسخ (مثلاً إدخال متجاوز/غير مدعوم). - يبقى
api.runtime.stt.transcribeAudioFile(...)اسماً مستعاراً للتوافق.
api.runtime.subagent:
providerوmodelتجاوزات اختيارية لكل تشغيل، وليسا تغييرات جلسة مستمرة.- لا يلتزم OpenClaw بهذه الحقول المتجاوزة إلا للمتصلين الموثوقين.
- بالنسبة إلى عمليات الرجوع الاحتياطي المملوكة لـ Plugin، يجب أن يختار المشغّلون ذلك عبر
plugins.entries.<id>.subagent.allowModelOverride: true. - استخدم
plugins.entries.<id>.subagent.allowedModelsلتقييد Plugins الموثوقة على أهدافprovider/modelأساسية محددة، أو"*"للسماح صراحة بأي هدف. - لا تزال عمليات subagent الخاصة بـ Plugins غير الموثوقة تعمل، لكن تُرفض طلبات التجاوز بدلاً من الرجوع بصمت.
- تُوسم جلسات subagent التي تنشئها Plugins بمعرّف Plugin المنشئ. قد يحذف الرجوع الاحتياطي
api.runtime.subagent.deleteSession(...)تلك الجلسات المملوكة فقط؛ لا يزال حذف الجلسات الاعتباطي يتطلب طلب Gateway بنطاق إداري.
api.registerWebSearchProvider(...).
ملاحظات:
- أبقِ اختيار المزوّد، وحل بيانات الاعتماد، ودلالات الطلب المشتركة في النواة.
- استخدم مزوّدي بحث الويب لوسائل نقل البحث الخاصة بالمورّدين.
api.runtime.webSearch.*هو السطح المشترك المفضل لـ Plugins الميزات/القنوات التي تحتاج إلى سلوك بحث دون الاعتماد على غلاف أداة الوكيل.
api.runtime.imageGeneration
generate(...): ولّد صورة باستخدام سلسلة مزوّدي توليد الصور المضبوطة.listProviders(...): اسرد مزوّدي توليد الصور المتاحين وقدراتهم.
مسارات HTTP في Gateway
يمكن لـ Plugins كشف نقاط نهاية HTTP باستخدامapi.registerHttpRoute(...).
path: مسار التوجيه تحت خادم HTTP الخاص بالبوابة.auth: مطلوب. استخدم"gateway"لطلب مصادقة Gateway العادية، أو"plugin"للمصادقة/التحقق من Webhook المُدارَين بواسطة Plugin.match: اختياري."exact"(الافتراضي) أو"prefix".replaceExisting: اختياري. يسمح لنفس Plugin باستبدال تسجيل مساره الحالي.handler: أعدtrueعندما يكون المسار قد عالج الطلب.
- تمت إزالة
api.registerHttpHandler(...)وسيؤدي ذلك إلى خطأ في تحميل Plugin. استخدمapi.registerHttpRoute(...)بدلا منه. - يجب أن تعلن مسارات Plugin عن
authصراحة. - تُرفض تعارضات
path + matchالدقيقة ما لم يكنreplaceExisting: true، ولا يمكن لـ Plugin واحد استبدال مسار Plugin آخر. - تُرفض المسارات المتداخلة ذات مستويات
authالمختلفة. أبقِ سلاسل التمرير الاحتياطيexact/prefixعلى مستوى المصادقة نفسه فقط. - مسارات
auth: "plugin"لا تتلقى نطاقات وقت تشغيل المشغل تلقائيا. فهي مخصصة لـ webhooks/التحقق من التوقيع التي يديرها Plugin، وليست لاستدعاءات مساعد Gateway ذات الامتيازات. - تعمل مسارات
auth: "gateway"داخل نطاق وقت تشغيل طلب Gateway، لكن هذا النطاق محافظ عن قصد:- مصادقة الحامل بالسر المشترك (
gateway.auth.mode = "token"/"password") تُبقي نطاقات وقت تشغيل مسار Plugin مثبتة علىoperator.write، حتى إذا أرسل المستدعيx-openclaw-scopes - أوضاع HTTP الموثوقة الحاملة للهوية (مثل
trusted-proxyأوgateway.auth.mode = "none"على مدخل خاص) تراعيx-openclaw-scopesفقط عندما يكون الرأس موجودا صراحة - إذا كان
x-openclaw-scopesغائبا في طلبات مسار Plugin الحاملة للهوية هذه، يعود نطاق وقت التشغيل إلىoperator.write
- مصادقة الحامل بالسر المشترك (
- قاعدة عملية: لا تفترض أن مسار Plugin بمصادقة Gateway هو سطح إدارة ضمني. إذا كان مسارك يحتاج إلى سلوك مخصص للإدارة فقط، فاشترط وضع مصادقة حامل للهوية ووثق عقد رأس
x-openclaw-scopesالصريح.
مسارات استيراد Plugin SDK
استخدم مسارات SDK الفرعية الضيقة بدلا من جذرopenclaw/plugin-sdk الأحادي
barrel عند تأليف Plugins جديدة. المسارات الفرعية الأساسية:
| المسار الفرعي | الغرض |
|---|---|
openclaw/plugin-sdk/plugin-entry | بدائيات تسجيل Plugin |
openclaw/plugin-sdk/channel-core | مساعدات إدخال/بناء القناة |
openclaw/plugin-sdk/core | مساعدات مشتركة عامة وعقد شامل |
openclaw/plugin-sdk/config-schema | مخطط Zod لجذر openclaw.json (OpenClawSchema) |
channel-setup,
setup-runtime, setup-tools, channel-pairing,
channel-contract, channel-feedback, channel-inbound, channel-lifecycle,
channel-reply-pipeline, command-auth, secret-input, webhook-ingress,
channel-targets, وchannel-actions. يجب توحيد سلوك الموافقة
على عقد approvalCapability واحد بدلا من الخلط بين حقول Plugin غير مرتبطة.
راجع Plugins القنوات.
تعيش مساعدات وقت التشغيل والإعدادات ضمن مسارات فرعية مركزة مطابقة *-runtime
(approval-runtime, agent-runtime, lazy-runtime, directory-runtime,
text-runtime, runtime-store, system-event-runtime, heartbeat-runtime,
channel-activity-runtime, وغير ذلك). فضّل config-contracts,
plugin-config-runtime, runtime-config-snapshot, وconfig-mutation
بدلا من barrel التوافق الواسع config-runtime.
openclaw/plugin-sdk/channel-runtime, openclaw/plugin-sdk/config-runtime,
وopenclaw/plugin-sdk/infra-runtime هي طبقات توافق مهملة لـ
Plugins أقدم. يجب أن تستورد الشيفرة الجديدة بدائيات عامة أضيق بدلا من ذلك.index.js— إدخال Plugin المضمنapi.js— barrel للمساعدات/الأنواعruntime-api.js— barrel خاص بوقت التشغيل فقطsetup-entry.js— إدخال Plugin للإعداد
openclaw/plugin-sdk/* الفرعية فقط. لا
تستورد أبدا src/* من حزمة Plugin أخرى من core أو من Plugin آخر.
تفضل نقاط الإدخال المحملة عبر الواجهة لقطة إعدادات وقت التشغيل النشطة عندما
توجد، ثم تعود إلى ملف الإعدادات المحلول على القرص.
توجد مسارات فرعية خاصة بالقدرات مثل image-generation, media-understanding,
وspeech لأن Plugins المضمنة تستخدمها اليوم. لكنها ليست
عقودا خارجية مجمدة تلقائيا على المدى الطويل — تحقق من صفحة مرجع SDK
ذات الصلة عند الاعتماد عليها.
مخططات أداة الرسائل
يجب أن تمتلك Plugins مساهمات مخططdescribeMessageTool(...) الخاصة بالقناة
للبدائيات غير الرسائل مثل التفاعلات، والقراءات، والاستطلاعات.
يجب أن يستخدم عرض الإرسال المشترك عقد MessagePresentation العام
بدلا من حقول الأزرار أو المكونات أو الكتل أو البطاقات الأصلية للمزود.
راجع عرض الرسائل لمعرفة العقد،
وقواعد الرجوع الاحتياطي، وتخطيط المزود، وقائمة تحقق مؤلف Plugin.
تعلن Plugins القادرة على الإرسال ما يمكنها عرضه من خلال قدرات الرسائل:
presentationلكتل العرض الدلالية (text,context,divider,buttons,select)delivery-pinلطلبات التسليم المثبت
حل هدف القناة
يجب أن تمتلك Plugins القنوات دلالات الأهداف الخاصة بالقناة. أبقِ مضيف الإرسال المشترك عاما واستخدم سطح محول الرسائل لقواعد المزود:messaging.inferTargetChatType({ to })يقرر ما إذا كان الهدف المطبع يجب أن يعامل كـdirectأوgroupأوchannelقبل البحث في الدليل.messaging.targetResolver.looksLikeId(raw, normalized)يخبر core ما إذا كان يجب أن يتجاوز إدخال ما مباشرة إلى حل شبيه بالمعرف بدلا من بحث الدليل.messaging.targetResolver.resolveTarget(...)هو رجوع Plugin الاحتياطي عندما يحتاج core إلى حل نهائي مملوك للمزود بعد التطبيع أو بعد إخفاق الدليل.messaging.resolveOutboundSessionRoute(...)يمتلك إنشاء مسار الجلسة الخاص بالمزود بمجرد حل الهدف.
- استخدم
inferTargetChatTypeلقرارات الفئة التي يجب أن تحدث قبل البحث في الأقران/المجموعات. - استخدم
looksLikeIdلفحوصات “عامل هذا كمعرف هدف صريح/أصلي”. - استخدم
resolveTargetكرجوع احتياطي للتطبيع الخاص بالمزود، وليس من أجل بحث واسع في الدليل. - أبقِ المعرفات الأصلية للمزود مثل معرفات الدردشة، ومعرفات السلاسل، وJIDs، والمقابض، ومعرفات الغرف
داخل قيم
targetأو معلمات خاصة بالمزود، وليس في حقول SDK العامة.
أدلة مدعومة بالإعدادات
يجب أن تبقي Plugins التي تستنتج إدخالات الدليل من الإعدادات هذا المنطق داخل Plugin وأن تعيد استخدام المساعدات المشتركة منopenclaw/plugin-sdk/directory-runtime.
استخدم هذا عندما تحتاج قناة إلى أقران/مجموعات مدعومة بالإعدادات مثل:
- أقران DM مدفوعين بقائمة السماح
- خرائط قنوات/مجموعات مهيأة
- بدائل دليل ثابتة ضمن نطاق الحساب
directory-runtime مع العمليات العامة فقط:
- تصفية الاستعلام
- تطبيق الحد
- مساعدات إزالة التكرار/التطبيع
- بناء
ChannelDirectoryEntry[]
كتالوجات المزودين
يمكن لـ Plugins المزودين تعريف كتالوجات نماذج للاستدلال باستخدامregisterProvider({ catalog: { run(...) { ... } } }).
يعيد catalog.run(...) الشكل نفسه الذي يكتبه OpenClaw في
models.providers:
{ provider }لإدخال مزود واحد{ providers }لعدة إدخالات مزودين
catalog عندما يمتلك Plugin معرفات نماذج خاصة بالمزود، أو
إعدادات URL الأساسية الافتراضية، أو بيانات تعريف نماذج محكومة بالمصادقة.
يتحكم catalog.order في وقت دمج كتالوج Plugin بالنسبة إلى المزودين
الضمنيين المدمجين في OpenClaw:
simple: مزودون عاديون مدفوعون بمفتاح API أو envprofile: مزودون يظهرون عند وجود ملفات تعريف مصادقةpaired: مزودون ينشئون عدة إدخالات مزودين مرتبطةlate: آخر تمريرة، بعد المزودين الضمنيين الآخرين
api.registerModelCatalogProvider({ provider, kinds, staticCatalog, liveCatalog }). هذا هو المسار المستقبلي لأسطح القائمة/المساعدة/المنتقي ويدعم
صفوف text, image_generation, video_generation, وmusic_generation.
لا تزال Plugins المزودين تمتلك استدعاءات نقاط النهاية الحية، وتبادل الرموز، وتخطيط
استجابة المورد؛ ويمتلك core شكل الصف المشترك، وتسميات المصدر، وتنسيق
مساعدة أدوات الوسائط. تنشئ تسجيلات مزودي توليد الوسائط صفوف كتالوج ثابتة
تلقائيا من defaultModel, models, وcapabilities.
التوافق:
- لا يزال
discoveryيعمل كاسم مستعار قديم، لكنه يصدر تحذير إهمال - إذا تم تسجيل كل من
catalogوdiscovery، يستخدم OpenClawcatalog augmentModelCatalogمهمل؛ يجب أن تنشر المزودات المضمنة صفوفا تكميلية من خلالregisterModelCatalogProvider
فحص القناة للقراءة فقط
إذا كان Plugin الخاص بك يسجل قناة، ففضّل تنفيذ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 لكنها غير متاحة في مسار الأمر الحالي.
حزم الحزم
قد يتضمن دليل Plugin ملفpackage.json يحتوي على openclaw.extensions:
name/<fileBase>.
إذا كان Plugin الخاص بك يستورد تبعيات npm، فثبتها في ذلك الدليل بحيث
يكون node_modules متاحا (npm install / pnpm install).
حاجز أمان: يجب أن يبقى كل إدخال openclaw.extensions داخل دليل Plugin
بعد حل الروابط الرمزية. تُرفض الإدخالات التي تخرج من دليل الحزمة.
ملاحظة أمان: يقوم openclaw plugins install بتثبيت تبعيات Plugin باستخدام
npm install --omit=dev --ignore-scripts محلي للمشروع (لا توجد نصوص دورة حياة،
ولا تبعيات تطوير في وقت التشغيل)، مع تجاهل إعدادات تثبيت npm العامة الموروثة.
أبقِ أشجار تبعيات Plugin “JS/TS خالصة” وتجنب الحزم التي تتطلب
عمليات بناء postinstall.
اختياري: يمكن أن يشير openclaw.setupEntry إلى وحدة خفيفة مخصصة للإعداد فقط.
عندما يحتاج OpenClaw إلى أسطح إعداد لـ Plugin قناة معطل، أو
عندما يكون Plugin قناة ممكنا لكنه لا يزال غير مهيأ، فإنه يحمل setupEntry
بدلا من إدخال Plugin الكامل. هذا يجعل بدء التشغيل والإعداد أخف
عندما يقوم إدخال Plugin الرئيسي أيضا بتوصيل الأدوات، أو hooks، أو شيفرة أخرى
خاصة بوقت التشغيل فقط.
اختياري: يمكن لـ openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen
إدخال Plugin قناة في مسار setupEntry نفسه خلال مرحلة بدء تشغيل Gateway
قبل الاستماع، حتى عندما تكون القناة مهيأة بالفعل.
استخدم هذا فقط عندما يغطي setupEntry بالكامل سطح بدء التشغيل الذي يجب أن يكون موجودًا
قبل أن يبدأ Gateway في الاستماع. عمليًا، يعني ذلك أن إدخال الإعداد
يجب أن يسجل كل قدرة مملوكة للقناة يعتمد عليها بدء التشغيل، مثل:
- تسجيل القناة نفسه
- أي مسارات HTTP يجب أن تكون متاحة قبل أن يبدأ Gateway في الاستماع
- أي طرق أو أدوات أو خدمات Gateway يجب أن تكون موجودة أثناء تلك النافذة نفسها
singleAccountKeysToMovenamedAccountPromotionKeysresolveSingleAccountPromotionTarget(...)
channels.<id>.accounts.* من دون تحميل إدخال Plugin الكامل.
Matrix هو المثال المضمن الحالي: ينقل فقط مفاتيح المصادقة/التمهيد إلى حساب
مُرقّى مسمى عندما تكون الحسابات المسماة موجودة بالفعل، ويمكنه الاحتفاظ بمفتاح
حساب افتراضي مكوّن غير قياسي بدلًا من إنشاء accounts.default دائمًا.
تُبقي محولات رقع الإعداد هذه اكتشاف سطح العقد المضمن كسولًا. يبقى وقت الاستيراد
خفيفًا؛ ولا يُحمّل سطح الترقية إلا عند أول استخدام بدلًا من إعادة الدخول إلى بدء
تشغيل القناة المضمنة عند استيراد الوحدة.
عندما تتضمن أسطح بدء التشغيل هذه طرق Gateway RPC، أبقِها على بادئة خاصة
بالـ Plugin. تبقى مساحات أسماء الإدارة الأساسية (config.*,
exec.approvals.*, wizard.*, update.*) محجوزة وتتحول دائمًا
إلى operator.admin، حتى إذا طلب Plugin نطاقًا أضيق.
مثال:
بيانات تعريف كتالوج القنوات
يمكن لـ Plugins القنوات الإعلان عن بيانات تعريف الإعداد/الاكتشاف عبرopenclaw.channel و
تلميحات التثبيت عبر openclaw.install. هذا يبقي كتالوج core خاليًا من البيانات.
مثال:
openclaw.channel المفيدة بخلاف المثال الأدنى:
detailLabel: تسمية ثانوية لأسطح الكتالوج/الحالة الأكثر ثراءًdocsLabel: تجاوز نص الرابط لرابط الوثائقpreferOver: معرفات Plugin/قناة ذات أولوية أدنى يجب أن يتفوق عليها إدخال الكتالوج هذاselectionDocsPrefix,selectionDocsOmitLabel,selectionExtras: عناصر تحكم في نص سطح الاختيارmarkdownCapable: يعلّم القناة على أنها قادرة على markdown لقرارات تنسيق الإخراجexposure.configured: إخفاء القناة من أسطح قوائم القنوات المكوّنة عند ضبطها علىfalseexposure.setup: إخفاء القناة من منتقيات الإعداد/التكوين التفاعلية عند ضبطها علىfalseexposure.docs: تعليم القناة على أنها داخلية/خاصة لأسطح تنقل الوثائقshowConfigured/showInSetup: أسماء بديلة قديمة لا تزال مقبولة للتوافق؛ فضّلexposurequickstartAllowFrom: إدخال القناة في تدفق البدء السريع القياسيallowFromforceAccountBinding: طلب ربط حساب صريح حتى عند وجود حساب واحد فقط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".
تعرض إدخالات كتالوج القنوات المولدة وإدخالات كتالوج تثبيت المزوّد
حقائق مصدر التثبيت المعيارية بجوار كتلة openclaw.install الخام. تحدد
الحقائق المعيارية ما إذا كانت مواصفة npm إصدارًا دقيقًا أم محددًا عائمًا،
وما إذا كانت بيانات تعريف التكامل المتوقعة موجودة، وما إذا كان مسار مصدر
محلي متاحًا أيضًا. عندما تكون هوية الكتالوج/الحزمة معروفة، تحذر الحقائق
المعيارية إذا انحرف اسم حزمة npm المحلل عن تلك الهوية. كما تحذر عندما يكون
defaultChoice غير صالح أو يشير إلى مصدر غير متاح، وعندما تكون بيانات تعريف
تكامل npm موجودة من دون مصدر npm صالح. يجب على المستهلكين التعامل مع
installSource كحقل اختياري إضافي حتى لا تضطر الإدخالات المصنوعة يدويًا
وواجهات توافق الكتالوج إلى توليده.
يتيح هذا للإعداد التشخيصي وعمليات التشخيص شرح حالة مستوى المصدر من دون
استيراد وقت تشغيل Plugin.
يجب أن تفضّل إدخالات npm الخارجية الرسمية npmSpec دقيقًا مع
expectedIntegrity. لا تزال أسماء الحزم المجردة وdist-tags تعمل للتوافق،
لكنها تعرض تحذيرات مستوى المصدر كي يستطيع الكتالوج الانتقال نحو تثبيتات
مثبتة ومتحققة التكامل من دون كسر Plugins الموجودة. عندما يثبت الإعداد من
مسار كتالوج محلي، فإنه يسجل إدخال فهرس Plugin مُدارًا مع source: "path"
وsourcePath نسبيًا إلى مساحة العمل عند الإمكان. يبقى مسار التحميل التشغيلي
المطلق في plugins.load.paths؛ ويتجنب سجل التثبيت تكرار مسارات محطة العمل
المحلية في إعدادات طويلة الأجل. هذا يبقي تثبيتات التطوير المحلي مرئية
لتشخيصات مستوى المصدر من دون إضافة سطح إفصاح ثانٍ خام لمسارات نظام الملفات.
فهرس Plugin الدائم plugins/installs.json هو مصدر حقيقة التثبيت ويمكن تحديثه
من دون تحميل وحدات وقت تشغيل Plugin. خريطة installRecords الخاصة به دائمة
حتى عند فقدان بيان Plugin أو كونه غير صالح؛ ومصفوفة plugins الخاصة به
هي عرض بيان قابل لإعادة البناء.
Plugins محرك السياق
تملك Plugins محرك السياق تنسيق سياق الجلسة للإدخال، والتجميع، وCompaction. سجّلها من Plugin لديك باستخدامapi.registerContextEngine(id, factory)، ثم اختر المحرك النشط باستخدام
plugins.slots.contextEngine.
استخدم هذا عندما يحتاج Plugin لديك إلى استبدال مسار السياق الافتراضي أو توسيعه
بدلًا من مجرد إضافة بحث في الذاكرة أو خطافات.
ctx الخاص بالمصنع قيم config وagentDir وworkspaceDir
اختيارية للتهيئة وقت الإنشاء.
إذا كان محركك لا يملك خوارزمية Compaction، فأبقِ compact()
منفذة وفوّضها صراحةً:
إضافة قدرة جديدة
عندما يحتاج Plugin إلى سلوك لا يناسب API الحالي، لا تتجاوز نظام Plugin بوصول خاص إلى الداخل. أضف القدرة الناقصة. التسلسل الموصى به:- عرّف عقد core قرر ما السلوك المشترك الذي يجب أن يملكه core: السياسة، والرجوع الاحتياطي، ودمج الإعدادات، ودورة الحياة، والدلالات المواجهة للقنوات، وشكل مساعد وقت التشغيل.
- أضف أسطح تسجيل/وقت تشغيل typed للـ Plugin
وسّع
OpenClawPluginApiو/أوapi.runtimeبأصغر سطح قدرة typed مفيد. - صِل core + مستهلكي القناة/الميزة يجب أن تستهلك القنوات وPlugins الميزات القدرة الجديدة عبر core، لا عبر استيراد تنفيذ بائع مباشرة.
- سجّل تنفيذات البائعين ثم تسجل Plugins البائعين خلفياتها مقابل القدرة.
- أضف تغطية للعقد أضف اختبارات حتى تبقى الملكية وشكل التسجيل صريحين مع مرور الوقت.
قائمة تحقق القدرات
عند إضافة قدرة جديدة، يجب عادةً أن يلمس التنفيذ هذه الأسطح معًا:- أنواع عقد core في
src/<capability>/types.ts - مساعد مشغّل/وقت تشغيل core في
src/<capability>/runtime.ts - سطح تسجيل API الخاص بـ Plugin في
src/plugins/types.ts - توصيل سجل Plugin في
src/plugins/registry.ts - تعريض وقت تشغيل Plugin في
src/plugins/runtime/*عندما تحتاج Plugins الميزات/القنوات إلى استهلاكه - مساعدو الالتقاط/الاختبار في
src/test-utils/plugin-registration.ts - تأكيدات الملكية/العقد في
src/plugins/contracts/registry.ts - وثائق المشغل/Plugin في
docs/
قالب القدرة
النمط الأدنى:- يملك core عقد القدرة + التنسيق
- تملك Plugins البائعين تنفيذات البائعين
- تستهلك Plugins الميزات/القنوات مساعدي وقت التشغيل
- تبقي اختبارات العقد الملكية صريحة
ذو صلة
- معمارية Plugin — نموذج وأشكال القدرات العامة
- المسارات الفرعية لـ Plugin SDK
- إعداد Plugin SDK
- بناء Plugins