بناء Plugins القنوات
يشرح هذا الدليل كيفية بناء plugin قناة يربط OpenClaw بمنصة مراسلة. وفي النهاية سيكون لديك قناة عاملة تتضمن أمان الرسائل المباشرة، والاقتران، وسلاسل الردود، والمراسلة الصادرة.إذا لم تكن قد بنيت أي plugin لـ OpenClaw من قبل، فاقرأ
البدء أولًا للتعرف على بنية الحزمة
الأساسية وإعداد manifest.
كيف تعمل Plugins القنوات
لا تحتاج Plugins القنوات إلى أدوات send/edit/react خاصة بها. يحتفظ OpenClaw بأداةmessage مشتركة واحدة في النواة. أما plugin الخاص بك فيمتلك:
- الإعداد — تحليل الحسابات ومعالج الإعداد
- الأمان — سياسة الرسائل المباشرة وقوائم السماح
- الاقتران — تدفق الموافقة على الرسائل المباشرة
- قواعد الجلسة — كيفية ربط معرّفات المحادثة الخاصة بالموفّر بالدردشات الأساسية ومعرّفات السلاسل وبدائل الأصل
- الصادر — إرسال النص والوسائط والاستطلاعات إلى المنصة
- السلاسل — كيفية تنظيم الردود ضمن سلاسل
:thread:، والتوزيع.
إذا كانت منصتك تخزن نطاقًا إضافيًا داخل معرّفات المحادثات، فاحتفظ بهذا التحليل
داخل plugin باستخدام messaging.resolveSessionConversation(...). فهذه هي
الوصلة القياسية لربط rawId بمعرّف المحادثة الأساسي، ومعرّف سلسلة اختياري،
وقيمة baseConversationId صريحة، وأي parentConversationCandidates.
وعندما تعيد parentConversationCandidates، فاحرص على ترتيبها من
الأصل الأضيق إلى الأصل الأوسع/المحادثة الأساسية.
يمكن أيضًا لـ plugins المضمّنة التي تحتاج إلى التحليل نفسه قبل تشغيل سجل القنوات
أن تكشف ملفًا علويًا session-key-api.ts مع دالة
resolveSessionConversation(...) مطابقة في التصدير. وتستخدم النواة هذا السطح
الآمن في bootstrap فقط عندما لا يكون سجل plugins في وقت التشغيل متاحًا بعد.
لا تزال messaging.resolveParentConversationCandidates(...) متاحة كحل رجوع
قديم من أجل التوافق عندما يحتاج plugin فقط إلى بدائل الأصل فوق
المعرّف العام/الخام. وإذا وُجدت الوصلتان معًا، تستخدم النواة
resolveSessionConversation(...).parentConversationCandidates أولًا ولا تعود
إلى resolveParentConversationCandidates(...) إلا عندما تهملها الوصلة القياسية.
الموافقات وإمكانات القنوات
لا تحتاج معظم Plugins القنوات إلى شيفرة خاصة بالموافقات.- تمتلك النواة الأمر
/approveداخل الدردشة نفسها، وحمولات أزرار الموافقة المشتركة، وآليات التسليم العامة الاحتياطية. - فضّل كائن
approvalCapabilityواحدًا على plugin القناة عندما تحتاج القناة إلى سلوك خاص بالموافقة. - تُعد
approvalCapability.authorizeActorActionوapprovalCapability.getActionAvailabilityStateالوصلة القياسية لمصادقة الموافقة. - استخدم
outbound.shouldSuppressLocalPayloadPromptأوoutbound.beforeDeliverPayloadلسلوك دورة حياة الحمولة الخاص بالقناة، مثل إخفاء مطالبات الموافقة المحلية المكررة أو إرسال مؤشرات الكتابة قبل التسليم. - استخدم
approvalCapability.deliveryفقط للتوجيه الأصلي للموافقات أو منع التسليم الاحتياطي. - استخدم
approvalCapability.renderفقط عندما تحتاج القناة فعلًا إلى حمولات موافقة مخصصة بدلًا من العارض المشترك. - إذا كانت القناة تستطيع استنتاج هويات شبيهة بالمالك في الرسائل المباشرة من الإعداد الحالي، فاستخدم
createResolvedApproverActionAuthAdapterمنopenclaw/plugin-sdk/approval-runtimeلتقييد/approveداخل الدردشة نفسها من دون إضافة منطق خاص بالموافقة إلى النواة. - إذا احتاجت القناة إلى تسليم موافقة أصلي، فأبقِ شيفرة القناة مركزة على تسوية الهدف ووصلات النقل. واستخدم
createChannelExecApprovalProfileوcreateChannelNativeOriginTargetResolverوcreateChannelApproverDmTargetResolverوcreateApproverRestrictedNativeApprovalCapabilityوcreateChannelNativeApprovalRuntimeمنopenclaw/plugin-sdk/approval-runtimeحتى تمتلك النواة التصفية والتوجيه وإزالة التكرار وانتهاء الصلاحية والاشتراك في البوابة. - يجب على القنوات ذات الموافقات الأصلية تمرير كل من
accountIdوapprovalKindعبر هذه المساعدات. فـaccountIdيحافظ على نطاق سياسة الموافقات متعددة الحسابات على حساب البوت الصحيح، وapprovalKindيبقي سلوك موافقات exec مقابل plugin متاحًا للقناة من دون فروع ثابتة داخل النواة. - حافظ على نوع معرّف الموافقة المُسلَّم من البداية إلى النهاية. يجب ألا يقوم العملاء الأصليون بتخمين أو إعادة كتابة توجيه الموافقات exec مقابل plugin انطلاقًا من حالة محلية خاصة بالقناة.
- يمكن عمدًا لأنواع الموافقات المختلفة أن تكشف أسطحًا أصلية مختلفة.
ومن الأمثلة المضمّنة الحالية:
- يحتفظ Slack بالتوجيه الأصلي للموافقات متاحًا لكل من معرّفات exec وplugin.
- يحتفظ Matrix بالتوجيه الأصلي في الرسائل المباشرة/القنوات لموافقات exec فقط، ويترك
موافقات plugin على مسار
/approveالمشترك داخل الدردشة نفسها.
- لا يزال
createApproverRestrictedNativeApprovalAdapterموجودًا كغلاف للتوافق، لكن الشيفرة الجديدة يجب أن تفضّل باني الإمكانات وتكشفapprovalCapabilityعلى plugin.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtime
openclaw/plugin-sdk/setup-runtime,
وopenclaw/plugin-sdk/setup-adapter-runtime,
وopenclaw/plugin-sdk/reply-runtime,
وopenclaw/plugin-sdk/reply-dispatch-runtime,
وopenclaw/plugin-sdk/reply-reference، و
openclaw/plugin-sdk/reply-chunking عندما لا تحتاج إلى
السطح الأشمل.
وبالنسبة إلى الإعداد تحديدًا:
- يغطي
openclaw/plugin-sdk/setup-runtimeمساعدات الإعداد الآمنة وقت التشغيل: محولات patch الآمنة للاستيراد (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator)، ومخرجات ملاحظات البحث، وpromptResolvedAllowFrom، وsplitSetupEntries، وبناة setup-proxy المفوضة - يمثل
openclaw/plugin-sdk/setup-adapter-runtimeالوصلة الضيقة الواعية بالبيئة من أجلcreateEnvPatchedAccountSetupAdapter - يغطي
openclaw/plugin-sdk/channel-setupبناة الإعداد الخاصة بالتثبيت الاختياري بالإضافة إلى عدد قليل من العناصر الأولية الآمنة للإعداد:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabled, وsplitSetupEntries - استخدم الوصلة الأشمل
openclaw/plugin-sdk/setupفقط عندما تحتاج أيضًا إلى مساعدات إعداد/تهيئة مشتركة أثقل مثلmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). يفشل المحول/المعالج المولّد
بشكل مغلق على عمليات كتابة الإعداد والإنهاء النهائي، ويعيد استخدام رسالة
اشتراط التثبيت نفسها عبر التحقق والإنهاء ونسخة رابط الوثائق.
وبالنسبة إلى المسارات الأخرى الساخنة في القنوات، فضّل المساعدات الضيقة بدلًا من
الأسطح القديمة الأوسع:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolution, وopenclaw/plugin-sdk/account-helpersمن أجل إعدادات الحسابات المتعددة والرجوع إلى الحساب الافتراضيopenclaw/plugin-sdk/inbound-envelopeوopenclaw/plugin-sdk/inbound-reply-dispatchمن أجل ربط التوجيه/الغلاف الوارد وربط record-and-dispatchopenclaw/plugin-sdk/messaging-targetsلتحليل/مطابقة الأهدافopenclaw/plugin-sdk/outbound-mediaوopenclaw/plugin-sdk/outbound-runtimeمن أجل تحميل الوسائط بالإضافة إلى مفوضات الهوية/الإرسال الصادرةopenclaw/plugin-sdk/thread-bindings-runtimeمن أجل دورة حياة thread-binding وتسجيل المحولاتopenclaw/plugin-sdk/agent-media-payloadفقط عندما يكون تخطيط حقل agent/media payload قديمًا لا يزال مطلوبًاopenclaw/plugin-sdk/telegram-command-configمن أجل تسوية الأوامر المخصصة في Telegram، والتحقق من التكرار/التعارض، وعقد إعداد الأوامر الثابت في الرجوع
الشرح العملي
الحزمة وmanifest
أنشئ ملفات plugin القياسية. إن الحقل
channel في package.json هو
ما يجعل هذا plugin قناة. وللحصول على سطح بيانات الحزمة الكامل،
راجع إعداد Plugin وConfig:ابنِ كائن plugin الخاص بالقناة
يحتوي واجهة
ChannelPlugin على الكثير من أسطح المحولات الاختيارية. ابدأ
بالحد الأدنى — id وsetup — ثم أضف المحولات حسب الحاجة.أنشئ src/channel.ts:src/channel.ts
ما الذي تفعله createChatChannelPlugin نيابةً عنك
ما الذي تفعله createChatChannelPlugin نيابةً عنك
بدلًا من تنفيذ واجهات المحولات منخفضة المستوى يدويًا، فإنك تمرر
خيارات وصفية ويتولى الباني تركيبها:
يمكنك أيضًا تمرير كائنات محولات خام بدلًا من الخيارات الوصفية
إذا كنت بحاجة إلى تحكم كامل.
| الخيار | ما الذي يربطه |
|---|---|
security.dm | محلل أمان رسائل مباشرة مقيّد النطاق من حقول الإعداد |
pairing.text | تدفق اقتران رسائل مباشرة قائم على النص مع تبادل الرموز |
threading | محلل وضع reply-to (ثابت أو مقيّد بالحساب أو مخصص) |
outbound.attachedResults | دوال إرسال تعيد بيانات وصفية للنتيجة (معرّفات الرسائل) |
اربط نقطة الدخول
أنشئ ضع واصفات CLI الخاصة بالقناة في
index.ts:index.ts
registerCliMetadata(...) حتى يتمكن OpenClaw
من عرضها في مساعدة الجذر من دون تفعيل وقت تشغيل القناة الكامل،
بينما تظل التحميلات الكاملة العادية تلتقط الواصفات نفسها لتسجيل الأوامر الفعلي.
وأبقِ registerFull(...) للأعمال الخاصة بوقت التشغيل فقط.
وإذا كان registerFull(...) يسجل طرق Gateway RPC، فاستخدم
بادئة خاصة بالـ plugin. تبقى مساحات أسماء الإدارة في النواة (config.*,
exec.approvals.*, wizard.*, update.*) محجوزة وتتحلل دائمًا إلى
operator.admin.
يتولى defineChannelPluginEntry فصل أوضاع التسجيل تلقائيًا. راجع
نقاط الدخول لجميع
الخيارات.أضف setup entry
أنشئ يحمّل OpenClaw هذا بدلًا من نقطة الدخول الكاملة عندما تكون القناة معطلة
أو غير مهيأة. وهذا يتجنب سحب شيفرة وقت تشغيل ثقيلة أثناء تدفقات الإعداد.
راجع الإعداد وConfig للتفاصيل.
setup-entry.ts من أجل تحميل خفيف أثناء الإعداد الأولي:setup-entry.ts
تعامل مع الرسائل الواردة
يحتاج plugin الخاص بك إلى استلام الرسائل من المنصة وإعادة توجيهها إلى
OpenClaw. النمط المعتاد هو webhook يتحقق من الطلب ثم
يوزعه عبر معالج الوارد الخاص بقناتك:
التعامل مع الرسائل الواردة خاص بكل قناة. فكل plugin قناة يمتلك
خط معالجة الوارد الخاص به. انظر إلى Plugins القنوات المضمّنة
(مثل حزمة plugin الخاصة بـ Microsoft Teams أو Google Chat) للحصول على أنماط حقيقية.
اختبر
اكتب اختبارات موضوعة بجانب الشيفرة في وبالنسبة إلى مساعدات الاختبار المشتركة، راجع الاختبار.
src/channel.test.ts:src/channel.test.ts
بنية الملفات
موضوعات متقدمة
خيارات السلاسل
أوضاع reply ثابتة أو مقيّدة بالحساب أو مخصصة
تكامل أداة الرسائل
describeMessageTool واكتشاف الإجراءات
تحليل الهدف
inferTargetChatType, looksLikeId, resolveTarget
مساعدات وقت التشغيل
TTS وSTT والوسائط وsubagent عبر api.runtime
لا تزال بعض الوصلات المساعدة المضمّنة موجودة من أجل صيانة plugins المضمّنة
والتوافق. لكنها ليست النمط الموصى به لـ Plugins القنوات الجديدة؛
فضّل المسارات الفرعية العامة channel/setup/reply/runtime من
سطح SDK المشترك ما لم تكن تصون تلك العائلة المضمّنة من plugins مباشرةً.
الخطوات التالية
- Plugins الموفّر — إذا كان plugin الخاص بك يوفّر نماذج أيضًا
- نظرة عامة على SDK — مرجع استيراد المسارات الفرعية الكامل
- اختبار SDK — أدوات الاختبار واختبارات العقد
- manifest الـ Plugin — مخطط manifest الكامل