هل أنت جديد على Plugins في OpenClaw؟ اقرأ دليل البدء
أولًا للتعرّف على بنية الحزمة وإعداد البيان.
شرح تفصيلي
1
الحزمة والبيان
الخطوة 1: الحزمة والبيان
setup.providers[].envVars لـOpenClaw اكتشاف بيانات الاعتماد دون
تحميل وقت تشغيل الـPlugin. أضف providerAuthAliases عندما ينبغي لمتغير
من المزوّد إعادة استخدام مصادقة معرّف مزوّد آخر. الحقل modelSupport
اختياري ويتيح لـOpenClaw التحميل التلقائي لـPlugin المزوّد من معرّفات
النماذج المختصرة مثل acme-large قبل توفّر خطافات وقت التشغيل. يلزم وجود
openclaw.compat وopenclaw.build في package.json للنشر على ClawHub
(الحقلان المطلوبان هما openclaw.compat.pluginApi وopenclaw.build.openclawVersion؛
ويعود minGatewayVersion إلى openclaw.install.minHostVersion عند حذفه).2
تسجيل المزوّد
يحتاج مزوّد النصوص الأدنى إلى يمثّل استخدم ينبغي أن يبقى يعيد يمثّل
id وlabel وauth وcatalog.
يمثّل catalog خطاف وقت التشغيل/الإعدادات الذي يملكه المزوّد؛ ويمكنه استدعاء
واجهات API الحية للمورّد ويعيد إدخالات models.providers.index.ts
registerModelCatalogProvider سطح كتالوج مستوى التحكّم الأحدث
لواجهات مستخدم القوائم/المساعدة/الاختيار، ويغطي صفوف text وvoice
وimage_generation وvideo_generation وmusic_generation. احتفظ باستدعاءات
نقاط نهاية المورّد وتحويل الاستجابة داخل الـPlugin؛ إذ يمتلك OpenClaw
شكل الصف المشترك وتسميات المصادر وعرض المساعدة.هذا مزوّد عامل. يمكن للمستخدمين الآن تشغيل
openclaw onboard --acme-ai-api-key <key> واختيار
acme-ai/acme-large كنموذج لهم.الاكتشاف الحي للنماذج
إذا كان مزوّدك يوفّر واجهة API على نمط/models، فاحتفظ بنقطة النهاية الخاصة
بالمزوّد وإسقاط الصفوف داخل الـPlugin، واستخدم
openclaw/plugin-sdk/provider-catalog-live-runtime لدورة الجلب المشتركة.
يوفّر لك المساعد عمليات جلب HTTP محمية، وترويسات مصادقة المزوّد،
وأخطاء HTTP منظّمة، وتخزينًا مؤقتًا بمدة صلاحية، وسلوك رجوع ثابتًا دون
وضع سياسة المزوّد في نواة OpenClaw.استخدم buildLiveModelProviderConfig عندما تخبرك واجهة API الحية فقط
بصفوف الكتالوج الثابتة المملوكة للمزوّد والمتاحة حاليًا:index.ts
getCachedLiveProviderModelRows عندما تعيد واجهة API الخاصة بالمزوّد
بيانات وصفية أكثر ثراءً ويحتاج الـPlugin إلى إسقاط الصفوف بنفسه إلى تعريفات
نماذج OpenClaw:index.ts
run مشروطًا بالمصادقة وأن يعيد null عند عدم توفّر بيانات
اعتماد قابلة للاستخدام. احتفظ بـstaticRun غير متصل أو برجوع ثابت حتى لا
يعتمد الإعداد والتوثيق والاختبارات وواجهات الاختيار على الوصول الحي إلى
الشبكة. استخدم مدة صلاحية مناسبة لحداثة قائمة النماذج، وتجنّب استطلاع نظام
الملفات وقت الطلب، ولا تمرّر readRows / readModelId خاصين بالمزوّد إلا
عندما لا تكون استجابة المصدر بالشكل المتوافق مع OpenAI
{ data: [{ id, object }] }.إذا كان المزوّد المصدر يستخدم رموز تحكّم مختلفة عن OpenClaw، فأضف تحويلًا
نصيًا صغيرًا ثنائي الاتجاه بدلًا من استبدال مسار التدفق:input كتابة موجّه النظام النهائي ومحتوى الرسائل النصية قبل النقل.
ويعيد output كتابة أجزاء نص المساعد والنص النهائي قبل أن يحلّل OpenClaw
علامات التحكّم الخاصة به أو يسلّم المحتوى إلى القناة.بالنسبة إلى المزوّدين المضمّنين الذين يسجّلون مزوّد نصوص واحدًا فقط مع
مصادقة بمفتاح API ووقت تشغيل واحد مدعوم بالكتالوج، يُفضّل استخدام المساعد
الأضيق defineSingleProviderPluginEntry(...):buildProvider مسار الكتالوج المباشر المستخدم عندما يستطيع OpenClaw تحديد
مصادقة فعلية للموفّر. ويمكنه إجراء اكتشاف خاص بالموفّر. استخدم
buildStaticProvider فقط للصفوف غير المتصلة الآمن عرضها قبل تهيئة
المصادقة؛ ويجب ألا يتطلب بيانات اعتماد أو يجري طلبات شبكة.
يشغّل عرض models list --all في OpenClaw حاليًا الكتالوجات الثابتة
لملحقات الموفّرين المضمّنة فقط، مع إعداد فارغ وبيئة فارغة ومن دون
مسارات للوكيل أو مساحة العمل.إذا كان تدفق المصادقة لديك يحتاج أيضًا إلى تعديل models.providers.* والأسماء البديلة
والنموذج الافتراضي للوكيل أثناء الإعداد الأولي، فاستخدم مساعدات الإعداد المسبق من
openclaw/plugin-sdk/provider-onboard. أضيق المساعدات نطاقًا هي
createDefaultModelPresetAppliers(...)،
وcreateDefaultModelsPresetAppliers(...)،
وcreateModelCatalogPresetAppliers(...).عندما تدعم نقطة النهاية الأصلية للموفّر كتل الاستخدام المتدفقة عبر
نقل openai-completions المعتاد، فضّل مساعدات الكتالوج المشتركة في
openclaw/plugin-sdk/provider-catalog-shared بدلًا من الترميز الثابت
لعمليات التحقق من معرّف الموفّر. تكتشف supportsNativeStreamingUsageCompat(...)
وapplyProviderNativeStreamingUsageCompat(...) الدعم من
خريطة إمكانات نقطة النهاية، بحيث تظل نقاط النهاية الأصلية المشابهة لـ Moonshot/DashScope
قادرة على الاشتراك حتى عندما يستخدم Plugin معرّف موفّر مخصصًا.تغطي أمثلة الاكتشاف المباشر أعلاه واجهات API للموفّرين المشابهة لـ /models. أبقِ
هذا الاكتشاف داخل catalog.run، مع اشتراط وجود مصادقة صالحة للاستخدام، وأبقِ
staticRun خاليًا من استخدام الشبكة لإنشاء الكتالوج دون اتصال.3
إضافة تحديد ديناميكي للنموذج
إذا كان موفّرك يقبل معرّفات نماذج عشوائية (مثل وكيل أو موجّه)،
فأضف إذا كان التحديد يتطلب استدعاءً عبر الشبكة، فاستخدم
resolveDynamicModel:prepareDynamicModel للتهيئة
المسبقة غير المتزامنة؛ إذ يُشغّل resolveDynamicModel مرة أخرى بعد اكتمالها.4
إضافة خطافات وقت التشغيل (حسب الحاجة)
لا يحتاج معظم الموفّرين إلا إلى عائلات إعادة التشغيل المتاحة حاليًا:
catalog وresolveDynamicModel. أضف الخطافات
تدريجيًا وفقًا لاحتياجات موفّرك.تغطي أدوات بناء المساعدات المشتركة الآن عائلات توافق إعادة التشغيل/الأدوات الأكثر
شيوعًا، لذلك لا تحتاج Plugins عادةً إلى توصيل كل خطاف يدويًا واحدًا تلو الآخر:عائلات التدفق المتاحة حاليًا:
واجهات SDK التي تشغّل أدوات بناء العائلات
واجهات SDK التي تشغّل أدوات بناء العائلات
تتكون أداة بناء كل عائلة من مساعدات عامة منخفضة المستوى مُصدّرة من الحزمة نفسها، ويمكنك استخدامها عندما يحتاج الموفّر إلى الخروج عن النمط الشائع:
openclaw/plugin-sdk/provider-model-shared- ProviderReplayFamilyوbuildProviderReplayFamilyHooks(...)وأدوات بناء إعادة التشغيل الأولية (buildOpenAICompatibleReplayPolicy، وbuildAnthropicReplayPolicyForModel، وbuildGoogleGeminiReplayPolicy، وbuildHybridAnthropicOrOpenAIReplayPolicy). وتُصدّر أيضًا مساعدات إعادة تشغيل Gemini (sanitizeGoogleGeminiReplayHistory، وresolveTaggedReasoningOutputMode) ومساعدات نقطة النهاية/النموذج (resolveProviderEndpoint، وnormalizeProviderId، وnormalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream- ProviderStreamFamily، وbuildProviderStreamFamilyHooks(...)، وcomposeProviderStreamWrappers(...)، بالإضافة إلى أغلفة OpenAI/Codex المشتركة (createOpenAIAttributionHeadersWrapper، وcreateOpenAIFastModeWrapper، وcreateOpenAIServiceTierWrapper، وcreateOpenAIResponsesContextManagementWrapper، وcreateCodexNativeWebSearchWrapper)، وغلاف DeepSeek V4 المتوافق مع OpenAI (createDeepSeekV4OpenAICompatibleThinkingWrapper)، وتنظيف الملء المسبق للتفكير في رسائل Anthropic (createAnthropicThinkingPrefillPayloadWrapper)، وتوافق استدعاء الأدوات بالنص العادي (createPlainTextToolCallCompatWrapper)، وأغلفة الوكيل/الموفّر المشتركة (createOpenRouterWrapper، وcreateToolStreamWrapper، وcreateMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- أغلفة خفيفة للحمولات والأحداث لمسارات الموفّرين الساخنة، بما في ذلكcreateOpenAICompatibleCompletionsThinkingOffWrapper، وcreatePayloadPatchStreamWrapper، وcreatePlainTextToolCallCompatWrapper، وnormalizeOpenAICompatibleReasoningPayload(...)، وsetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools- ProviderToolCompatFamily، وbuildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")، ومساعدات مخطط الموفّر الأساسية.
native حتى يستهلك OpenClaw أجزاء الأفكار الأصلية دون إضافة
توجيهات المطالبة <think> / <final>. ويمكن للواجهات الخلفية النصية فقط
المشابهة لـ Gemini CLI، التي تحلّل استجابة JSON/نص نهائية، الاحتفاظ بعقد
google-gemini الموسوم المشترك.تظل بعض مساعدات التدفق محلية لدى الموفّر عن قصد. يحتفظ @openclaw/anthropic-provider بـ wrapAnthropicProviderStream، وresolveAnthropicBetas، وresolveAnthropicFastMode، وresolveAnthropicServiceTier، وأدوات بناء أغلفة Anthropic منخفضة المستوى ضمن واجهة api.ts / contract-api.ts العامة الخاصة به، لأنها ترمّز معالجة إصدار OAuth التجريبي لـ Claude وتقييد context1m. وبالمثل، يحتفظ Plugin xAI بتشكيل Responses الأصلي الخاص بـ xAI داخل wrapStreamFn الخاص به (الأسماء البديلة لـ /fast، وtool_stream الافتراضي، وتنظيف الأدوات الصارمة غير المدعومة، وإزالة حمولة الاستدلال الخاصة بـ xAI).يدعم نمط جذر الحزمة نفسه أيضًا @openclaw/openai-provider (أدوات بناء الموفّر، ومساعدات النموذج الافتراضي، وأدوات بناء موفّر الوقت الفعلي) و@openclaw/openrouter-provider (أداة بناء الموفّر بالإضافة إلى مساعدات الإعداد الأولي/الإعداد).- تبادل الرمز المميز
- ترويسات مخصصة
- هوية النقل الأصلية
- الاستخدام والفوترة
للموفّرين الذين يحتاجون إلى تبادل رمز مميز قبل كل استدعاء استدلال:
خطافات المزوّد الشائعة
خطافات المزوّد الشائعة
يستدعي OpenClaw الخطافات بهذا الترتيب تقريبًا في Plugins النماذج/المزوّدين.
يستخدم معظم المزوّدين خطافين أو ثلاثة فقط. هذه ليست واجهة
ProviderPlugin
الكاملة - راجع التفاصيل الداخلية: خطافات وقت تشغيل
المزوّد للاطلاع على
القائمة الكاملة والدقيقة حاليًا للخطافات وملاحظات الرجوع.
لا تُدرج هنا حقول المزوّد المخصصة للتوافق فقط التي لم يعد OpenClaw يستدعيها، مثل
ProviderPlugin.capabilities وsuppressBuiltInModel.ملاحظات الرجوع في وقت التشغيل:
- يحل
normalizeConfigPlugin مالكًا واحدًا لكل معرّف مزوّد (المزوّدون المضمّنون أولًا، ثم Plugin وقت التشغيل المطابق) ويستدعي ذلك الخطاف فقط - لا يوجد مسح عبر المزوّدين الآخرين. خطافnormalizeConfigالخاص بـ Google هو الذي يسوّي إدخالات إعدادgoogle/google-vertex/google-antigravity؛ وليس رجوعًا منفصلًا في النواة. - يستخدم
resolveConfigApiKeyخطاف المزوّد عند عرضه. يحتفظ Amazon Bedrock بحل علامات متغيرات بيئة AWS في Plugin المزوّد الخاص به؛ بينما تظل مصادقة وقت التشغيل نفسها تستخدم سلسلة AWS SDK الافتراضية عند إعدادها باستخدامauth: "aws-sdk". - يتلقى
resolveThinkingProfile(ctx)قيمproviderوmodelIdالمحددتين، وتلميح كتالوجreasoningالمدمج الاختياري، وحقائقcompatالاختيارية المدمجة للنموذج. استخدمcompatفقط لتحديد واجهة/ملف تعريف التفكير الخاص بالمزوّد. - يتيح
resolveSystemPromptContributionللمزوّد إدخال إرشادات لموجّه النظام تراعي ذاكرة التخزين المؤقت لعائلة نماذج. فضّله على خطافbefore_prompt_buildالقديم على مستوى Plugin بالكامل عندما يخص السلوك مزوّدًا/عائلة نماذج واحدة، ويجب أن يحافظ على الفصل المستقر/الديناميكي لذاكرة التخزين المؤقت.
5
إضافة إمكانات إضافية (اختياري)
الخطوة 5: إضافة إمكانات إضافية
يمكن لـ Plugin المزوّد تسجيل التضمينات، والكلام، والنسخ في الوقت الفعلي، والصوت في الوقت الفعلي، وفهم الوسائط، وتوليد الصور، وتوليد الفيديو، وجلب الويب، والبحث في الويب إلى جانب استدلال النص. يصنّف OpenClaw هذا على أنه Plugin ذا إمكانات هجينة - وهو النمط الموصى به لـ Plugins الشركات (Plugin واحد لكل مورّد). راجع التفاصيل الداخلية: ملكية الإمكانات.سجّل كل إمكانية داخلregister(api) إلى جانب استدعاء
api.registerProvider(...) الموجود لديك. اختر علامات التبويب التي تحتاج إليها فقط:- الكلام (تحويل النص إلى كلام)
- النسخ في الوقت الفعلي
- Realtime voice
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) لإخفاقات HTTP الخاصة بالمزوّد كي
تشترك Plugins في قراءات نص الخطأ المحدودة، وتحليل أخطاء JSON، ولواحق
معرّف الطلب.6
Test
الخطوة 6: الاختبار
src/provider.test.ts
النشر إلى ClawHub
تُنشر Plugins الخاصة بالموفّرين بالطريقة نفسها المتبعة لنشر أي Plugin شيفرة خارجي آخر:clawhub skill publish <path> أمرًا مختلفًا لنشر مجلد skill،
وليس حزمة Plugin؛ فلا تستخدمه هنا.
بنية الملفات
مرجع ترتيب الكتالوج
يتحكمcatalog.order في توقيت دمج كتالوجك مقارنةً بالموفّرين
المدمجين:
الخطوات التالية
- Plugins القنوات - إذا كان Plugin الخاص بك يوفّر قناة أيضًا
- وقت تشغيل SDK - أدوات
api.runtimeالمساعدة (تحويل النص إلى كلام، والبحث، والوكيل الفرعي) - نظرة عامة على SDK - مرجع كامل للاستيراد من المسارات الفرعية
- التفاصيل الداخلية للـ Plugin - تفاصيل الخطافات والأمثلة المضمّنة