إذا لم تبنِ أي OpenClaw Plugin من قبل، فاقرأ
بدء الاستخدام أولًا لمعرفة بنية الحزمة
الأساسية وإعداد البيان.
شرح تفصيلي
Package and manifest
الخطوة 1: الحزمة والبيان
setup.providers[].envVars حتى يتمكن OpenClaw من اكتشاف
بيانات الاعتماد دون تحميل وقت تشغيل Plugin. أضف providerAuthAliases
عندما ينبغي لمتغير موفّر أن يعيد استخدام مصادقة معرّف موفّر آخر. modelSupport
اختياري، ويتيح لـ OpenClaw تحميل Plugin الموفّر تلقائيًا من معرّفات نماذج
مختصرة مثل acme-large قبل وجود خطافات وقت التشغيل. إذا نشرت الموفّر
على ClawHub، فحقلا openclaw.compat وopenclaw.build مطلوبان
في package.json.Register the provider
يحتاج موفّر النصوص الأدنى إلى استخدم ينبغي أن يظل يعيد
id وlabel وauth وcatalog.
catalog هو خطاف وقت التشغيل/الإعدادات الذي يملكه الموفّر؛ ويمكنه استدعاء
واجهات API الحية للبائع وإرجاع إدخالات models.providers.index.ts
registerModelCatalogProvider هو سطح فهرس مستوى التحكم الأحدث
لواجهة مستخدم القائمة/المساعدة/المنتقي. استخدمه لصفوف النصوص، وتوليد الصور،
وتوليد الفيديو، وتوليد الموسيقى. أبقِ استدعاءات نقاط نهاية البائع وتخطيط
الاستجابات داخل 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 مهيكلة، وتخزينًا مؤقتًا بمدة TTL، وسلوك رجوع ثابتًا دون
وضع سياسة الموفّر في نواة OpenClaw.استخدم buildLiveModelProviderConfig عندما تخبرك API الحية فقط بأي صفوف
الفهرس الثابتة التي يملكها الموفّر والمتاحة حاليًا:index.ts
getCachedLiveProviderModelRows عندما تعيد API الخاصة بالموفّر
بيانات وصفية أغنى ويحتاج Plugin إلى إسقاط الصفوف إلى تعريفات نماذج
OpenClaw بنفسه:index.ts
run محكومًا بالمصادقة وأن يعيد null عندما لا تتوفر
بيانات اعتماد قابلة للاستخدام. أبقِ staticRun غير متصل أو رجوعًا ثابتًا
حتى لا تعتمد أسطح الإعداد، والوثائق، والاختبارات، والمنتقي على وصول حي
إلى الشبكة. استخدم TTL مناسبة لحداثة قائمة النماذج، وتجنب استطلاع نظام
الملفات وقت الطلب، ومرّر readRows / readModelId خاصًا بالموفّر فقط
عندما لا تكون استجابة المصدر بشكل متوافق مع OpenAI مثل
{ data: [{ id, object }] }.إذا كان الموفّر الأصلي يستخدم رموز تحكم مختلفة عن OpenClaw، فأضف تحويلًا
نصيًا صغيرًا ثنائي الاتجاه بدلًا من استبدال مسار البث:input كتابة مطالبة النظام النهائية ومحتوى الرسائل النصية قبل
النقل. يعيد output كتابة دلتا نص المساعد والنص النهائي قبل أن يحلل
OpenClaw علامات التحكم الخاصة به أو تسليم القناة.بالنسبة إلى الموفّرين المضمّنين الذين يسجلون موفّر نصوص واحدًا فقط مع
مصادقة مفتاح API إضافة إلى وقت تشغيل واحد مدعوم بالفهرس، فضّل المساعد
الأضيق defineSingleProviderPluginEntry(...):buildProvider هو مسار الكتالوج الحي المستخدم عندما يستطيع OpenClaw حلّ
مصادقة المزوّد الحقيقية. وقد ينفّذ اكتشافًا خاصًا بالمزوّد. استخدم
buildStaticProvider فقط للصفوف غير المتصلة الآمنة للعرض قبل تهيئة المصادقة؛
ويجب ألا يتطلب بيانات اعتماد أو يجري طلبات شبكة. عرض models list --all
في OpenClaw ينفّذ حاليًا الكتالوجات الثابتة فقط من أجل Plugins المزوّدين
المضمّنة، مع إعدادات فارغة، وبيئة فارغة، ودون مسارات وكيل/مساحة عمل.إذا كان تدفق المصادقة لديك يحتاج أيضًا إلى تصحيح 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 بلا شبكة لتوليد الكتالوج دون اتصال.Add dynamic model resolution
إذا كان مزوّدك يقبل معرّفات نماذج عشوائية (مثل وكيل وسيط أو موجّه)،
فأضف إذا كان الحل يتطلب استدعاء شبكة، فاستخدم
resolveDynamicModel:prepareDynamicModel للإحماء
غير المتزامن - إذ يعمل resolveDynamicModel مرة أخرى بعد اكتماله.Add runtime hooks (as needed)
لا يحتاج معظم المزوّدين إلا إلى عائلات إعادة التشغيل المتاحة اليوم:
عائلات البث المتاحة اليوم:
catalog + resolveDynamicModel. أضف الخطافات
تدريجيًا بحسب ما يتطلبه مزوّدك.تغطي بُناة المساعدات المشتركة الآن أكثر عائلات إعادة التشغيل/توافق الأدوات
شيوعًا، لذلك لا تحتاج Plugins عادةً إلى توصيل كل خطاف يدويًا واحدًا تلو الآخر:| العائلة | ما الذي تربطه | أمثلة مضمّنة |
|---|---|---|
openai-compatible | سياسة إعادة تشغيل مشتركة بأسلوب OpenAI للنواقل المتوافقة مع OpenAI، بما في ذلك تنظيف معرّف استدعاء الأداة، وإصلاحات ترتيب المساعد أولًا، والتحقق العام من أدوار Gemini حيث يحتاج الناقل إلى ذلك | moonshot, ollama, xai, zai |
anthropic-by-model | سياسة إعادة تشغيل واعية بـ Claude تُختار بواسطة modelId، بحيث لا تحصل نواقل رسائل Anthropic إلا على تنظيف كتل التفكير الخاص بـ Claude عندما يكون النموذج المحلول فعلًا معرّف Claude | amazon-bedrock, anthropic-vertex |
google-gemini | سياسة إعادة تشغيل Gemini الأصلية إضافة إلى تنظيف إعادة تشغيل التمهيد. تُبقي العائلة المشتركة Gemini CLI ذي مخرجات النص على الاستدلال الموسوم؛ ويتجاوز مزوّد google المباشر resolveReasoningOutputMode إلى native لأن تفكير Gemini API يصل كأجزاء تفكير أصلية. | google, google-gemini-cli |
passthrough-gemini | تنظيف توقيع التفكير في Gemini لنماذج Gemini العاملة عبر نواقل وكيل متوافقة مع OpenAI؛ ولا يفعّل تحقق إعادة تشغيل Gemini الأصلي أو إعادة كتابة التمهيد | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | سياسة هجينة للمزوّدين الذين يمزجون أسطح نماذج رسائل Anthropic والمتوافقة مع OpenAI في Plugin واحد؛ ويظل إسقاط كتل التفكير الاختياري الخاص بـ Claude محصورًا في جانب Anthropic | minimax |
| العائلة | ما الذي تربطه | أمثلة مضمّنة |
|---|---|---|
google-thinking | تطبيع حمولة تفكير Gemini على مسار البث المشترك | google, google-gemini-cli |
kilocode-thinking | غلاف استدلال Kilo على مسار بث الوكيل المشترك، مع تخطي kilo/auto ومعرّفات استدلال الوكيل غير المدعومة للتفكير المُحقن | kilocode |
moonshot-thinking | ربط حمولة التفكير الأصلي الثنائية في Moonshot من الإعداد + مستوى /think | moonshot |
minimax-fast-mode | إعادة كتابة نموذج الوضع السريع في MiniMax على مسار البث المشترك | minimax, minimax-portal |
openai-responses-defaults | أغلفة Responses الأصلية المشتركة لـ OpenAI/Codex: ترويسات الإسناد، و/fast/serviceTier، وإسهاب النص، وبحث الويب الأصلي في Codex، وتشكيل حمولة توافق الاستدلال، وإدارة سياق Responses | openai |
openrouter-thinking | غلاف استدلال OpenRouter لمسارات الوكيل، مع معالجة تخطيات النماذج غير المدعومة/auto مركزيًا | openrouter |
tool-stream-default-on | غلاف tool_stream مفعّل افتراضيًا للمزوّدين مثل Z.AI الذين يريدون بث الأدوات ما لم يُعطّل صراحةً | zai |
SDK seams powering the family builders
SDK seams powering the family builders
يتكوّن كل باني عائلة من مساعدات عامة أدنى مستوى مُصدّرة من الحزمة نفسها، ويمكنك استخدامها عندما يحتاج مزوّد إلى الخروج عن النمط الشائع:
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 لأنها ترمز معالجة Claude OAuth beta وحوكمة context1m. وبالمثل يحتفظ Plugin xAI بتشكيل Responses الأصلي الخاص بـ xAI في wrapStreamFn الخاص به (أسماء /fast المستعارة، وtool_stream الافتراضي، وتنظيف الأدوات الصارمة غير المدعومة، وإزالة حمولة الاستدلال الخاصة بـ xAI).يدعم نمط جذر الحزمة نفسه أيضًا @openclaw/openai-provider (بُناة المزوّدين، ومساعدات النموذج الافتراضي، وبُناة مزوّد الوقت الحقيقي) و@openclaw/openrouter-provider (باني المزوّد مع مساعدات الإعداد/التهيئة).- Token exchange
- Custom headers
- Native transport identity
- الاستخدام والفوترة
للمزوّدين الذين يحتاجون إلى تبادل رمز قبل كل استدعاء استدلال:
كل خطافات المزوّد المتاحة
كل خطافات المزوّد المتاحة
يستدعي OpenClaw الخطافات بهذا الترتيب. يستخدم معظم المزوّدين 2-3 فقط:
حقول المزوّد الخاصة بالتوافق فقط التي لم يعد OpenClaw يستدعيها، مثل
ملاحظات الرجوع في وقت التشغيل:
ProviderPlugin.capabilities وsuppressBuiltInModel، غير مدرجة
هنا.| # | الخطاف | متى يُستخدم |
|---|---|---|
| 1 | catalog | كتالوج النماذج أو إعدادات URL الأساسية الافتراضية |
| 2 | applyConfigDefaults | الإعدادات العامة الافتراضية المملوكة للمزوّد أثناء تجسيد الإعدادات |
| 3 | normalizeModelId | تنظيف أسماء نماذج قديمة/تجريبية قبل البحث |
| 4 | normalizeTransport | تنظيف api / baseUrl الخاص بعائلة المزوّد قبل تجميع النموذج العام |
| 5 | normalizeConfig | تطبيع إعدادات models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | إعادة كتابة توافق الاستخدام أثناء البث الأصلي لمزوّدي الإعدادات |
| 7 | resolveConfigApiKey | حل المصادقة بعلامات البيئة المملوك للمزوّد |
| 8 | resolveSyntheticAuth | مصادقة اصطناعية محلية/ذاتية الاستضافة أو مدعومة بالإعدادات |
| 9 | shouldDeferSyntheticProfileAuth | خفض أولوية العناصر النائبة الاصطناعية للملفات الشخصية المخزّنة خلف مصادقة البيئة/الإعدادات |
| 10 | resolveDynamicModel | قبول معرّفات نماذج عشوائية من المنبع |
| 11 | prepareDynamicModel | جلب بيانات وصفية غير متزامن قبل الحل |
| 12 | normalizeResolvedModel | إعادة كتابة النقل قبل المشغّل |
| 13 | normalizeToolSchemas | تنظيف مخططات الأدوات المملوك للمزوّد قبل التسجيل |
| 14 | inspectToolSchemas | تشخيصات مخططات الأدوات المملوكة للمزوّد |
| 15 | resolveReasoningOutputMode | عقد مخرجات الاستدلال الموسومة مقابل الأصلية |
| 16 | prepareExtraParams | معاملات الطلب الافتراضية |
| 17 | createStreamFn | نقل StreamFn مخصص بالكامل |
| 19 | wrapStreamFn | أغلفة رؤوس/نص مخصصة على مسار البث العادي |
| 20 | resolveTransportTurnState | رؤوس/بيانات وصفية أصلية لكل دورة |
| 21 | resolveWebSocketSessionPolicy | رؤوس جلسة WS أصلية وفترة تهدئة |
| 22 | formatApiKey | شكل رمز تشغيل مخصص |
| 23 | refreshOAuth | تحديث OAuth مخصص |
| 24 | buildAuthDoctorHint | إرشادات إصلاح المصادقة |
| 25 | matchesContextOverflowError | اكتشاف تجاوز السعة المملوك للمزوّد |
| 26 | classifyFailoverReason | تصنيف حدود المعدل/التحميل الزائد المملوك للمزوّد |
| 27 | isCacheTtlEligible | بوابة TTL لذاكرة التخزين المؤقت للموجّه |
| 28 | buildMissingAuthMessage | تلميح مخصص للمصادقة الناقصة |
| 29 | augmentModelCatalog | صفوف اصطناعية للتوافق المستقبلي |
| 30 | resolveThinkingProfile | مجموعة خيارات /think الخاصة بالنموذج |
| 31 | isBinaryThinking | توافق تشغيل/إيقاف التفكير الثنائي |
| 32 | supportsXHighThinking | توافق دعم الاستدلال xhigh |
| 33 | resolveDefaultThinkingLevel | توافق سياسة /think الافتراضية |
| 34 | isModernModelRef | مطابقة نماذج الاختبار الحي/الدخاني |
| 35 | prepareRuntimeAuth | تبادل الرموز قبل الاستدلال |
| 36 | resolveUsageAuth | تحليل مخصص لاعتماد الاستخدام |
| 37 | fetchUsageSnapshot | نقطة نهاية استخدام مخصصة |
| 38 | createEmbeddingProvider | محوّل تضمين مملوك للمزوّد للذاكرة/البحث |
| 39 | buildReplayPolicy | سياسة مخصصة لإعادة تشغيل/Compaction النص |
| 40 | sanitizeReplayHistory | إعادة كتابة إعادة التشغيل الخاصة بالمزوّد بعد التنظيف العام |
| 41 | validateReplayTurns | تحقق صارم من دورات إعادة التشغيل قبل المشغّل المضمن |
| 42 | onModelSelected | رد نداء بعد الاختيار (مثل القياسات عن بُعد) |
- يتحقق
normalizeConfigمن المزوّد المطابق أولًا، ثم من Plugins المزوّدين الآخرين القادرين على الخطافات إلى أن يغيّر أحدهم الإعدادات فعليًا. إذا لم يُعد أي خطاف مزوّد كتابة إدخال إعدادات مدعوم من عائلة Google، يظل مطبّع إعدادات Google المضمّن مطبقًا. - يستخدم
resolveConfigApiKeyخطاف المزوّد عند كشفه. يحتفظ Amazon Bedrock بحل علامات بيئة AWS في Plugin المزوّد الخاص به؛ أما مصادقة وقت التشغيل نفسها فتظل تستخدم سلسلة AWS SDK الافتراضية عند إعدادها باستخدامauth: "aws-sdk". - يتلقى
resolveThinkingProfile(ctx)قيمةproviderالمحددة، وmodelId، وتلميح كتالوجreasoningالمدمج الاختياري، وحقائقcompatللنموذج المدمجة الاختيارية. استخدمcompatفقط لاختيار واجهة/ملف التفكير الخاص بالمزوّد. - يسمح
resolveSystemPromptContributionللمزوّد بحقن إرشادات موجه نظام واعية بذاكرة التخزين المؤقت لعائلة نموذج. فضّله علىbefore_prompt_buildعندما يكون السلوك تابعًا لمزوّد/عائلة نموذج واحد ويجب أن يحافظ على فصل ذاكرة التخزين المؤقت المستقر/الديناميكي.
إضافة قدرات إضافية (اختياري)
الخطوة 5: إضافة قدرات إضافية
يمكن لـ Plugin مزوّد تسجيل التضمينات، والكلام، والنسخ الفوري، والصوت الفوري، وفهم الوسائط، وتوليد الصور، وتوليد الفيديو، وجلب الويب، وبحث الويب إلى جانب استدلال النص. يصنّف OpenClaw هذا على أنه Plugin hybrid-capability - وهو النمط الموصى به لـ Plugins الشركات (Plugin واحد لكل بائع). راجع الداخليات: ملكية القدرات.سجّل كل قدرة داخلregister(api) إلى جانب استدعاء
api.registerProvider(...) الحالي. اختر علامات التبويب التي تحتاجها فقط:- الكلام (TTS)
- النسخ الفوري
- الصوت الفوري
- فهم الوسائط
- Embeddings
- توليد الصور والفيديو
- جلب الويب والبحث
assertOkOrThrowProviderError(...) لإخفاقات HTTP الخاصة بالمزوّد حتى
تشترك Plugins في قراءات نص الخطأ المحددة، وتحليل أخطاء JSON، ولواحق
معرّف الطلب.اختبار
الخطوة 6: الاختبار
src/provider.test.ts
النشر إلى ClawHub
تُنشر Plugins المزوّدين بالطريقة نفسها مثل أي Plugin كود خارجي آخر:clawhub package publish.
بنية الملفات
مرجع ترتيب الكتالوج
يتحكمcatalog.order في وقت دمج الكتالوج الخاص بك نسبةً إلى
المزوّدين المضمّنين:
| الترتيب | متى | حالة الاستخدام |
|---|---|---|
simple | المرور الأول | مزوّدو مفاتيح API البسيطة |
profile | بعد simple | مزوّدون مقيّدون بملفات تعريف المصادقة |
paired | بعد profile | إنشاء إدخالات متعددة مترابطة |
late | المرور الأخير | تجاوز المزوّدين الحاليين (يفوز عند التعارض) |
الخطوات التالية
- Channel Plugins - إذا كان Plugin الخاص بك يوفّر قناة أيضًا
- وقت تشغيل SDK - مساعدات
api.runtime(TTS، البحث، الوكيل الفرعي) - نظرة عامة على SDK - مرجع استيراد المسارات الفرعية الكامل
- داخليات Plugin - تفاصيل الخطافات والأمثلة المضمّنة