Skip to main content
أنشئ Plugin لمزوّد لإضافة مزوّد نماذج (LLM) إلى OpenClaw: كتالوج نماذج، ومصادقة بمفتاح API، وحلّ ديناميكي للنماذج.
هل أنت جديد على Plugins في OpenClaw؟ اقرأ دليل البدء أولًا للتعرّف على بنية الحزمة وإعداد البيان.
تضيف Plugins المزوّدين نماذج إلى حلقة الاستدلال المعتادة في OpenClaw. إذا كان يجب تشغيل النموذج عبر برنامج خفي أصلي للوكيل يمتلك سلاسل المحادثات أو Compaction أو أحداث الأدوات، فاقرن المزوّد بـحاضنة وكيل بدلًا من وضع تفاصيل بروتوكول البرنامج الخفي في النواة.

شرح تفصيلي

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 عادةً إلى توصيل كل خطاف يدويًا واحدًا تلو الآخر:
عائلات إعادة التشغيل المتاحة حاليًا:عائلات التدفق المتاحة حاليًا:
تتكون أداة بناء كل عائلة من مساعدات عامة منخفضة المستوى مُصدّرة من الحزمة نفسها، ويمكنك استخدامها عندما يحتاج الموفّر إلى الخروج عن النمط الشائع:
  • 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")، ومساعدات مخطط الموفّر الأساسية.
بالنسبة إلى موفّري عائلة Gemini، حافظ على توافق وضع خرج الاستدلال مع وسيلة النقل. يجب أن يستخدم موفّرو Google Gemini API المباشرون خرج استدلال 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.ملاحظات الرجوع في وقت التشغيل:
  • يحل normalizeConfig Plugin مالكًا واحدًا لكل معرّف مزوّد (المزوّدون المضمّنون أولًا، ثم 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(...) الموجود لديك. اختر علامات التبويب التي تحتاج إليها فقط:
استخدم assertOkOrThrowProviderError(...) لإخفاقات HTTP الخاصة بالمزوّد كي تشترك Plugins في قراءات نص الخطأ المحدودة، وتحليل أخطاء JSON، ولواحق معرّف الطلب.
6

Test

الخطوة 6: الاختبار

src/provider.test.ts

النشر إلى ClawHub

تُنشر Plugins الخاصة بالموفّرين بالطريقة نفسها المتبعة لنشر أي Plugin شيفرة خارجي آخر:
يُعد clawhub skill publish <path> أمرًا مختلفًا لنشر مجلد skill، وليس حزمة Plugin؛ فلا تستخدمه هنا.

بنية الملفات

مرجع ترتيب الكتالوج

يتحكم catalog.order في توقيت دمج كتالوجك مقارنةً بالموفّرين المدمجين:

الخطوات التالية

ذو صلة