Plugin SDK reference
بيان Plugin
تغطي هذه الصفحة بيان Plugin الأصلي لـ OpenClaw، وهو openclaw.plugin.json. للاطلاع على تخطيطات الحزم المتوافقة (Codex وClaude وCursor)، راجع حزم Plugin.
تستخدم تنسيقات الحزم المتوافقة ملفات البيانات الخاصة بها بدلًا من ذلك:
- حزمة Codex:
.codex-plugin/plugin.json - حزمة Claude:
.claude-plugin/plugin.json، أو تخطيط مكونات Claude الافتراضي من دون ملف بيانات - حزمة Cursor:
.cursor-plugin/plugin.json
يكتشف OpenClaw هذه التخطيطات تلقائيًا، لكنه لا يتحقق من صحتها وفق مخطط openclaw.plugin.json أدناه. بالنسبة إلى الحزمة المتوافقة، يقرأ OpenClaw بيانات الحزمة الوصفية، وجذور Skills المعلنة، وجذور أوامر Claude، والقيم الافتراضية في settings.json لـ Claude، وقيم LSP الافتراضية لـ Claude، وحزم الخطافات المدعومة، عندما يتوافق التخطيط مع توقعات وقت تشغيل OpenClaw.
يجب أن يتضمن كل Plugin أصلي لـ OpenClaw ملف openclaw.plugin.json في جذر Plugin. يقرأه OpenClaw للتحقق من صحة الإعدادات من دون تنفيذ شيفرة Plugin. يؤدي غياب ملف البيانات أو عدم صلاحيته إلى منع التحقق من صحة الإعدادات، ويُعامل ذلك على أنه خطأ في Plugin.
راجع Plugins للاطلاع على الدليل الكامل لنظام Plugins، ونموذج الإمكانات للاطلاع على نموذج الإمكانات الأصلي والإرشادات الحالية للتوافق الخارجي.
وظيفة هذا الملف
openclaw.plugin.json هو بيانات وصفية يقرأها OpenClaw قبل تحميل شيفرة Plugin. يجب أن يكون فحص كل ما يتضمنه منخفض التكلفة بما يكفي لإجرائه من دون تشغيل بيئة Plugin.
استخدمه من أجل:
- هوية Plugin، والتحقق من صحة الإعدادات، وتلميحات واجهة إعداداتها
- البيانات الوصفية للمصادقة، والتهيئة الأولية، والإعداد (الاسم البديل، والتمكين التلقائي، ومتغيرات بيئة المزوّد، وخيارات المصادقة)
- تلميحات التنشيط لأسطح مستوى التحكم
- إسناد ملكية عائلات النماذج باستخدام صيغ مختصرة
- لقطات ثابتة لملكية الإمكانات (
contracts) - بيانات وصفية لمشغّل ضمان الجودة يمكن للمضيف المشترك
openclaw qaفحصها - بيانات وصفية خاصة بالقنوات تُدمج في أسطح الفهرس والتحقق من الصحة
لا تستخدمه من أجل: تسجيل سلوك وقت التشغيل، أو التصريح بنقاط دخول الشيفرة، أو بيانات تثبيت npm الوصفية. تنتمي هذه العناصر إلى شيفرة Plugin وpackage.json.
مثال بسيط
{ "id": "voice-call", "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}مثال شامل
{ "id": "openrouter", "name": "OpenRouter", "description": "OpenRouter provider plugin", "version": "1.0.0", "providers": ["openrouter"], "modelSupport": { "modelPrefixes": ["router-"] }, "modelIdNormalization": { "providers": { "openrouter": { "prefixWhenBare": "openrouter" } } }, "providerEndpoints": [ { "endpointClass": "openrouter", "hostSuffixes": ["openrouter.ai"] } ], "providerRequest": { "providers": { "openrouter": { "family": "openrouter" } } }, "cliBackends": ["openrouter-cli"], "syntheticAuthRefs": ["openrouter-cli"], "setup": { "providers": [ { "id": "openrouter", "envVars": ["OPENROUTER_API_KEY"] } ] }, "providerAuthAliases": { "openrouter-coding": "openrouter" }, "channelEnvVars": { "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"] }, "providerAuthChoices": [ { "provider": "openrouter", "method": "api-key", "choiceId": "openrouter-api-key", "choiceLabel": "OpenRouter API key", "groupId": "openrouter", "groupLabel": "OpenRouter", "optionKey": "openrouterApiKey", "cliFlag": "--openrouter-api-key", "cliOption": "--openrouter-api-key <key>", "cliDescription": "OpenRouter API key", "onboardingScopes": ["text-inference"] } ], "uiHints": { "apiKey": { "label": "API key", "placeholder": "sk-or-v1-...", "sensitive": true } }, "configSchema": { "type": "object", "additionalProperties": false, "properties": { "apiKey": { "type": "string" } } }}مرجع الحقول ذات المستوى الأعلى
| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
id |
نعم | string |
المعرّف القياسي للـ Plugin. وهو المعرّف المستخدم في plugins.entries.<id>. |
configSchema |
نعم | object |
مخطط JSON مضمن لإعدادات هذا الـ Plugin. |
requiresPlugins |
لا | string[] |
معرّفات Plugins التي يجب تثبيتها أيضًا لكي يكون لهذا الـ Plugin تأثير. تُبقي عملية الاكتشاف الـ Plugin قابلًا للتحميل، لكنها تُصدر تحذيرًا عند غياب أي Plugin مطلوب. |
enabledByDefault |
لا | true |
يضع علامة على Plugin مضمّن باعتباره مفعّلًا افتراضيًا. احذفه، أو عيّن أي قيمة غير true، لترك الـ Plugin معطّلًا افتراضيًا. |
enabledByDefaultOnPlatforms |
لا | string[] |
يضع علامة على Plugin مضمّن باعتباره مفعّلًا افتراضيًا فقط على منصات Node.js المدرجة، مثل ["darwin"]. تظل للإعدادات الصريحة الأولوية. |
legacyPluginIds |
لا | string[] |
المعرّفات القديمة التي تُطبَّع إلى المعرّف القياسي لهذا الـ Plugin. |
autoEnableWhenConfiguredProviders |
لا | string[] |
معرّفات المزوّدين التي ينبغي أن تفعّل هذا الـ Plugin تلقائيًا عندما تشير إليها مراجع المصادقة أو الإعدادات أو النماذج. |
kind |
لا | PluginKind | PluginKind[] |
يعلن عن نوع حصري واحد أو أكثر من أنواع Plugins ("memory"، و"context-engine") المستخدمة بواسطة plugins.slots.*. يعلن الـ Plugin الذي يملك كلتا الفتحتين عن كلا النوعين في مصفوفة واحدة. |
channels |
لا | string[] |
معرّفات القنوات التي يملكها هذا الـ Plugin. تُستخدم للاكتشاف والتحقق من صحة الإعدادات. |
providers |
لا | string[] |
معرّفات المزوّدين التي يملكها هذا الـ Plugin. |
providerCatalogEntry |
لا | string |
مسار وحدة خفيف لكتالوج المزوّد، نسبةً إلى جذر الـ Plugin، لبيانات تعريف كتالوج المزوّد ضمن نطاق البيان، والتي يمكن تحميلها دون تفعيل وقت تشغيل الـ Plugin الكامل. |
modelSupport |
لا | object |
بيانات تعريف مختصرة لعائلة النماذج، يملكها البيان، وتُستخدم لتحميل الـ Plugin تلقائيًا قبل وقت التشغيل. |
modelCatalog |
لا | object |
بيانات تعريف تصريحية لكتالوج النماذج للمزوّدين الذين يملكهم هذا الـ Plugin. هذا هو عقد مستوى التحكم للإدراج المستقبلي للقراءة فقط، والإعداد الأولي، ومنتقيات النماذج، والأسماء البديلة، والحجب دون تحميل وقت تشغيل الـ Plugin. |
modelPricing |
لا | object |
سياسة البحث عن الأسعار الخارجية التي يملكها المزوّد. استخدمها لاستثناء المزوّدين المحليين أو المستضافين ذاتيًا من كتالوجات الأسعار البعيدة، أو لربط مراجع المزوّد بمعرّفات كتالوج OpenRouter/LiteLLM دون ترميز معرّفات المزوّدين داخل النواة. |
modelIdNormalization |
لا | object |
تنظيف الأسماء البديلة أو البادئات لمعرّفات النماذج، الذي يملكه المزوّد ويجب تنفيذه قبل تحميل وقت تشغيل المزوّد. |
providerEndpoints |
لا | object[] |
بيانات تعريف المضيف أو baseUrl لنقاط النهاية، التي يملكها البيان، لمسارات المزوّد التي يجب على النواة تصنيفها قبل تحميل وقت تشغيل المزوّد. |
providerRequest |
لا | object |
بيانات تعريف خفيفة لعائلة المزوّد وتوافق الطلبات، تستخدمها سياسة الطلبات العامة قبل تحميل وقت تشغيل المزوّد. |
secretProviderIntegrations |
لا | Record<string, object> |
إعدادات مسبقة تصريحية لمزوّدي تنفيذ SecretRef، يمكن لواجهات الإعداد أو التثبيت عرضها دون ترميز تكاملات خاصة بالمزوّد داخل النواة. |
cliBackends |
لا | string[] |
معرّفات الواجهات الخلفية للاستدلال عبر CLI التي يملكها هذا الـ Plugin. تُستخدم للتفعيل التلقائي عند بدء التشغيل استنادًا إلى مراجع الإعدادات الصريحة. |
syntheticAuthRefs |
لا | string[] |
مراجع المزوّد أو الواجهة الخلفية لـ CLI التي ينبغي فحص خطاف المصادقة الاصطناعي المملوك للـ Plugin الخاص بها أثناء الاكتشاف البارد للنموذج قبل تحميل وقت التشغيل. |
nonSecretAuthMarkers |
لا | string[] |
قيم نائبة لمفاتيح API يملكها Plugin مضمّن، وتمثّل حالة بيانات اعتماد محلية أو OAuth أو محيطية غير سرية. |
commandAliases |
لا | object[] |
أسماء الأوامر التي يملكها هذا الـ Plugin، والتي ينبغي أن تنتج تشخيصات للإعدادات وCLI تكون مدركة للـ Plugin قبل تحميل وقت التشغيل. |
providerAuthEnvVars |
لا | Record<string, string[]> |
بيانات تعريف متغيرات البيئة المتقادمة للتوافق عند البحث عن مصادقة المزوّد أو حالته. يُفضّل استخدام setup.providers[].envVars مع Plugins الجديدة؛ وما زال OpenClaw يقرأ هذه البيانات خلال فترة الإهمال. |
providerUsageAuthEnvVars |
لا | Record<string, string[]> |
بيانات اعتماد المزوّد الخاصة بالاستخدام أو الفوترة فقط. يستخدم OpenClaw هذه الأسماء لاكتشاف الاستخدام وتنقية الأسرار، ولكن لا يستخدمها أبدًا لمصادقة الاستدلال. |
providerAuthAliases |
لا | Record<string, string> |
معرّفات المزوّدين التي ينبغي أن تعيد استخدام معرّف مزوّد آخر للبحث عن المصادقة، مثل مزوّد برمجة يشارك مفتاح API وملفات تعريف المصادقة الخاصة بالمزوّد الأساسي. |
channelEnvVars |
لا | Record<string, string[]> |
بيانات تعريف خفيفة لمتغيرات بيئة القناة يستطيع OpenClaw فحصها دون تحميل رمز الـ Plugin. استخدمها لإعداد القنوات المعتمد على متغيرات البيئة، أو لواجهات المصادقة التي ينبغي أن تراها مساعدات بدء التشغيل أو الإعدادات العامة. |
providerAuthChoices |
لا | object[] |
بيانات تعريف خفيفة لخيارات المصادقة لاستخدامها في منتقيات الإعداد الأولي، وحلّ المزوّد المفضّل، والربط البسيط لعلامات CLI. |
activation |
لا | object |
بيانات تعريف خفيفة لمخطط التفعيل من أجل التحميل المحفَّز ببدء التشغيل أو المزوّد أو الأمر أو القناة أو المسار أو الإمكانية. هي بيانات تعريف فقط؛ ويظل وقت تشغيل الـ Plugin مالكًا للسلوك الفعلي. |
setup |
لا | object |
واصفات خفيفة للإعداد أو الإعداد الأولي يمكن لواجهات الاكتشاف والإعداد فحصها دون تحميل وقت تشغيل الـ Plugin. |
qaRunners |
لا | object[] |
واصفات خفيفة لمشغّلات ضمان الجودة يستخدمها مضيف openclaw qa المشترك قبل تحميل وقت تشغيل الـ Plugin. |
contracts |
لا | object |
لقطة ثابتة لملكية الإمكانات لخطافات المصادقة الخارجية، والتضمينات، والكلام، والنسخ الفوري، والصوت الفوري، وفهم الوسائط، وتوليد الصور والفيديو والموسيقى، وجلب الويب، والبحث في الويب، ومزوّدي العمال، واستخراج محتوى المستندات والويب، وملكية الأدوات. |
configContracts |
لا | object |
سلوك الإعدادات الذي يملكه البيان وتستهلكه مساعدات النواة العامة: اكتشاف العلامات الخطرة، وأهداف ترحيل SecretRef، وتضييق مسارات الإعدادات القديمة. راجع مرجع configContracts. |
mediaUnderstandingProviderMetadata |
لا | Record<string, object> |
إعدادات افتراضية منخفضة التكلفة لفهم الوسائط لمعرّفات المزوّدين المعلنة في contracts.mediaUnderstandingProviders. |
imageGenerationProviderMetadata |
لا | Record<string, object> |
بيانات وصفية منخفضة التكلفة لمصادقة توليد الصور لمعرّفات المزوّدين المعلنة في contracts.imageGenerationProviders، بما في ذلك الأسماء البديلة للمصادقة التي يملكها المزوّد وقيود عنوان URL الأساسي. |
videoGenerationProviderMetadata |
لا | Record<string, object> |
بيانات وصفية منخفضة التكلفة لمصادقة توليد الفيديو لمعرّفات المزوّدين المعلنة في contracts.videoGenerationProviders، بما في ذلك الأسماء البديلة للمصادقة التي يملكها المزوّد وقيود عنوان URL الأساسي. |
musicGenerationProviderMetadata |
لا | Record<string, object> |
بيانات وصفية منخفضة التكلفة لمصادقة توليد الموسيقى لمعرّفات المزوّدين المعلنة في contracts.musicGenerationProviders، بما في ذلك الأسماء البديلة للمصادقة التي يملكها المزوّد وقيود عنوان URL الأساسي. |
toolMetadata |
لا | Record<string, object> |
بيانات وصفية منخفضة التكلفة لإتاحة الأدوات المملوكة للـ Plugin والمعلنة في contracts.tools. استخدمها عندما ينبغي ألا تحمّل الأداة بيئة التشغيل ما لم تتوفر أدلة من الإعدادات أو متغيرات البيئة أو المصادقة. |
channelConfigs |
لا | Record<string, object> |
بيانات وصفية لإعدادات القنوات يملكها ملف البيان، وتُدمج في واجهات الاكتشاف والتحقق قبل تحميل بيئة التشغيل. |
skills |
لا | string[] |
أدلة Skills المطلوب تحميلها، نسبةً إلى جذر الـ Plugin. |
name |
لا | string |
اسم الـ Plugin القابل للقراءة. |
description |
لا | string |
ملخص قصير يظهر في واجهات الـ Plugin. |
catalog |
لا | object |
تلميحات عرض اختيارية لواجهات كتالوج الـ Plugin. لا تثبّت هذه البيانات الوصفية أي Plugin أو تفعّله أو تمنحه الثقة. |
icon |
لا | string |
عنوان URL لصورة عبر HTTPS لبطاقات السوق أو الكتالوج. يقبل ClawHub أي عنوان URL صالح يبدأ بـ https://، ويستخدم أيقونة الـ Plugin الافتراضية عند حذف هذا الحقل أو إذا كانت قيمته غير صالحة. |
version |
لا | string |
إصدار الـ Plugin لأغراض معلوماتية. |
uiHints |
لا | Record<string, object> |
تسميات واجهة المستخدم، والنصوص النائبة، وتلميحات الحساسية لحقول الإعدادات. |
مرجع catalog
يوفّر catalog تلميحات عرض اختيارية لمتصفحات الـ Plugin. قد تتجاهل المضيفات هذه التلميحات. وهي لا تثبّت الـ Plugin أو تفعّله مطلقًا، ولا تغيّر سلوكه في وقت التشغيل أو مستوى الثقة به.
{ "catalog": { "featured": true, "order": 10 }}| الحقل | النوع | معناه |
|---|---|---|
featured |
boolean |
ما إذا كان ينبغي لواجهات الكتالوج إبراز هذا الـ Plugin. |
order |
number |
تلميح عرض تصاعدي بين الـ Plugins المنتقاة؛ تظهر القيم الأقل في موضع أسبق. |
مرجع البيانات الوصفية لمزوّد التوليد
تصف حقول البيانات الوصفية لمزوّد التوليد إشارات المصادقة الثابتة للمزوّدين المعلنين في قائمة contracts.*GenerationProviders المطابقة. يقرأ OpenClaw هذه الحقول قبل تحميل وقت تشغيل المزوّد، كي تتمكّن الأدوات الأساسية من تحديد ما إذا كان مزوّد التوليد متاحًا من دون استيراد كل Plugin خاص بالمزوّدين.
استخدم هذه الحقول فقط للحقائق التصريحية زهيدة التكلفة. يظل النقل، وتحويل الطلبات، وتحديث الرموز المميّزة، والتحقق من بيانات الاعتماد، وسلوك التوليد الفعلي ضمن وقت تشغيل الـ Plugin.
{ "contracts": { "imageGenerationProviders": ["example-image"] }, "imageGenerationProviderMetadata": { "example-image": { "aliases": ["example-image-oauth"], "authProviders": ["example-image"], "configSignals": [ { "rootPath": "plugins.entries.example-image.config", "overlayPath": "image", "mode": { "path": "mode", "default": "local", "allowed": ["local"] }, "requiredAny": ["workflow", "workflowPath"], "required": ["promptNodeId"] } ], "authSignals": [ { "provider": "example-image" }, { "provider": "example-image-oauth", "providerBaseUrl": { "provider": "example-image", "defaultBaseUrl": "https://api.example.com/v1", "allowedBaseUrls": ["https://api.example.com/v1"] } } ] } }}يدعم كل إدخال للبيانات الوصفية ما يلي:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
aliases |
لا | string[] |
معرّفات مزوّد إضافية ينبغي احتسابها كأسماء مستعارة ثابتة للمصادقة لمزوّد التوليد. |
authProviders |
لا | string[] |
معرّفات المزوّدين التي ينبغي احتساب ملفات تعريف المصادقة المضبوطة لها كمصادقة لمزوّد التوليد هذا. |
configSignals |
لا | object[] |
إشارات إتاحة زهيدة التكلفة تعتمد على الإعدادات فقط للمزوّدين المحليين أو المستضافين ذاتيًا، الذين يمكن ضبطهم من دون ملفات تعريف مصادقة أو متغيرات بيئة. |
authSignals |
لا | object[] |
إشارات مصادقة صريحة. عند وجودها، تحل محل مجموعة الإشارات الافتراضية المشتقة من معرّف المزوّد وaliases وauthProviders. |
referenceAudioInputs |
لا | boolean |
لتوليد الفيديو فقط. اضبطه على true عندما يقبل المزوّد أصولًا صوتية مرجعية؛ وإلا فإن video_generate يخفي معاملات المراجع الصوتية. |
يدعم كل إدخال في configSignals ما يلي:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
rootPath |
نعم | string |
مسار نقطي إلى كائن الإعدادات المملوك للـ Plugin لفحصه، مثل plugins.entries.example.config. |
overlayPath |
لا | string |
مسار نقطي داخل الإعدادات الجذرية، ينبغي أن يُسقِط كائنه قيمه فوق الكائن الجذري قبل تقييم الإشارة. استخدمه للإعدادات الخاصة بقدرة معيّنة، مثل image أو video أو music. |
overlayMapPath |
لا | string |
مسار نقطي داخل الإعدادات الجذرية، ينبغي أن يُسقِط كل كائن من قيمه فوق الكائن الجذري. استخدمه لخرائط الحسابات المسماة مثل accounts، حيث ينبغي أن يكون أي حساب مضبوط مؤهّلًا. |
required |
لا | string[] |
مسارات نقطية داخل الإعدادات الفعلية يجب أن تحتوي على قيم مضبوطة. يجب ألا تكون السلاسل فارغة، ويجب ألا تكون الكائنات والمصفوفات فارغة. |
requiredAny |
لا | string[] |
مسارات نقطية داخل الإعدادات الفعلية، يجب أن يحتوي واحد منها على الأقل على قيمة مضبوطة. |
mode |
لا | object |
شرط اختياري لوضع نصي داخل الإعدادات الفعلية. استخدمه عندما تنطبق الإتاحة المعتمدة على الإعدادات فقط على وضع واحد. |
يدعم كل شرط mode ما يلي:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
path |
لا | string |
مسار نقطي داخل الإعدادات الفعلية. القيمة الافتراضية هي mode. |
default |
لا | string |
قيمة الوضع المستخدمة عندما تحذف الإعدادات المسار. |
allowed |
لا | string[] |
عند وجوده، تنجح الإشارة فقط عندما يكون الوضع الفعلي إحدى هذه القيم. |
disallowed |
لا | string[] |
عند وجوده، تفشل الإشارة عندما يكون الوضع الفعلي إحدى هذه القيم. |
يدعم كل إدخال في authSignals ما يلي:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
provider |
نعم | string |
معرّف المزوّد المطلوب التحقق منه ضمن ملفات تعريف المصادقة المضبوطة. |
providerBaseUrl |
لا | object |
شرط اختياري يجعل الإشارة محتسبة فقط عندما يستخدم المزوّد المضبوط المُشار إليه عنوان URL أساسيًا مسموحًا به. استخدمه عندما يكون الاسم المستعار للمصادقة صالحًا لواجهات API معيّنة فقط. |
يدعم كل شرط providerBaseUrl ما يلي:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
provider |
نعم | string |
معرّف إعدادات المزوّد الذي ينبغي التحقق من baseUrl الخاص به. |
defaultBaseUrl |
لا | string |
عنوان URL الأساسي المفترض عندما تحذف إعدادات المزوّد baseUrl. |
allowedBaseUrls |
نعم | string[] |
عناوين URL الأساسية المسموح بها لإشارة المصادقة هذه. تُتجاهل الإشارة عندما لا يطابق عنوان URL الأساسي المضبوط أو الافتراضي إحدى هذه القيم المطبّعة. |
مرجع البيانات الوصفية للأداة
يستخدم toolMetadata البُنى نفسها لـconfigSignals وauthSignals المستخدمة في البيانات الوصفية لمزوّد التوليد، مع الفهرسة حسب اسم الأداة. يعلن contracts.tools الملكية. ويعلن toolMetadata أدلة إتاحة زهيدة التكلفة، كي يتمكّن OpenClaw من تجنّب استيراد وقت تشغيل Plugin لمجرد أن يعيد مصنع أدواته null.
{ "setup": { "providers": [ { "id": "example", "envVars": ["EXAMPLE_API_KEY"] } ] }, "contracts": { "tools": ["example_search"] }, "toolMetadata": { "example_search": { "authSignals": [ { "provider": "example" } ], "configSignals": [ { "rootPath": "plugins.entries.example.config", "overlayPath": "search", "required": ["apiKey"] } ] } }}تقبل إدخالات toolMetadata أيضًا optional (يضع علامة على أن الأداة غير مطلوبة لتفعيل الـ Plugin) وreplaySafe (يضع علامة على أن تكرار تنفيذ الأداة آمن بعد دورة نموذج غير مكتملة)، بالإضافة إلى حقول configSignals/authSignals المشتركة أعلاه.
إذا لم يكن للأداة toolMetadata، يحافظ OpenClaw على السلوك الحالي ويحمّل الـ Plugin المالك عندما يطابق عقد الأداة السياسة. بالنسبة إلى أدوات المسار الساخن التي يعتمد مصنعها على المصادقة أو الإعدادات، ينبغي لمؤلفي الـ Plugin إعلان toolMetadata بدلًا من جعل النواة تستورد وقت التشغيل للاستعلام.
مرجع providerAuthChoices
يصف كل إدخال في providerAuthChoices خيارًا واحدًا للإعداد الأولي أو المصادقة. يقرأ OpenClaw هذا قبل تحميل وقت تشغيل المزوّد. تستخدم قوائم إعداد المزوّد خيارات البيان هذه، وخيارات الإعداد المشتقة من الواصف، والبيانات الوصفية لكتالوج التثبيت، من دون تحميل وقت تشغيل المزوّد.
| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
provider |
نعم | string |
معرّف المزوّد الذي ينتمي إليه هذا الخيار. |
method |
نعم | string |
معرّف طريقة المصادقة المطلوب توجيه التنفيذ إليها. |
choiceId |
نعم | string |
معرّف ثابت لخيار المصادقة تستخدمه تدفقات الإعداد الأولي وCLI. |
choiceLabel |
لا | string |
تسمية معروضة للمستخدم. إذا حُذفت، يستخدم OpenClaw القيمة choiceId بدلًا منها. |
choiceHint |
لا | string |
نص مساعد قصير لأداة الاختيار. |
assistantPriority |
لا | number |
تُرتَّب القيم الأقل في موضع أسبق ضمن أدوات الاختيار التفاعلية التي يديرها المساعد. |
assistantVisibility |
لا | "visible" | "manual-only" |
يُخفي الخيار من أدوات اختيار المساعد مع استمرار السماح بتحديده يدويًا عبر CLI. |
deprecatedChoiceIds |
لا | string[] |
معرّفات الخيارات القديمة التي ينبغي أن تعيد توجيه المستخدمين إلى هذا الخيار البديل. |
groupId |
لا | string |
معرّف مجموعة اختياري لتجميع الخيارات المرتبطة. |
groupLabel |
لا | string |
تسمية معروضة للمستخدم لتلك المجموعة. |
groupHint |
لا | string |
نص مساعد قصير للمجموعة. |
onboardingFeatured |
لا | boolean |
يُظهر هذه المجموعة في فئة الخيارات المميزة بأداة اختيار الإعداد الأولي التفاعلية، قبل إدخال "المزيد...". |
optionKey |
لا | string |
مفتاح خيار داخلي لتدفقات المصادقة البسيطة ذات العلم الواحد. |
cliFlag |
لا | string |
اسم علم CLI، مثل --openrouter-api-key. |
cliOption |
لا | string |
الصيغة الكاملة لخيار CLI، مثل --openrouter-api-key <key>. |
cliDescription |
لا | string |
الوصف المستخدم في مساعدة CLI. |
onboardingScopes |
لا | Array<"text-inference" | "image-generation" | "music-generation"> |
واجهات الإعداد الأولي التي ينبغي أن يظهر فيها هذا الخيار. إذا حُذفت، تكون القيمة الافتراضية ["text-inference"]. |
مرجع commandAliases
استخدم commandAliases عندما يمتلك Plugin اسم أمر في وقت التشغيل قد يضعه المستخدمون خطأً في plugins.allow أو يحاولون تشغيله كأمر CLI جذري. يستخدم OpenClaw هذه البيانات الوصفية للتشخيص من دون استيراد شيفرة وقت تشغيل Plugin.
{ "commandAliases": [ { "name": "dreaming", "kind": "runtime-slash", "cliCommand": "memory" } ]}| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
name |
نعم | string |
اسم الأمر الذي ينتمي إلى هذا Plugin. |
kind |
لا | "runtime-slash" |
يحدد الاسم البديل بوصفه أمر شرطة مائلة في المحادثة بدلًا من أمر CLI جذري. |
cliCommand |
لا | string |
أمر CLI الجذري المرتبط الذي يُقترح لعمليات CLI، إن وُجد. |
مرجع activation
استخدم activation عندما يستطيع Plugin التصريح بتكلفة منخفضة عن أحداث مستوى التحكم التي ينبغي أن تدرجه في خطة تفعيل/تحميل.
هذه الكتلة بيانات وصفية للمخطِّط وليست واجهة API لدورة الحياة. فهي لا تسجّل سلوك وقت التشغيل، ولا تحل محل register(...)، ولا تضمن أن شيفرة Plugin قد نُفذت بالفعل. يستخدم مخطِّط التفعيل هذه الحقول لتضييق نطاق إضافات Plugin المرشحة قبل الرجوع إلى بيانات الملكية الوصفية الحالية في البيان، مثل providers وchannels وcommandAliases وsetup.providers وcontracts.tools والخطافات.
فضّل أضيق بيانات وصفية تصف الملكية بالفعل. استخدم providers أو channels أو commandAliases أو واصفات الإعداد أو contracts عندما تعبّر هذه الحقول عن العلاقة. استخدم activation لتلميحات المخطِّط الإضافية التي لا يمكن تمثيلها عبر حقول الملكية تلك. استخدم cliBackends في المستوى الأعلى للأسماء البديلة لوقت تشغيل CLI، مثل claude-cli أو my-cli أو google-gemini-cli؛ أما activation.onAgentHarnesses فهو مخصص فقط لمعرّفات أُطر تشغيل الوكيل المضمّنة التي ليس لها حقل ملكية بالفعل.
ينبغي لكل Plugin تعيين activation.onStartup بصورة مقصودة. عيّنه إلى true فقط عندما يجب تشغيل Plugin أثناء بدء تشغيل Gateway. وعيّنه إلى false عندما يكون Plugin خاملًا عند بدء التشغيل وينبغي تحميله فقط من محفزات أضيق. لم يعد حذف onStartup يؤدي ضمنيًا إلى تحميل Plugin عند بدء التشغيل؛ استخدم بيانات وصفية صريحة للتفعيل عند بدء التشغيل أو عبر القناة أو الإعداد أو إطار تشغيل الوكيل أو الذاكرة أو غيرها من محفزات التفعيل الأضيق.
{ "activation": { "onStartup": false, "onProviders": ["openai"], "onCommands": ["models"], "onChannels": ["web"], "onRoutes": ["gateway-webhook"], "onConfigPaths": ["browser"], "onCapabilities": ["provider", "tool"] }}| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
onStartup |
لا | boolean |
تفعيل صريح عند بدء تشغيل Gateway. ينبغي لكل Plugin تعيينه. تستورد true الـPlugin أثناء بدء التشغيل؛ بينما تبقيه false مؤجل التحميل عند البدء ما لم يتطلب محفز مطابق آخر تحميله. |
onProviders |
لا | string[] |
معرّفات المزوّدين التي ينبغي أن تُدرج هذا Plugin في خطط التفعيل/التحميل. |
onAgentHarnesses |
لا | string[] |
معرّفات أُطر تشغيل الوكيل المضمّنة التي ينبغي أن تُدرج هذا Plugin في خطط التفعيل/التحميل. استخدم cliBackends في المستوى الأعلى للأسماء البديلة للواجهات الخلفية لـCLI. |
onCommands |
لا | string[] |
معرّفات الأوامر التي ينبغي أن تُدرج هذا Plugin في خطط التفعيل/التحميل. |
onChannels |
لا | string[] |
معرّفات القنوات التي ينبغي أن تُدرج هذا Plugin في خطط التفعيل/التحميل. |
onRoutes |
لا | string[] |
أنواع المسارات التي ينبغي أن تُدرج هذا Plugin في خطط التفعيل/التحميل. |
onConfigPaths |
لا | string[] |
مسارات الإعداد النسبية إلى الجذر التي ينبغي عند وجودها وعدم تعطيلها صراحةً أن تُدرج هذا Plugin في خطط بدء التشغيل/التحميل. |
onCapabilities |
لا | Array<"provider" | "channel" | "tool" | "hook"> |
تلميحات عامة للقدرات يستخدمها تخطيط التفعيل في مستوى التحكم. فضّل الحقول الأضيق متى أمكن. |
المستهلكون الفعليون الحاليون:
- يستخدم تخطيط بدء تشغيل Gateway القيمة
activation.onStartupللاستيراد الصريح عند بدء التشغيل. - يرجع تخطيط CLI المشغّل بالأوامر إلى
commandAliases[].cliCommandالقديمة أوcommandAliases[].name. - يستخدم تخطيط بدء تشغيل وقت تشغيل الوكيل
activation.onAgentHarnessesللأُطر المضمّنة وcliBackends[]في المستوى الأعلى للأسماء البديلة لوقت تشغيل CLI. - يرجع تخطيط الإعداد/القناة المشغّل بالقنوات إلى ملكية
channels[]القديمة عند غياب بيانات وصفية صريحة لتفعيل القناة. - يستخدم تخطيط Plugin عند بدء التشغيل
activation.onConfigPathsلواجهات إعداد الجذر غير المرتبطة بالقنوات، مثل كتلةbrowserالخاصة بـPlugin المتصفح المضمّن. - يرجع تخطيط الإعداد/وقت التشغيل المشغّل بالمزوّد إلى ملكية
providers[]القديمة وcliBackends[]في المستوى الأعلى عند غياب بيانات وصفية صريحة لتفعيل المزوّد.
يمكن لتشخيصات المخطِّط التمييز بين تلميحات التفعيل الصريحة والرجوع إلى ملكية البيان. على سبيل المثال، تعني activation-command-hint أن activation.onCommands قد تطابقت، بينما تعني manifest-command-alias أن المخطِّط استخدم ملكية commandAliases بدلًا منها. تسميات الأسباب هذه مخصصة لتشخيصات المضيف والاختبارات؛ وينبغي لمؤلفي Plugin الاستمرار في التصريح بالبيانات الوصفية التي تصف الملكية على أفضل وجه.
مرجع qaRunners
استخدم qaRunners عندما يساهم Plugin بمشغّل نقل واحد أو أكثر ضمن
جذر openclaw qa المشترك. أبقِ هذه البيانات الوصفية خفيفة وثابتة؛ يظل وقت تشغيل
Plugin مالكًا لتسجيل CLI الفعلي عبر واجهة runtime-api.ts خفيفة
تصدّر qaRunnerCliRegistrations المطابقة. يتيح adapterFactory اختياري
النقل لسيناريوهات ضمان الجودة المشتركة دون تغيير مشغّل الأمر المسجّل.
{ "qaRunners": [ { "commandName": "matrix", "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver" } ]}| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
commandName |
نعم | string |
الأمر الفرعي المثبّت ضمن openclaw qa، مثل matrix. |
description |
لا | string |
نص المساعدة الاحتياطي المستخدم عندما يحتاج المضيف المشترك إلى أمر بديل مؤقت. |
يجب أن يطابق معرّف adapterFactory القيمة commandName. لا تُصدّر تسجيلات
لأوامر غير موجودة في البيان.
مرجع setup
استخدم setup عندما تحتاج واجهات الإعداد والتهيئة الأولية إلى بيانات وصفية منخفضة التكلفة يملكها Plugin قبل تحميل وقت التشغيل.
{ "setup": { "providers": [ { "id": "openai", "authMethods": ["api-key"], "envVars": ["OPENAI_API_KEY"], "authEvidence": [ { "type": "local-file-with-env", "fileEnvVar": "OPENAI_CREDENTIALS_FILE", "requiresAllEnv": ["OPENAI_PROJECT"], "credentialMarker": "openai-local-credentials", "source": "openai local credentials" } ] } ], "cliBackends": ["openai-cli"], "configMigrations": ["legacy-openai-auth"], "requiresRuntime": false }}يظل cliBackends في المستوى الأعلى صالحًا ويستمر في وصف الواجهات الخلفية للاستدلال عبر CLI. أما setup.cliBackends فهو واجهة الواصفات الخاصة بالإعداد لتدفقات مستوى التحكم والإعداد التي ينبغي أن تظل مقتصرة على البيانات الوصفية.
عند وجود setup.providers وsetup.cliBackends، فهما واجهة البحث المفضلة القائمة أولًا على الواصفات لاكتشاف الإعداد. إذا كان الواصف يضيّق نطاق Plugin المرشّح فقط، وظل الإعداد يحتاج إلى خطافات وقت تشغيل أكثر ثراءً أثناء الإعداد، فعيّن requiresRuntime: true وأبقِ setup-api في مكانه بصفته مسار التنفيذ الاحتياطي.
يضمّن OpenClaw أيضًا setup.providers[].envVars في عمليات البحث العامة عن مصادقة المزوّد ومتغيرات البيئة. يظل providerAuthEnvVars مدعومًا عبر مهايئ توافق خلال فترة الإهمال، لكن Plugins غير المضمّنة التي لا تزال تستخدمه تتلقى تشخيصًا للبيان. ينبغي أن تضع Plugins الجديدة البيانات الوصفية لمتغيرات بيئة الإعداد والحالة في setup.providers[].envVars.
استخدم providerUsageAuthEnvVars عندما يجب أن تفعّل بيانات اعتماد للفوترة أو على مستوى المؤسسة الدالة resolveUsageAuth من دون أن تصبح بيانات اعتماد للاستدلال. تنضم هذه الأسماء إلى حظر ملفات dotenv لمساحة العمل، وإزالتها من العمليات الفرعية لـ ACP، وتصفية الأسرار في بيئة العزل، والتنقيح الشامل للأسرار. ويظل وقت تشغيل المزوّد يقرأ القيمة ويصنّفها داخل resolveUsageAuth.
يمكن لـ OpenClaw أيضًا اشتقاق خيارات إعداد بسيطة من setup.providers[].authMethods عند عدم توفر مدخل إعداد، أو عندما تعلن setup.requiresRuntime: false أن وقت تشغيل الإعداد غير ضروري. تظل مدخلات providerAuthChoices الصريحة مفضلة للتسميات المخصصة، وأعلام CLI، ونطاق التهيئة الأولية، والبيانات الوصفية للمساعد.
عيّن requiresRuntime: false فقط عندما تكون هذه الواصفات كافية لواجهة الإعداد. يتعامل OpenClaw مع القيمة الصريحة false باعتبارها عقدًا قائمًا على الواصفات فقط، ولن ينفّذ setup-api أو openclaw.setupEntry للبحث عن الإعداد. إذا كان Plugin قائم على الواصفات فقط لا يزال يوفّر أحد مدخلي وقت تشغيل الإعداد هذين، فسيبلغ OpenClaw عن تشخيص إضافي ويستمر في تجاهله. يؤدي حذف requiresRuntime إلى الإبقاء على سلوك المسار الاحتياطي القديم كي لا تتعطل Plugins الحالية التي أضافت الواصفات من دون هذا العلم.
نظرًا إلى أن البحث عن الإعداد يمكنه تنفيذ شيفرة setup-api المملوكة لـ Plugin، يجب أن تظل قيم setup.providers[].id وsetup.cliBackends[] الموحّدة فريدة عبر Plugins المكتشفة. تؤدي الملكية الملتبسة إلى الإخفاق المغلق بدلًا من اختيار فائز وفق ترتيب الاكتشاف.
عند تنفيذ وقت تشغيل الإعداد، تُبلغ تشخيصات سجل الإعداد عن انحراف الواصفات إذا سجّل setup-api مزوّدًا أو واجهة خلفية لـ CLI لم تعلنها واصفات البيان، أو إذا لم يكن للواصف تسجيل مطابق في وقت التشغيل. هذه التشخيصات إضافية ولا ترفض Plugins القديمة.
مرجع setup.providers
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
id |
نعم | string |
معرّف المزوّد المعروض أثناء الإعداد أو التهيئة الأولية. أبقِ المعرّفات الموحّدة فريدة عموميًا. |
authMethods |
لا | string[] |
معرّفات طرق الإعداد والمصادقة التي يدعمها هذا المزوّد من دون تحميل وقت التشغيل الكامل. |
envVars |
لا | string[] |
متغيرات البيئة التي يمكن لواجهات الإعداد والحالة العامة فحصها قبل تحميل وقت تشغيل Plugin. |
authEvidence |
لا | object[] |
فحوص منخفضة التكلفة لأدلة المصادقة المحلية للمزوّدين القادرين على المصادقة عبر علامات غير سرية. |
يُستخدم authEvidence لعلامات بيانات الاعتماد المحلية المملوكة للمزوّد التي يمكن التحقق منها من دون تحميل شيفرة وقت التشغيل. يجب أن تظل هذه الفحوص منخفضة التكلفة ومحلية: بلا استدعاءات شبكة، ولا قراءات من سلسلة المفاتيح أو مدير الأسرار، ولا أوامر صدفة، ولا عمليات فحص لواجهة API الخاصة بالمزوّد.
مدخلات الأدلة المدعومة:
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
type |
نعم | string |
حاليًا local-file-with-env. |
fileEnvVar |
لا | string |
متغير بيئة يحتوي على مسار صريح لملف بيانات الاعتماد. |
fallbackPaths |
لا | string[] |
مسارات ملفات بيانات الاعتماد المحلية التي تُفحص عندما يكون fileEnvVar غائبًا أو فارغًا. يدعم ${HOME} و${APPDATA}. |
requiresAnyEnv |
لا | string[] |
يجب ألا يكون واحد على الأقل من متغيرات البيئة المدرجة فارغًا قبل اعتبار الدليل صالحًا. |
requiresAllEnv |
لا | string[] |
يجب ألا يكون أي متغير بيئة مدرج فارغًا قبل اعتبار الدليل صالحًا. |
credentialMarker |
نعم | string |
علامة غير سرية تُعاد عند وجود الدليل. |
source |
لا | string |
تسمية المصدر الموجّهة للمستخدم في مخرجات المصادقة والحالة. |
حقول setup
| الحقل | مطلوب | النوع | معناه |
|---|---|---|---|
providers |
لا | object[] |
واصفات إعداد المزوّدين المعروضة أثناء الإعداد والتهيئة الأولية. |
cliBackends |
لا | string[] |
معرّفات الواجهات الخلفية المستخدمة وقت الإعداد للبحث القائم أولًا على الواصفات. أبقِ المعرّفات الموحّدة فريدة عموميًا. |
configMigrations |
لا | string[] |
معرّفات ترحيل الإعدادات التي تملكها واجهة الإعداد الخاصة بهذا Plugin. |
requiresRuntime |
لا | boolean |
ما إذا كان الإعداد لا يزال يحتاج إلى تنفيذ setup-api بعد البحث في الواصفات. |
مرجع uiHints
uiHints خريطة من أسماء حقول الإعدادات إلى تلميحات عرض صغيرة. يمكن للمفاتيح استخدام النقاط لحقول الإعدادات المتداخلة، لكن لا يجوز أن يكون أي مقطع من المسار __proto__ أو constructor أو prototype؛ يرفض الإعداد هذه الأسماء.
{ "uiHints": { "apiKey": { "label": "API key", "help": "Used for OpenRouter requests", "placeholder": "sk-or-v1-...", "sensitive": true } }}يمكن أن يتضمن تلميح كل حقل ما يلي:
| الحقل | النوع | معناه |
|---|---|---|
label |
string |
تسمية الحقل الموجّهة للمستخدم. |
help |
string |
نص مساعدة قصير. |
tags |
string[] |
وسوم اختيارية لواجهة المستخدم. |
advanced |
boolean |
يميّز الحقل على أنه متقدم. |
sensitive |
boolean |
يميّز الحقل على أنه سري أو حساس. |
placeholder |
string |
نص العنصر النائب لمدخلات النموذج. |
مرجع contracts
استخدم contracts فقط للبيانات الوصفية الثابتة لملكية القدرات التي يستطيع OpenClaw قراءتها من دون استيراد وقت تشغيل Plugin.
{ "contracts": { "agentToolResultMiddleware": ["openclaw", "codex"], "trustedToolPolicies": ["workflow-budget"], "externalAuthProviders": ["acme-ai"], "embeddingProviders": ["openai-compatible"], "speechProviders": ["openai"], "realtimeTranscriptionProviders": ["openai"], "realtimeVoiceProviders": ["openai"], "memoryEmbeddingProviders": ["local"], "mediaUnderstandingProviders": ["openai"], "imageGenerationProviders": ["openai"], "videoGenerationProviders": ["qwen"], "musicGenerationProviders": ["stability-audio"], "documentExtractors": ["example-docs"], "webContentExtractors": ["firecrawl"], "webFetchProviders": ["firecrawl"], "webSearchProviders": ["gemini"], "workerProviders": ["example-worker"], "usageProviders": ["acme-ai"], "migrationProviders": ["hermes"], "gatewayMethodDispatch": ["authenticated-request"], "tools": ["firecrawl_search", "firecrawl_scrape"] }}كل قائمة اختيارية:
| الحقل | النوع | ما يعنيه |
|---|---|---|
embeddedExtensionFactories |
string[] |
معرّفات مصانع امتدادات خادم تطبيق Codex، وحاليًا codex-app-server. |
agentToolResultMiddleware |
string[] |
معرّفات بيئات التشغيل التي يجوز لهذا الـ Plugin تسجيل برمجيات وسيطة لنتائج الأدوات لها. |
trustedToolPolicies |
string[] |
معرّفات سياسات ما قبل الأداة الموثوقة والمحلية للـ Plugin التي يجوز لـ Plugin مثبّت تسجيلها. يجوز للـ Plugins المضمّنة تسجيل السياسات من دون هذا الحقل. |
externalAuthProviders |
string[] |
معرّفات المزوّدين الذين يمتلك هذا الـ Plugin خطاف ملفات تعريف المصادقة الخارجية الخاص بهم. |
embeddingProviders |
string[] |
معرّفات مزوّدي التضمين العامين الذين يمتلكهم هذا الـ Plugin لاستخدامات تضمين المتجهات القابلة لإعادة الاستخدام، بما في ذلك الذاكرة. |
speechProviders |
string[] |
معرّفات مزوّدي الكلام الذين يمتلكهم هذا الـ Plugin. |
realtimeTranscriptionProviders |
string[] |
معرّفات مزوّدي النسخ في الوقت الفعلي الذين يمتلكهم هذا الـ Plugin. |
realtimeVoiceProviders |
string[] |
معرّفات مزوّدي الصوت في الوقت الفعلي الذين يمتلكهم هذا الـ Plugin. |
memoryEmbeddingProviders |
string[] |
معرّفات مزوّدي التضمين الخاصة بالذاكرة والمهملة التي يمتلكها هذا الـ Plugin. |
mediaUnderstandingProviders |
string[] |
معرّفات مزوّدي فهم الوسائط الذين يمتلكهم هذا الـ Plugin. |
transcriptSourceProviders |
string[] |
معرّفات مزوّدي مصادر النصوص المنسوخة الذين يمتلكهم هذا الـ Plugin. |
documentExtractors |
string[] |
معرّفات مزوّدي استخراج المستندات (مثل PDF) الذين يمتلكهم هذا الـ Plugin. |
imageGenerationProviders |
string[] |
معرّفات مزوّدي توليد الصور الذين يمتلكهم هذا الـ Plugin. |
videoGenerationProviders |
string[] |
معرّفات مزوّدي توليد الفيديو الذين يمتلكهم هذا الـ Plugin. |
musicGenerationProviders |
string[] |
معرّفات مزوّدي توليد الموسيقى الذين يمتلكهم هذا الـ Plugin. |
webContentExtractors |
string[] |
معرّفات مزوّدي استخراج محتوى صفحات الويب الذين يمتلكهم هذا الـ Plugin. |
webFetchProviders |
string[] |
معرّفات مزوّدي جلب محتوى الويب الذين يمتلكهم هذا الـ Plugin. |
webSearchProviders |
string[] |
معرّفات مزوّدي البحث في الويب الذين يمتلكهم هذا الـ Plugin. |
workerProviders |
string[] |
معرّفات مزوّدي عمال السحابة الذين يمتلكهم هذا الـ Plugin للتزويد وإدارة دورة حياة عقود الإيجار المدعومة بملفات التعريف. |
usageProviders |
string[] |
معرّفات المزوّدين الذين يمتلك هذا الـ Plugin خطافات مصادقة الاستخدام ولقطات الاستخدام الخاصة بهم. |
migrationProviders |
string[] |
معرّفات مزوّدي الاستيراد الذين يمتلكهم هذا الـ Plugin للأمر openclaw migrate. |
gatewayMethodDispatch |
string[] |
استحقاق محجوز لمسارات HTTP الموثّقة الخاصة بالـ Plugin التي توجّه أساليب Gateway داخل العملية. |
tools |
string[] |
أسماء أدوات الوكيل التي يمتلكها هذا الـ Plugin. |
يُحتفظ بـ contracts.embeddedExtensionFactories لمصانع امتدادات خادم تطبيق Codex المضمّنة فقط. ينبغي لتحويلات نتائج الأدوات المضمّنة التصريح بـ contracts.agentToolResultMiddleware والتسجيل باستخدام api.registerAgentToolResultMiddleware(...) بدلًا من ذلك. لا يجوز للـ Plugins المثبّتة استخدام واجهة البرمجيات الوسيطة نفسها إلا عند تمكينها صراحةً، وفقط لبيئات التشغيل التي تصرّح بها في contracts.agentToolResultMiddleware.
يجب على الـ Plugins المثبّتة التي تحتاج إلى طبقة سياسة ما قبل الأداة الموثوقة من المضيف أن تصرّح عن كل معرّف محلي مسجّل في contracts.trustedToolPolicies وأن تكون مُمكّنة صراحةً. تحتفظ الـ Plugins المضمّنة بمسار السياسة الموثوقة الحالي، لكن تُرفض الـ Plugins المثبّتة ذات معرّفات السياسات غير المصرّح بها قبل التسجيل. يقتصر نطاق معرّفات السياسات على الـ Plugin الذي يسجّلها، لذلك يجوز لاثنين من الـ Plugins التصريح عن workflow-budget وتسجيله؛ ولا يجوز لـ Plugin واحد تسجيل المعرّف المحلي نفسه مرتين.
يجب أن تتطابق تسجيلات api.registerTool(...) في وقت التشغيل مع contracts.tools. يستخدم اكتشاف الأدوات هذه القائمة لتحميل بيئات تشغيل الـ Plugins التي يمكنها امتلاك الأدوات المطلوبة فقط.
ينبغي للـ Plugins المزوّدة التي تنفّذ resolveExternalAuthProfiles التصريح بـ contracts.externalAuthProviders؛ وتُتجاهل خطافات المصادقة الخارجية غير المصرّح بها.
ينبغي للـ Plugins المزوّدة التي تنفّذ كلًا من resolveUsageAuth وfetchUsageSnapshot التصريح عن كل معرّف مزوّد مكتشف تلقائيًا في contracts.usageProviders. يقرأ اكتشاف الاستخدام هذا العقد قبل تحميل شيفرة وقت التشغيل، ثم يتحقق من الخطافين كليهما بعد تحميل المالكين المصرّح بهم فقط.
ينبغي لمزوّدي التضمين العام التصريح بـ contracts.embeddingProviders لكل مهايئ مسجّل باستخدام api.registerEmbeddingProvider(...). استخدم العقد العام لتوليد المتجهات القابل لإعادة الاستخدام، بما في ذلك المزوّدون الذين يستهلكهم بحث الذاكرة. إن contracts.memoryEmbeddingProviders توافق مهمل خاص بالذاكرة، ولا يبقى إلا أثناء ترحيل المزوّدين الحاليين إلى واجهة مزوّد التضمين العامة.
يجب على مزوّدي العمال التصريح عن كل معرّف api.registerWorkerProvider(...) في contracts.workerProviders. يحتفظ النواة بالنية الدائمة قبل استدعاء provision؛ ويتحقق المزوّدون من إعداداتهم قبل التخصيص الخارجي، ويجب أن تعتمد الاستدعاءات المتكررة ذات معرّف العملية نفسه عقد الإيجار نفسه. يحتفظ النواة أيضًا بلقطة الإعدادات المتحقق منها ويمررها مع leaseId إلى inspect({ leaseId, profile }) وdestroy({ leaseId, profile })، بما في ذلك بعد تغيير ملف التعريف المسمّى أو إزالته. عملية التدمير متكررة التنفيذ بأمان، ويُرجع الفحص اتحاد الحالات المغلق active / destroyed / unknown، ولا يُشار إلى مادة مفتاح SSH الخاص إلا من خلال SecretRef. يجب أن تتضمن نقاط نهاية SSH المزوّدة أيضًا hostKey عامًا من مخرجات تزويد موثوقة بالصيغة algorithm base64 تمامًا، من دون اسم مضيف أو تعليق، لكي تتمكن النواة من تثبيت هوية المضيف قبل الاتصال. يجوز للمزوّدين الذين ينشئون مراجع هوية ديناميكية تنفيذ resolveSshIdentity({ leaseId, profile, keyRef }) المرجعي؛ أما المزوّدون الذين لا ينفّذونه فيستخدمون محلّل الأسرار العام في النواة. تؤدي الحالة المرجعية unknown إلى جعل سجل محلي نشط يتيمًا؛ وبعد طلب تدمير محفوظ، تؤكد اكتمال الإزالة.
يقبل contracts.gatewayMethodDispatch حاليًا "authenticated-request". وهو بوابة لضبط نظافة API لمسارات HTTP الأصلية للـ Plugin التي توجّه عمدًا أساليب مستوى تحكم Gateway داخل العملية، وليس بيئة عزل ضد الـ Plugins الأصلية الخبيثة. استخدمه فقط لأسطح مضمّنة أو تشغيلية خضعت لمراجعة دقيقة وتتطلب مسبقًا مصادقة HTTP الخاصة بـ Gateway. يظل المسار المستحق قابلًا للوصول عندما يكون قبول العمل الجذري في Gateway مغلقًا، فقط إذا صرّح أيضًا بـ auth: "gateway" وgatewayRuntimeScopeSurface: "trusted-operator" الخاص بالمسار؛ وتبقى المسارات النظيرة العادية من الـ Plugin نفسه خلف حدود القبول. يُبقي ذلك حالة التعليق والاستئناف قابلتين للوصول من دون منح الـ Plugin بأكمله تجاوزًا للقبول. أبقِ التحليل وتشكيل الاستجابة محدودين خارج التوجيه؛ ويجب أن يمر العمل الجوهري أو المعدِّل عبر توجيه أساليب Gateway، الذي يمتلك إنفاذ القبول والنطاق.
مرجع configContracts
استخدم configContracts لسلوك الإعدادات المملوك لبيان الـ Plugin الذي تحتاج إليه مساعدات النواة العامة من دون استيراد وقت تشغيل الـ Plugin: اكتشاف العلامات الخطرة، وأهداف ترحيل SecretRef، وتضييق مسارات الإعدادات القديمة.
{ "configContracts": { "compatibilityMigrationPaths": ["legacyProvider"], "compatibilityRuntimePaths": ["legacyProvider.webhook"], "dangerousFlags": [ { "path": "accounts.*.allowUnverifiedSenders", "equals": true } ], "secretInputs": { "bundledDefaultEnabled": false, "paths": [ { "path": "apiKey", "expected": "string" } ] } }}| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
compatibilityMigrationPaths |
لا | string[] |
مسارات إعدادات نسبية إلى الجذر تشير إلى احتمال انطباق عمليات ترحيل التوافق في وقت إعداد هذا الـ Plugin. يتيح ذلك لقراءات إعدادات وقت التشغيل العامة تخطي جميع أسطح إعداد الـ Plugin عندما لا تشير الإعدادات إليه مطلقًا. |
compatibilityRuntimePaths |
لا | string[] |
مسارات توافق نسبية إلى الجذر يمكن لهذا الـ Plugin خدمتها في وقت التشغيل قبل تنشيط شيفرة الـ Plugin بالكامل. استخدم هذا للأسطح القديمة التي ينبغي أن تضيّق مجموعات المرشحين المضمّنة من دون استيراد وقت تشغيل كل Plugin متوافق. |
dangerousFlags |
لا | object[] |
قيم إعدادات حرفية ينبغي للأمر openclaw doctor الإبلاغ عنها بوصفها غير آمنة أو خطرة عند تمكينها. انظر أدناه. |
secretInputs |
لا | object |
مسارات إعدادات ضمن plugins.entries.<id>.config ينبغي لسجل أهداف ترحيل/تدقيق SecretRef معاملتها كسلاسل ذات هيئة أسرار. انظر أدناه. |
يدعم كل إدخال في dangerousFlags ما يلي:
| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
path |
نعم | string |
مسار إعدادات مفصول بنقاط بالنسبة إلى plugins.entries.<id>.config. يدعم أحرف البدل * لمقاطع الخرائط/المصفوفات. |
equals |
نعم | string | number | boolean | null |
القيمة الحرفية الدقيقة التي تميّز قيمة الإعدادات هذه بأنها خطرة. |
يدعم secretInputs ما يلي:
| الحقل | مطلوب | النوع | ما يعنيه |
|---|---|---|---|
bundledDefaultEnabled |
لا | boolean |
يتجاوز التمكين الافتراضي للـ Plugin المضمّن عند تحديد ما إذا كان سطح SecretRef هذا نشطًا. استخدمه عندما يكون الـ Plugin مضمّنًا، لكن يجب أن يظل السطح غير نشط حتى يُمكَّن صراحةً في الإعدادات. |
paths |
نعم | object[] |
مسارات إعدادات على هيئة أسرار، يحتوي كل منها على path (مفصول بنقاط، ونسبي إلى plugins.entries.<id>.config، ويدعم محارف البدل *) وexpected اختياري (لا يدعم حاليًا سوى "string"). |
مرجع mediaUnderstandingProviderMetadata
استخدم mediaUnderstandingProviderMetadata عندما يكون لمزوّد فهم الوسائط نماذج افتراضية، أو أولوية احتياطية للمصادقة التلقائية، أو دعم أصلي للمستندات تحتاج إليه مساعدات النواة العامة قبل تحميل وقت التشغيل. يجب أيضًا تعريف المفاتيح في contracts.mediaUnderstandingProviders.
{ "contracts": { "mediaUnderstandingProviders": ["example"] }, "mediaUnderstandingProviderMetadata": { "example": { "capabilities": ["image", "audio"], "defaultModels": { "image": "example-vision-latest", "audio": "example-transcribe-latest" }, "autoPriority": { "image": 40 }, "nativeDocumentInputs": ["pdf"], "documentModels": { "pdf": { "textExtraction": "example-doc-text-latest", "image": "example-doc-vision-latest" } } } }}يمكن أن يتضمن إدخال كل مزوّد ما يلي:
| الحقل | النوع | ما يعنيه |
|---|---|---|
capabilities |
("image" | "audio" | "video")[] |
إمكانات الوسائط التي يوفّرها هذا المزوّد. |
defaultModels |
Record<string, string> |
الإعدادات الافتراضية لربط الإمكانات بالنماذج، والمستخدمة عندما لا تحدد الإعدادات نموذجًا. |
autoPriority |
Record<string, number> |
تُرتّب الأرقام الأقل أولًا عند الرجوع التلقائي إلى مزوّد استنادًا إلى بيانات الاعتماد. |
nativeDocumentInputs |
"pdf"[] |
مدخلات المستندات الأصلية التي يدعمها المزوّد. |
documentModels |
{ pdf?: { textExtraction?: string; image?: string | false } } |
تجاوزات النماذج لكل نوع مستند. عيّن image: false لتعطيل الاستخراج المستند إلى الصور لذلك النوع من المستندات. |
مرجع channelConfigs
استخدم channelConfigs عندما يحتاج Plugin قناة إلى بيانات وصفية منخفضة التكلفة للإعدادات قبل تحميل وقت التشغيل. يمكن لاستكشاف إعداد/حالة القناة للقراءة فقط استخدام هذه البيانات الوصفية مباشرةً للقنوات الخارجية المُعدّة عندما لا يتوفر إدخال إعداد، أو عندما يعلن setup.requiresRuntime: false أن وقت تشغيل الإعداد غير ضروري.
channelConfigs هي بيانات وصفية لبيان الـ Plugin، وليست قسم إعدادات جديدًا للمستخدم في المستوى الأعلى. يواصل المستخدمون إعداد مثيلات القنوات ضمن channels.<channel-id>. يقرأ OpenClaw البيانات الوصفية للبيان لتحديد الـ Plugin الذي يملك تلك القناة المُعدّة قبل تنفيذ شيفرة وقت تشغيل الـ Plugin.
بالنسبة إلى Plugin قناة، يصف configSchema وchannelConfigs مسارين مختلفين:
- يتحقق
configSchemaمن صحةplugins.entries.<plugin-id>.config - يتحقق
channelConfigs.<channel-id>.schemaمن صحةchannels.<channel-id>
ينبغي للـ Plugins غير المضمّنة التي تعلن channels[] أن تعلن أيضًا إدخالات channelConfigs مطابقة. من دونها، يظل بإمكان OpenClaw تحميل الـ Plugin، لكن مخطط إعدادات المسار البارد، والإعداد، وواجهات Control UI لا يمكنها معرفة بنية الخيارات المملوكة للقناة حتى يُنفّذ وقت تشغيل الـ Plugin.
يمكن لـ channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled وnativeSkillsAutoEnabled إعلان قيم auto افتراضية ثابتة لعمليات التحقق من إعدادات الأوامر التي تعمل قبل تحميل وقت تشغيل القناة. ويمكن للقنوات المضمّنة أيضًا نشر القيم الافتراضية نفسها عبر package.json#openclaw.channel.commands إلى جانب بياناتها الوصفية الأخرى لكتالوج القنوات المملوكة للحزمة.
{ "channelConfigs": { "matrix": { "schema": { "type": "object", "additionalProperties": false, "properties": { "homeserverUrl": { "type": "string" } } }, "uiHints": { "homeserverUrl": { "label": "Homeserver URL", "placeholder": "https://matrix.example.com" } }, "label": "Matrix", "description": "Matrix homeserver connection", "commands": { "nativeCommandsAutoEnabled": true, "nativeSkillsAutoEnabled": true }, "preferOver": ["matrix-legacy"] } }}يمكن أن يتضمن إدخال كل قناة ما يلي:
| الحقل | النوع | ما يعنيه |
|---|---|---|
schema |
object |
مخطط JSON لـ channels.<id>. مطلوب لكل إدخال إعداد قناة معلن. |
uiHints |
Record<string, object> |
تسميات واجهة مستخدم وتلميحات للعناصر النائبة والحساسية، اختيارية لقسم إعدادات تلك القناة. |
label |
string |
تسمية القناة التي تُدمج في واجهات الاختيار والفحص عندما لا تكون البيانات الوصفية لوقت التشغيل جاهزة. |
description |
string |
وصف موجز للقناة لواجهات الفحص والكتالوج. |
commands |
object |
إعدادات افتراضية تلقائية ثابتة للأوامر الأصلية وSkills الأصلية، لعمليات التحقق قبل وقت التشغيل. |
preferOver |
string[] |
معرّفات Plugins القديمة أو الأقل أولوية التي ينبغي لهذه القناة أن تتفوق عليها في واجهات الاختيار. |
استبدال Plugin قناة آخر
استخدم preferOver عندما يكون الـ Plugin الخاص بك هو المالك المفضّل لمعرّف قناة يمكن أن يوفّره Plugin آخر أيضًا. تشمل الحالات الشائعة معرّف Plugin أُعيدت تسميته، أو Plugin مستقلًا يحل محل Plugin مضمّن، أو نسخة متفرعة تتم صيانتها وتحتفظ بمعرّف القناة نفسه لتوافق الإعدادات.
{ "id": "acme-chat", "channels": ["chat"], "channelConfigs": { "chat": { "schema": { "type": "object", "additionalProperties": false, "properties": { "webhookUrl": { "type": "string" } } }, "preferOver": ["chat"] } }}عند إعداد channels.chat، يأخذ OpenClaw في الاعتبار كلًا من معرّف القناة ومعرّف الـ Plugin المفضّل. إذا جرى اختيار الـ Plugin الأقل أولوية فقط لأنه مضمّن أو ممكّن افتراضيًا، فإن OpenClaw يعطّله في إعدادات وقت التشغيل الفعلية لكي يملك Plugin واحد القناة وأدواتها. يظل اختيار المستخدم الصريح هو الغالب: إذا مكّن المستخدم كلا الـ Pluginين صراحةً (عبر plugins.allow أو إعداد فعلي في plugins.entries)، يحافظ OpenClaw على ذلك الاختيار ويبلغ عن تشخيصات تكرار القناة/الأداة بدلًا من تغيير مجموعة الـ Plugins المطلوبة بصمت.
اجعل نطاق preferOver مقتصرًا على معرّفات Plugins التي يمكنها فعلًا توفير القناة نفسها. فهو ليس حقل أولوية عامًا، ولا يعيد تسمية مفاتيح إعدادات المستخدم.
مرجع modelSupport
استخدم modelSupport عندما ينبغي لـ OpenClaw استنتاج Plugin المزوّد الخاص بك من معرّفات نماذج مختصرة مثل gpt-5.6-sol أو claude-sonnet-4.6 قبل تحميل وقت تشغيل الـ Plugin.
{ "modelSupport": { "modelPrefixes": ["gpt-", "o1", "o3", "o4"], "modelPatterns": ["^computer-use-preview"] }}يطبّق OpenClaw ترتيب الأولوية التالي:
- تستخدم مراجع
provider/modelالصريحة البيانات الوصفية لبيانprovidersالمالك - تتقدم
modelPatternsعلىmodelPrefixes - إذا تطابق Plugin غير مضمّن وPlugin مضمّن، يفوز الـ Plugin غير المضمّن
- يُتجاهل أي غموض متبقٍ حتى يحدد المستخدم أو الإعدادات مزوّدًا
الحقول:
| الحقل | النوع | ما يعنيه |
|---|---|---|
modelPrefixes |
string[] |
بادئات تُطابق باستخدام startsWith مع معرّفات النماذج المختصرة. |
modelPatterns |
string[] |
مصادر تعبيرات نمطية تُطابق مع معرّفات النماذج المختصرة بعد إزالة لاحقة ملف التعريف. |
تُجمّع إدخالات modelPatterns عبر compileSafeRegex، الذي يرفض الأنماط المحتوية على تكرار متداخل (مثل (a+)+$). تُتخطى الأنماط التي تفشل في فحص السلامة بصمت، كما هو الحال مع التعبيرات النمطية غير الصالحة نحويًا. اجعل الأنماط بسيطة وتجنب محددات التكرار المتداخلة.
مرجع modelCatalog
استخدم modelCatalog عندما ينبغي لـ OpenClaw معرفة البيانات الوصفية لنماذج المزوّد قبل تحميل وقت تشغيل الـ Plugin. هذا هو المصدر المملوك للبيان لصفوف الكتالوج الثابتة، والأسماء البديلة للمزوّدين، وقواعد الاستبعاد، ووضع الاستكشاف. يظل التحديث في وقت التشغيل من اختصاص شيفرة وقت تشغيل المزوّد، لكن البيان يخبر النواة متى يكون وقت التشغيل مطلوبًا.
{ "providers": ["openai"], "modelCatalog": { "providers": { "openai": { "baseUrl": "https://api.openai.com/v1", "api": "openai-responses", "models": [ { "id": "gpt-5.4", "name": "GPT-5.4", "input": ["text", "image"], "reasoning": true, "contextWindow": 256000, "maxTokens": 128000, "cost": { "input": 1.25, "output": 10, "cacheRead": 0.125 }, "status": "available", "tags": ["default"] } ] } }, "aliases": { "azure-openai-responses": { "provider": "openai", "api": "azure-openai-responses" } }, "suppressions": [ { "provider": "azure-openai-responses", "model": "gpt-5.3-codex-spark", "reason": "not available on Azure OpenAI Responses" } ], "discovery": { "openai": "static" } }}حقول المستوى الأعلى:
| الحقل | النوع | معناه |
|---|---|---|
providers |
Record<string, object> |
صفوف الكتالوج لمعرّفات المزوّدين التي يملكها هذا الـ Plugin. يجب أن تظهر المفاتيح أيضًا في providers ذات المستوى الأعلى. |
aliases |
Record<string, object> |
أسماء المزوّدين البديلة التي يجب أن تُحل إلى مزوّد مملوك لأغراض تخطيط الكتالوج أو الاستبعاد. |
suppressions |
object[] |
صفوف النماذج من مصدر آخر التي يستبعدها هذا الـ Plugin لسبب خاص بالمزوّد. |
discovery |
Record<string, "static" | "refreshable" | "runtime"> |
ما إذا كان يمكن قراءة كتالوج المزوّد من بيانات البيان الوصفية، أو تحديثه في ذاكرة التخزين المؤقت، أو كان يتطلب وقت التشغيل. |
runtimeAugment |
boolean |
يُضبط على true فقط عندما يجب أن يضيف وقت تشغيل المزوّد صفوف الكتالوج بعد تخطيط البيان/الإعداد. |
تشارك aliases في البحث عن ملكية المزوّد لتخطيط كتالوج النماذج. يجب أن تكون أهداف الأسماء البديلة مزوّدين في المستوى الأعلى يملكهم الـ Plugin نفسه. عندما تستخدم قائمة مُرشَّحة حسب المزوّد اسمًا بديلًا، يستطيع OpenClaw قراءة بيان المالك وتطبيق تجاوزات واجهة API/عنوان URL الأساسي للاسم البديل من دون تحميل وقت تشغيل المزوّد. لا توسّع الأسماء البديلة قوائم الكتالوج غير المُرشَّحة؛ فالقوائم الشاملة تُخرج فقط صفوف المزوّد القياسي المالك.
تحل suppressions محل خطاف وقت تشغيل المزوّد القديم suppressBuiltInModel. لا تُحترم إدخالات الاستبعاد إلا عندما يكون المزوّد مملوكًا للـ Plugin أو مُعلنًا بوصفه مفتاحًا في modelCatalog.aliases يستهدف مزوّدًا مملوكًا. لم تعد خطافات الاستبعاد في وقت التشغيل تُستدعى أثناء حل النماذج.
حقول المزوّد:
| الحقل | النوع | معناه |
|---|---|---|
baseUrl |
string |
عنوان URL أساسي افتراضي اختياري للنماذج في كتالوج هذا المزوّد. |
api |
ModelApi |
محوّل API افتراضي اختياري للنماذج في كتالوج هذا المزوّد. |
headers |
Record<string, string> |
ترويسات ثابتة اختيارية تنطبق على كتالوج هذا المزوّد. |
defaultUtilityModel |
string |
معرّف اختياري لنموذج صغير يوصي به المزوّد لمهام الأدوات الداخلية القصيرة (العناوين، وسرد التقدّم). يُستخدم عندما لا تكون agents.defaults.utilityModel معيّنة ويقدّم هذا المزوّد النموذج الأساسي للوكيل. |
models |
object[] |
صفوف النماذج المطلوبة. تُتجاهل الصفوف التي لا تحتوي على id. |
حقول النموذج:
| الحقل | النوع | معناه |
|---|---|---|
id |
string |
معرّف النموذج المحلي لدى المزوّد، من دون البادئة provider/. |
name |
string |
اسم عرض اختياري. |
api |
ModelApi |
تجاوز اختياري لواجهة API لكل نموذج. |
baseUrl |
string |
تجاوز اختياري لعنوان URL الأساسي لكل نموذج. |
headers |
Record<string, string> |
ترويسات ثابتة اختيارية لكل نموذج. |
input |
Array<"text" | "image" | "document"> |
الأنماط التي يقبلها النموذج. تُحذف القيم الأخرى بصمت. |
reasoning |
boolean |
ما إذا كان النموذج يوفّر سلوك الاستدلال. |
contextWindow |
number |
نافذة السياق الأصلية لدى المزوّد. |
contextTokens |
number |
حد سياق فعّال اختياري في وقت التشغيل عندما يختلف عن contextWindow. |
maxTokens |
number |
الحد الأقصى لرموز الإخراج عندما يكون معروفًا. |
thinkingLevelMap |
Record<string, string | null> |
تجاوزات اختيارية لمعرّف النموذج أو المعامل لكل مستوى تفكير. |
cost |
object |
تسعير اختياري بالدولار الأمريكي لكل مليون رمز، بما في ذلك tieredPricing الاختياري. |
compat |
object |
علامات توافق اختيارية تطابق توافق إعداد نموذج OpenClaw. |
mediaInput |
object |
إعداد إدخال اختياري لكل نمط، ويقتصر حاليًا على الصور. |
status |
"available" | "preview" | "deprecated" | "disabled" |
حالة الإدراج. لا تستبعد الصف إلا عندما يجب ألّا يظهر مطلقًا. |
statusReason |
string |
سبب اختياري يُعرض مع الحالة غير المتاحة. |
replaces |
string[] |
معرّفات نماذج محلية أقدم لدى المزوّد يحل هذا النموذج محلها. |
replacedBy |
string |
معرّف النموذج المحلي البديل لدى المزوّد للصفوف المهملة. |
tags |
string[] |
وسوم مستقرة تستخدمها أدوات الاختيار والمرشّحات. |
حقول الاستبعاد:
| الحقل | النوع | معناه |
|---|---|---|
provider |
string |
معرّف المزوّد للصف الوارد المراد استبعاده. يجب أن يملكه هذا الـ Plugin أو أن يكون مُعلنًا بوصفه اسمًا بديلًا مملوكًا. |
model |
string |
معرّف النموذج المحلي لدى المزوّد المراد استبعاده. |
reason |
string |
رسالة اختيارية تُعرض عند طلب الصف المستبعد مباشرةً. |
when.baseUrlHosts |
string[] |
قائمة اختيارية بمضيفي عنوان URL الأساسي الفعّال للمزوّد، وهي مطلوبة قبل تطبيق الاستبعاد. |
when.providerConfigApiIn |
string[] |
قائمة اختيارية بقيم api الدقيقة في إعداد المزوّد، وهي مطلوبة قبل تطبيق الاستبعاد. |
لا تضع بيانات خاصة بوقت التشغيل في modelCatalog. استخدم static فقط عندما تكون صفوف البيان مكتملة بما يكفي لتمكين القوائم المُرشَّحة حسب المزوّد وواجهات الاختيار من تخطّي اكتشاف السجل/وقت التشغيل. استخدم refreshable عندما تكون صفوف البيان بذورًا أو إضافات مفيدة قابلة للإدراج، لكن يمكن لعملية تحديث/ذاكرة تخزين مؤقت إضافة المزيد من الصفوف لاحقًا؛ ولا تكون الصفوف القابلة للتحديث مرجعية بمفردها. استخدم runtime عندما يجب على OpenClaw تحميل وقت تشغيل المزوّد لمعرفة القائمة.
مرجع modelIdNormalization
استخدم modelIdNormalization لتنظيف معرّفات النماذج المملوكة للمزوّد بتكلفة منخفضة، على أن يحدث ذلك قبل تحميل وقت تشغيل المزوّد. يؤدي هذا إلى إبقاء الأسماء البديلة، مثل أسماء النماذج القصيرة ومعرّفات النماذج المحلية القديمة لدى المزوّد وقواعد بادئات الوكيل، في بيان الـ Plugin المالك بدلًا من جداول اختيار النماذج الأساسية.
{ "providers": ["anthropic", "openrouter"], "modelIdNormalization": { "providers": { "anthropic": { "aliases": { "sonnet-4.6": "claude-sonnet-4-6" } }, "openrouter": { "prefixWhenBare": "openrouter" } } }}حقول المزوّد:
| الحقل | النوع | معناه |
|---|---|---|
aliases |
Record<string,string> |
أسماء بديلة دقيقة لمعرّفات النماذج غير حساسة لحالة الأحرف. تُعاد القيم كما كُتبت. |
stripPrefixes |
string[] |
بادئات تُزال قبل البحث عن الاسم البديل، وهي مفيدة لازدواجية المزوّد/النموذج القديمة. |
prefixWhenBare |
string |
بادئة تُضاف عندما لا يحتوي معرّف النموذج المُطبَّع بالفعل على /. |
prefixWhenBareAfterAliasStartsWith |
object[] |
قواعد شرطية لإضافة بادئة إلى المعرّف المجرّد بعد البحث عن الاسم البديل، ومفاتيحها modelPrefix وprefix. |
مرجع providerEndpoints
استخدم providerEndpoints لتصنيف نقاط النهاية الذي يجب أن تعرفه سياسة الطلبات العامة قبل تحميل وقت تشغيل المزوّد. تظل النواة مالكة لمعنى كل endpointClass؛ بينما تملك بيانات الـ Plugin الوصفية للمضيف وعنوان URL الأساسي.
تُستبعد Plugins المزوّدين الخارجية رسميًا من توزيعة النواة، ولذلك تظل بياناتها غير مرئية حتى تثبيتها. يجب أيضًا نسخ providerEndpoints الخاصة بها في scripts/lib/official-external-provider-catalog.json حتى يستمر تصنيف نقاط النهاية في العمل دون الـ Plugin؛ ويفرض اختبار عقد هذا التطابق.
حقول نقطة النهاية:
| الحقل | النوع | ما يعنيه |
|---|---|---|
endpointClass |
string |
فئة معروفة لنقطة نهاية أساسية، مثل openrouter أو moonshot-native أو google-vertex. |
hosts |
string[] |
أسماء المضيفين الدقيقة التي ترتبط بفئة نقطة النهاية. |
hostSuffixes |
string[] |
لواحق المضيفين التي ترتبط بفئة نقطة النهاية. ابدأ بـ . للمطابقة مع لاحقة النطاق فقط. |
baseUrls |
string[] |
عناوين URL الأساسية الدقيقة والمطبّعة لبروتوكول HTTP(S) التي ترتبط بفئة نقطة النهاية. |
googleVertexRegion |
string |
منطقة Google Vertex الثابتة للمضيفين العموميين المطابقين تمامًا. |
googleVertexRegionHostSuffix |
string |
اللاحقة التي تُحذف من المضيفين المطابقين لإظهار بادئة منطقة Google Vertex. |
مرجع providerRequest
استخدم providerRequest لبيانات تعريف توافق الطلبات منخفضة التكلفة التي تحتاج إليها سياسة الطلبات العامة دون تحميل وقت تشغيل المزوّد. أبقِ إعادة كتابة الحمولة الخاصة بالسلوك ضمن خطافات وقت تشغيل المزوّد أو المساعدات المشتركة لعائلة المزوّدين.
{ "providerRequest": { "providers": { "vllm": { "family": "vllm", "openAICompletions": { "supportsStreamingUsage": true } } } }}حقول المزوّد:
| الحقل | النوع | ما يعنيه |
|---|---|---|
family |
string |
تسمية عائلة المزوّد المستخدمة في قرارات توافق الطلبات العامة وعمليات التشخيص. |
compatibilityFamily |
"moonshot" |
مجموعة توافق اختيارية لعائلة المزوّد لاستخدامها في مساعدات الطلبات المشتركة. |
openAICompletions |
object |
علامات طلبات الإكمال المتوافقة مع OpenAI، وهي حاليًا supportsStreamingUsage. |
مرجع secretProviderIntegrations
استخدم secretProviderIntegrations عندما يتمكن Plugin من نشر إعداد مسبق قابل لإعادة الاستخدام لمزوّد تنفيذ SecretRef. يقرأ OpenClaw بيانات التعريف هذه قبل تحميل وقت تشغيل Plugin، ويخزّن ملكية Plugin في secrets.providers.<alias>.pluginIntegration، ويترك الحل الفعلي للأسرار لوقت تشغيل SecretRef. لا تُعرض الإعدادات المسبقة إلا لإضافات Plugins المضمّنة وإضافات Plugins المثبّتة والمكتشفة من جذور تثبيت Plugins المُدارة، مثل عمليات التثبيت من git وClawHub.
{ "secretProviderIntegrations": { "secret-store": { "providerAlias": "team-secrets", "displayName": "Team secrets", "source": "exec", "command": "${node}", "args": ["./bin/resolve-secrets.mjs"] } }}مفتاح الخريطة هو معرّف التكامل. إذا حُذف providerAlias، يستخدم OpenClaw معرّف التكامل اسمًا مستعارًا لمزوّد SecretRef. يجب أن تتطابق الأسماء المستعارة للمزوّدين مع نمط الاسم المستعار المعتاد لمزوّد SecretRef، مثل team-secrets أو onepassword-work.
عندما يختار المشغّل الإعداد المسبق، يكتب OpenClaw مرجع مزوّد مثل:
{ "secrets": { "providers": { "team-secrets": { "source": "exec", "pluginIntegration": { "pluginId": "acme-secrets", "integrationId": "secret-store" } } } }}عند بدء التشغيل أو إعادة التحميل، يحلّ OpenClaw هذا المزوّد عبر تحميل بيانات تعريف بيان Plugin الحالية، والتحقق من أن Plugin المالك مثبّت ونشط، وإنشاء أمر التنفيذ من البيان. يؤدي تعطيل Plugin أو إزالته إلى إبطال المزوّد لمراجع SecretRefs النشطة. ولا يزال بإمكان المشغّلين الذين يريدون إعداد تنفيذ مستقل كتابة مزوّدات command/args اليدوية مباشرةً.
لا تُدعم حاليًا سوى الإعدادات المسبقة ذات source: "exec". يجب أن تكون قيمة command هي ${node}، ويجب أن تكون args[0] نصًا برمجيًا للحل يبدأ بـ ./ ويكون مساره نسبيًا إلى جذر Plugin. ينشئه OpenClaw عند بدء التشغيل أو إعادة التحميل باستخدام ملف Node التنفيذي الحالي والمسار المطلق للنص البرمجي داخل Plugin. خيارات Node مثل --require و--import و--loader و--env-file و--eval و--print ليست جزءًا من عقد الإعداد المسبق للبيان. ويمكن للمشغّلين الذين يحتاجون إلى أوامر غير Node إعداد مزوّدات تنفيذ يدوية مستقلة مباشرةً.
يشتق OpenClaw قيمة trustedDirs للإعدادات المسبقة للبيان من جذر Plugin، وبالنسبة إلى إعدادات ${node} المسبقة، من دليل ملف Node التنفيذي الحالي. تُتجاهل قيم trustedDirs المؤلّفة داخل البيان. تمر خيارات مزوّد التنفيذ الأخرى، مثل timeoutMs وnoOutputTimeoutMs وmaxOutputBytes وjsonOnly وenv وpassEnv وallowInsecurePath، إلى إعداد مزوّد تنفيذ SecretRef المعتاد.
مرجع modelPricing
استخدم modelPricing عندما يحتاج المزوّد إلى سلوك تسعير في مستوى التحكم قبل تحميل وقت التشغيل. تقرأ ذاكرة Gateway المؤقتة للتسعير بيانات التعريف هذه دون استيراد شيفرة وقت تشغيل المزوّد.
{ "providers": ["ollama", "openrouter"], "modelPricing": { "providers": { "ollama": { "external": false }, "openrouter": { "openRouter": { "passthroughProviderModel": true }, "liteLLM": false } } }}حقول المزوّد:
| الحقل | النوع | ما يعنيه |
|---|---|---|
external |
boolean |
اضبطه على false للمزوّدين المحليين أو المستضافين ذاتيًا الذين يجب ألا يجلبوا أبدًا أسعار OpenRouter أو LiteLLM. |
openRouter |
false | object |
تعيين البحث عن أسعار OpenRouter. تؤدي false إلى تعطيل البحث في OpenRouter لهذا المزوّد. |
liteLLM |
false | object |
تعيين البحث عن أسعار LiteLLM. تؤدي false إلى تعطيل البحث في LiteLLM لهذا المزوّد. |
حقول المصدر:
| الحقل | النوع | ما يعنيه |
|---|---|---|
provider |
string |
معرّف مزوّد الكتالوج الخارجي عندما يختلف عن معرّف مزوّد OpenClaw، مثل z-ai لمزوّد zai. |
passthroughProviderModel |
boolean |
معاملة معرّفات النماذج التي تحتوي على شرطة مائلة كمراجع متداخلة للمزوّد/النموذج، وهو أمر مفيد للمزوّدين الوكلاء مثل OpenRouter. |
modelIdTransforms |
"version-dots"[] |
متغيرات إضافية لمعرّف نموذج الكتالوج الخارجي. تجرّب version-dots معرّفات الإصدارات المنقّطة مثل claude-opus-4.6. |
فهرس مزوّدي OpenClaw
فهرس مزوّدي OpenClaw هو بيانات تعريف معاينة مملوكة لـ OpenClaw للمزوّدين الذين قد لا تكون Plugins الخاصة بهم مثبّتة بعد. وهو ليس جزءًا من بيان Plugin. تظل بيانات Plugins هي المرجع المعتمد لإضافات Plugins المثبّتة. يمثّل فهرس المزوّدين عقد الرجوع الداخلي الذي ستستهلكه مستقبلًا واجهات المزوّدين القابلين للتثبيت ومنتقي النماذج قبل التثبيت عندما لا يكون Plugin الخاص بالمزوّد مثبّتًا.
ترتيب مرجعية الكتالوج:
- إعداد المستخدم.
modelCatalogفي بيان Plugin المثبّت.- ذاكرة كتالوج النماذج المؤقتة الناتجة عن تحديث صريح.
- صفوف المعاينة في فهرس مزوّدي OpenClaw.
يجب ألا يحتوي فهرس المزوّدين على أسرار أو حالة التفعيل أو خطافات وقت التشغيل أو بيانات نماذج حية خاصة بحساب معيّن. تستخدم كتالوجات المعاينة فيه بنية صف مزوّد modelCatalog نفسها المستخدمة في بيانات Plugins، لكن ينبغي أن تظل مقتصرة على بيانات العرض الوصفية المستقرة، ما لم تُحاذَ عمدًا حقول مهايئ وقت التشغيل، مثل api أو baseUrl أو التسعير أو علامات التوافق، مع بيان Plugin المثبّت. ينبغي للمزوّدين الذين يدعمون الاكتشاف الحي عبر /models كتابة الصفوف المحدّثة من خلال مسار ذاكرة كتالوج النماذج المؤقتة الصريح بدلًا من جعل عمليات العرض المعتادة أو الإعداد الأولي تستدعي واجهات API الخاصة بالمزوّد.
يمكن أيضًا لمدخلات فهرس المزوّدين حمل بيانات تعريف Plugin قابل للتثبيت للمزوّدين الذين نُقل Plugin الخاص بهم خارج النواة أو لم يُثبّت بعد لسبب آخر. تعكس بيانات التعريف هذه نمط كتالوج القنوات: يكفي اسم الحزمة، ومواصفة تثبيت npm، والتكامل المتوقع، وتسميات خيارات المصادقة منخفضة التكلفة لعرض خيار إعداد قابل للتثبيت. بمجرد تثبيت Plugin، تكون الأولوية لبيانه ويُتجاهل إدخال فهرس المزوّدين لذلك المزوّد.
ينقل openclaw doctor --fix مجموعة صغيرة ومغلقة من مفاتيح إمكانات البيان العليا القديمة إلى contracts.*: وهي speechProviders وmediaUnderstandingProviders وimageGenerationProviders وtools. لم يعد أي من هذه المفاتيح، ولا أي قائمة إمكانات أخرى، يُقرأ كحقل علوي في البيان؛ ولا يتعرّف تحميل البيان المعتاد عليها إلا ضمن contracts.
البيان مقارنةً بـ package.json
يؤدي الملفان وظيفتين مختلفتين:
| الملف | يُستخدم من أجل |
|---|---|
openclaw.plugin.json |
الاكتشاف، والتحقق من صحة الإعداد، وبيانات تعريف خيارات المصادقة، وتلميحات واجهة المستخدم التي يجب أن تتوفر قبل تشغيل شيفرة Plugin |
package.json |
بيانات تعريف npm، وتثبيت التبعيات، وكتلة openclaw المستخدمة لنقاط الدخول أو تقييد التثبيت أو الإعداد أو بيانات تعريف الكتالوج |
إذا لم تكن متأكدًا من موضع جزء من بيانات التعريف، فاستخدم هذه القاعدة:
- إذا كان يجب على OpenClaw معرفته قبل تحميل شيفرة Plugin، فضعه في
openclaw.plugin.json - إذا كان متعلقًا بالتغليف أو ملفات الدخول أو سلوك تثبيت npm، فضعه في
package.json
حقول package.json التي تؤثر في الاكتشاف
توجد بعض بيانات تعريف Plugin السابقة لوقت التشغيل عمدًا في package.json ضمن كتلة openclaw بدلًا من openclaw.plugin.json. لا يُعد openclaw.bundle وopenclaw.bundle.json من عقود Plugin الخاصة بـ OpenClaw؛ ويجب على Plugins الأصلية استخدام openclaw.plugin.json إلى جانب حقول package.json#openclaw المدعومة أدناه.
أمثلة مهمة:
| الحقل | ما يعنيه |
|---|---|
openclaw.extensions |
يعلن نقاط دخول Plugin الأصلية. يجب أن تبقى داخل دليل حزمة Plugin. |
openclaw.runtimeExtensions |
يعلن نقاط دخول وقت تشغيل JavaScript المبنية للحزم المثبّتة. يجب أن تبقى داخل دليل حزمة Plugin. |
openclaw.setupEntry |
نقطة دخول خفيفة مخصّصة للإعداد فقط، تُستخدم أثناء التهيئة وبدء تشغيل القناة المؤجّل واكتشاف حالة القناة للقراءة فقط/SecretRef. يجب أن تبقى داخل دليل حزمة Plugin. |
openclaw.runtimeSetupEntry |
يعلن نقطة دخول إعداد JavaScript المبنية للحزم المثبّتة. يتطلب setupEntry، ويجب أن يكون موجودًا وأن يبقى داخل دليل حزمة Plugin. |
openclaw.channel |
بيانات وصفية منخفضة التكلفة لفهرس القنوات، مثل التسميات ومسارات الوثائق والأسماء البديلة ونص الاختيار. |
openclaw.channel.commands |
بيانات وصفية ثابتة للأوامر الأصلية والإعدادات الافتراضية التلقائية للمهارات الأصلية، تستخدمها واجهات الإعداد والتدقيق وقائمة الأوامر قبل تحميل وقت تشغيل القناة. |
openclaw.channel.configuredState |
بيانات وصفية خفيفة لأداة فحص حالة الإعداد يمكنها الإجابة عن السؤال «هل يوجد بالفعل إعداد يعتمد على متغيرات البيئة فقط؟» من دون تحميل وقت تشغيل القناة الكامل. |
openclaw.channel.persistedAuthState |
بيانات وصفية خفيفة لأداة فحص المصادقة المحفوظة يمكنها الإجابة عن السؤال «هل سُجّل الدخول إلى أي شيء بالفعل؟» من دون تحميل وقت تشغيل القناة الكامل. |
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath |
تلميحات التثبيت/التحديث لملحقات Plugin المضمّنة والمنشورة خارجيًا. |
openclaw.install.defaultChoice |
مسار التثبيت المفضّل عند توفر عدة مصادر للتثبيت. |
openclaw.install.minHostVersion |
أدنى إصدار مضيف مدعوم من OpenClaw، باستخدام حد أدنى وفق الإصدار الدلالي مثل >=2026.3.22 أو >=2026.5.1-beta.1. |
openclaw.compat.pluginApi |
أدنى نطاق مطلوب لواجهة برمجة تطبيقات Plugin في OpenClaw لهذه الحزمة، باستخدام حد أدنى وفق الإصدار الدلالي مثل >=2026.5.27. |
openclaw.install.expectedIntegrity |
سلسلة تكامل توزيعة npm المتوقعة مثل sha512-...؛ تتحقق مسارات التثبيت والتحديث من العنصر المُجلَب بمقارنتها بها. |
openclaw.install.allowInvalidConfigRecovery |
يسمح بمسار ضيق لاسترداد إعادة تثبيت Plugin مضمّن عندما يكون الإعداد غير صالح. |
openclaw.install.requiredPlatformPackages |
أسماء بديلة لحزم npm يجب أن تصبح متاحة عندما تطابق قيود المنصة في ملف القفل المضيف الحالي. |
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen |
يتيح تحميل واجهات قناة وقت تشغيل الإعداد قبل بدء الاستماع، ثم يؤجل Plugin القناة المُعدّ بالكامل حتى التنشيط بعد بدء الاستماع. |
تحدد البيانات الوصفية للبيان خيارات المزوّد/القناة/الإعداد التي تظهر في التهيئة قبل تحميل وقت التشغيل. يوضح package.json#openclaw.install للتهيئة كيفية جلب Plugin أو تمكينه عندما يختار المستخدم أحد هذه الخيارات. لا تنقل تلميحات التثبيت إلى openclaw.plugin.json.
يُفرض openclaw.install.minHostVersion أثناء التثبيت وتحميل سجل البيانات الوصفية لمصادر Plugin غير المضمّنة. تُرفض القيم غير الصالحة؛ أما القيم الأحدث ولكن الصالحة فتؤدي إلى تخطي ملحقات Plugin الخارجية على المضيفات الأقدم. يُفترض أن ملحقات Plugin المصدرية المضمّنة لها الإصدار نفسه لنسخة عمل المضيف.
يُستخدم openclaw.install.requiredPlatformPackages لحزم npm التي توفر ملفات ثنائية أصلية مطلوبة من خلال أسماء بديلة اختيارية خاصة بالمنصة. أدرج اسم حزمة npm المجرّد لكل اسم بديل لمنصة مدعومة. أثناء تثبيت npm، يتحقق OpenClaw فقط من الاسم البديل المعلن الذي تطابق قيود ملف القفل الخاصة به المضيف الحالي. إذا أبلغ npm عن النجاح لكنه أغفل ذلك الاسم البديل، يعيد OpenClaw المحاولة مرة واحدة باستخدام ذاكرة تخزين مؤقت جديدة، ويتراجع عن التثبيت إذا ظل الاسم البديل مفقودًا.
يُفرض openclaw.compat.pluginApi أثناء تثبيت الحزم لمصادر Plugin غير المضمّنة. استخدمه لتحديد الحد الأدنى لواجهة برمجة تطبيقات SDK/وقت تشغيل Plugin في OpenClaw التي بُنيت الحزمة وفقها. يمكن أن يكون أكثر صرامة من minHostVersion عندما تحتاج حزمة Plugin إلى واجهة برمجة تطبيقات أحدث مع احتفاظها بتلميح تثبيت أدنى لمسارات أخرى. ترفع مزامنة إصدارات OpenClaw الرسمية افتراضيًا الحدود الدنيا الحالية لواجهات برمجة تطبيقات Plugin الرسمية إلى إصدار OpenClaw، لكن الإصدارات الخاصة بملحقات Plugin وحدها يمكنها الاحتفاظ بحد أدنى أقل عندما تدعم الحزمة عمدًا مضيفات أقدم. لا تستخدم إصدار الحزمة وحده بوصفه عقد التوافق. تظل peerDependencies.openclaw بيانات وصفية لحزمة npm؛ ويستخدم OpenClaw عقد openclaw.compat.pluginApi لاتخاذ قرارات توافق التثبيت.
يجب أن تستخدم البيانات الوصفية الرسمية للتثبيت عند الطلب clawhubSpec عندما يكون Plugin منشورًا على ClawHub؛ إذ تتعامل التهيئة معه بوصفه المصدر البعيد المفضّل وتسجّل معلومات عنصر ClawHub بعد التثبيت. يظل npmSpec مسار التوافق الاحتياطي للحزم التي لم تنتقل بعد إلى ClawHub.
يوجد بالفعل تثبيت إصدار npm الدقيق في npmSpec، مثل "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3". يجب أن تقرن إدخالات الفهرس الخارجي الرسمية المواصفات الدقيقة بـ expectedIntegrity لكي تفشل مسارات التحديث بشكل مغلق إذا لم يعد عنصر npm المُجلَب يطابق الإصدار المثبّت. تظل التهيئة التفاعلية تعرض مواصفات npm من السجلات الموثوقة، بما في ذلك أسماء الحزم المجرّدة ووسوم التوزيع، لأغراض التوافق. يمكن لتشخيصات الفهرس التمييز بين المصادر الدقيقة والعائمة والمثبّتة بالتكامل والمفتقدة للتكامل وغير المتطابقة في اسم الحزمة وغير الصالحة في الاختيار الافتراضي. كما تحذّر عندما يكون expectedIntegrity موجودًا من دون مصدر npm صالح يمكن تثبيته عليه. عند وجود expectedIntegrity، تفرضه مسارات التثبيت/التحديث؛ وعند حذفه، يُسجّل تحليل السجل من دون تثبيت للتكامل.
يجب أن توفر ملحقات Plugin الخاصة بالقنوات openclaw.setupEntry عندما تحتاج عمليات فحص الحالة أو قائمة القنوات أو SecretRef إلى تحديد الحسابات المُعدّة من دون تحميل وقت التشغيل الكامل. ينبغي أن تعرض نقطة دخول الإعداد البيانات الوصفية للقناة، إلى جانب محوّلات الإعداد والحالة والأسرار الآمنة للإعداد؛ وأبقِ عملاء الشبكة ومستمعي Gateway وأوقات تشغيل النقل في نقطة دخول الامتداد الرئيسية.
لا تتجاوز حقول نقاط دخول وقت التشغيل فحوص حدود الحزمة لحقول نقاط دخول المصدر. على سبيل المثال، لا يمكن لـ openclaw.runtimeExtensions جعل مسار openclaw.extensions الخارج من الحزمة قابلاً للتحميل.
نطاق openclaw.install.allowInvalidConfigRecovery ضيق عن قصد. فهو لا يجعل الإعدادات المعطّلة عشوائيًا قابلة للتثبيت. حاليًا، يسمح فقط لمسارات التثبيت بالتعافي من حالات فشل محددة وقديمة في ترقية Plugin مضمّن، مثل غياب مسار Plugin مضمّن أو وجود إدخال قديم channels.<id> لذلك Plugin المضمّن نفسه. تظل أخطاء الإعداد غير المرتبطة تمنع التثبيت وتوجّه المشغّلين إلى openclaw doctor --fix.
يمثل openclaw.channel.persistedAuthState بيانات وصفية للحزمة لوحدة فحص صغيرة:
{ "openclaw": { "channel": { "id": "whatsapp", "persistedAuthState": { "specifier": "./auth-presence", "exportName": "hasAnyWhatsAppAuth" } } }}استخدمه عندما تحتاج مسارات الإعداد أو الفحص أو الحالة أو التحقق من الوجود للقراءة فقط إلى اختبار مصادقة منخفض التكلفة بنعم/لا قبل تحميل Plugin القناة الكامل. حالة المصادقة المحفوظة ليست حالة قناة مُعدّة: لا تستخدم هذه البيانات الوصفية لتمكين ملحقات Plugin تلقائيًا أو إصلاح اعتماديات وقت التشغيل أو تحديد ما إذا كان ينبغي تحميل وقت تشغيل قناة. يجب أن يكون التصدير المستهدف دالة صغيرة تقرأ الحالة المحفوظة فقط؛ ولا تمرّره عبر ملف التصدير الجامع لوقت تشغيل القناة الكامل.
يتبع openclaw.channel.configuredState البنية نفسها لفحوص حالة الإعداد منخفضة التكلفة والمعتمدة على متغيرات البيئة فقط:
{ "openclaw": { "channel": { "id": "telegram", "configuredState": { "specifier": "./configured-state", "exportName": "hasTelegramConfiguredState" } } }}استخدمه عندما تستطيع القناة تحديد حالة الإعداد من متغيرات البيئة أو مدخلات صغيرة أخرى لا تعتمد على وقت التشغيل. إذا كان الفحص يحتاج إلى تحليل الإعداد الكامل أو وقت تشغيل القناة الحقيقي، فأبقِ ذلك المنطق في خطاف Plugin المسمى config.hasConfiguredState بدلًا من ذلك.
أسبقية الاكتشاف (معرّفات Plugin المكررة)
يكتشف OpenClaw ملحقات Plugin من ثلاثة جذور، تُفحص بهذا الترتيب: ملحقات Plugin المضمّنة التي تأتي مع OpenClaw، وجذر التثبيت العام (~/.openclaw/extensions)، وجذر مساحة العمل الحالية (<workspace>/.openclaw/extensions)، بالإضافة إلى أي إدخالات صريحة في plugins.load.paths.
إذا تشارك اكتشافان في id نفسه، فلا يُحتفظ إلا بالبيان ذي الأسبقية الأعلى؛ وتُسقط النسخ المكررة ذات الأسبقية الأدنى بدلًا من تحميلها بجانبه. ترتيب الأسبقية، من الأعلى إلى الأدنى:
- محدد عبر الإعداد — مسار مثبّت صراحةً في
plugins.entries.<id> - تثبيت عام يطابق سجل تثبيت متتبَّعًا — Plugin مثبّت عبر
openclaw plugin install/openclaw plugin updateيتعرّف عليه تتبع التثبيت في OpenClaw للمعرّف نفسه، حتى عندما يكون المعرّف تابعًا أيضًا لـ Plugin مضمّن - مضمّن — ملحقات Plugin التي تأتي مع OpenClaw
- مساحة العمل — ملحقات Plugin المكتشفة نسبةً إلى مساحة العمل الحالية
- أي مرشح مكتشف آخر
الآثار المترتبة:
- لن تحجب نسخة متفرعة أو قديمة من Plugin مضمّن موجودة دون تتبع في مساحة العمل أو الجذر العام النسخة المضمّنة.
- لتجاوز Plugin مضمّن، شغّل إما
openclaw plugin installلذلك المعرّف حتى يتفوق التثبيت العام المتتبَّع على النسخة المضمّنة، أو ثبّت مسارًا محددًا عبرplugins.entries.<id>حتى يفوز بأسبقية التحديد عبر الإعداد. - تُسجّل عمليات إسقاط النسخ المكررة لكي تتمكن تشخيصات Doctor وبدء التشغيل من الإشارة إلى النسخة المستبعدة.
- تُصاغ تجاوزات النسخ المكررة المحددة عبر الإعداد في التشخيصات بوصفها تجاوزات صريحة، لكنها تظل تُصدر تحذيرًا لكي تبقى النسخ المتفرعة القديمة وحالات الحجب العرضية ظاهرة.
متطلبات مخطط JSON
- يجب أن يوفّر كل Plugin مخطط JSON Schema، حتى إذا كان لا يقبل أي إعدادات.
- يُقبل مخطط فارغ (على سبيل المثال،
{ "type": "object", "additionalProperties": false }). - يجري التحقق من صحة المخططات عند قراءة الإعدادات أو كتابتها، وليس في وقت التشغيل.
- عند توسيع Plugin مضمّن أو إنشاء تفريع منه باستخدام مفاتيح إعدادات جديدة، حدّث
configSchemaفي ملفopenclaw.plugin.jsonالخاص بذلك Plugin في الوقت نفسه. مخططات Plugins المضمّنة صارمة، لذا ستُرفض إضافةplugins.entries.<id>.config.myNewKeyإلى إعدادات المستخدم من دون إضافةmyNewKeyإلىconfigSchema.propertiesقبل تحميل وقت تشغيل Plugin.
مثال على توسيع المخطط:
{ "configSchema": { "type": "object", "additionalProperties": false, "properties": { "myNewKey": { "type": "string" } } }}سلوك التحقق من الصحة
- تُعد مفاتيح
channels.*غير المعروفة أخطاء، ما لم يكن معرّف القناة معلنًا في بيان Plugin. إذا ظهر المعرّف نفسه أيضًا فيplugins.allowأوplugins.entriesأوplugins.installs(أي Plugin مشار إليه لكن لا يمكن اكتشافه حاليًا)، فإن OpenClaw يخفض مستوى ذلك إلى تحذير بدلًا من ذلك. - تُعد الإشارات إلى معرّفات Plugins غير معروفة في
plugins.entries.<id>وplugins.allowوplugins.denyتحذيرات ("يُتجاهل إدخال إعدادات قديم") وليست أخطاء، كي لا تمنع الترقيات وPlugins المحذوفة أو المعاد تسميتها تشغيل Gateway. - تُعد إشارة
plugins.slots.memoryإلى معرّف Plugin غير معروف خطأً، باستثناء Plugin الخارجي الرسمي المعروفmemory-lancedb، إذ يصدر تحذيرًا بدلًا من ذلك. - إذا كان Plugin مثبّتًا لكن بيانه أو مخططه تالف أو مفقود، يفشل التحقق من الصحة ويبلغ Doctor عن خطأ Plugin.
- إذا كانت إعدادات Plugin موجودة لكن Plugin معطّل، فيُحتفظ بالإعدادات ويظهر تحذير في Doctor والسجلات.
راجع مرجع الإعدادات للاطلاع على مخطط plugins.* الكامل.
ملاحظات
- البيان مطلوب لPlugins الأصلية في OpenClaw، بما في ذلك التحميل من نظام الملفات المحلي. لا يزال وقت التشغيل يحمّل وحدة Plugin بشكل منفصل؛ فالبيان مخصص للاكتشاف والتحقق من الصحة فقط.
- تُحلّل البيانات الأصلية باستخدام JSON5، لذا تُقبل التعليقات والفواصل اللاحقة والمفاتيح غير الموضوعة بين علامتي اقتباس، ما دامت القيمة النهائية كائنًا.
- لا يقرأ محمّل البيان سوى حقول البيان الموثقة. تجنّب المفاتيح المخصصة في المستوى الأعلى.
- يمكن حذف
channelsوprovidersوcliBackendsوskillsجميعها عندما لا يحتاج إليها Plugin. - يجب أن يظل
providerCatalogEntryخفيفًا وألا يستورد شيفرة واسعة لوقت التشغيل؛ استخدمه لبيانات تعريف كتالوج المزوّد الثابتة أو واصفات الاكتشاف محدودة النطاق، وليس للتنفيذ وقت الطلب. - تُحدّد أنواع Plugins الحصرية عبر
plugins.slots.*: النوعkind: "memory"عبرplugins.slots.memory(الافتراضيmemory-core)، والنوعkind: "context-engine"عبرplugins.slots.contextEngine(الافتراضيlegacy). - أعلن نوع Plugin الحصري في هذا البيان. الخاصية
OpenClawPluginDefinition.kindفي نقطة دخول وقت التشغيل مهملة، ولا تبقى إلا كخيار احتياطي للتوافق مع Plugins الأقدم. - بيانات تعريف متغيرات البيئة (
setup.providers[].envVarsوproviderAuthEnvVarsالمهملة وchannelEnvVars) تصريحية فقط. لا تزال الحالة والتدقيق والتحقق من صحة تسليم Cron والأسطح الأخرى المخصصة للقراءة فقط تطبّق سياسة الثقة والتفعيل الفعلي الخاصة بالPlugin قبل اعتبار متغير بيئة مُعدًّا. - لبيانات تعريف معالج الإعداد في وقت التشغيل التي تتطلب شيفرة المزوّد، راجع خطافات وقت تشغيل المزوّد.
- إذا كان Plugin يعتمد على وحدات أصلية، فوثّق خطوات البناء وأي متطلبات لقائمة السماح الخاصة بمدير الحزم (على سبيل المثال،
allow-build-scriptsفي pnpm معpnpm rebuild <package>).