بناء Plugins القنوات
يوضح هذا الدليل كيفية بناء Plugin قناة يربط OpenClaw بمنصة مراسلة. وبنهاية هذا الدليل سيكون لديك قناة عاملة تتضمن أمان الرسائل الخاصة، والاقتران، وترابط الردود، والرسائل الصادرة.إذا لم تكن قد أنشأت أي Plugin لـ OpenClaw من قبل، فاقرأ
البدء أولًا للتعرف على بنية الحزمة الأساسية
وإعداد manifest.
كيف تعمل Plugins القنوات
لا تحتاج Plugins القنوات إلى أدوات send/edit/react خاصة بها. يحتفظ OpenClaw بأداةmessage مشتركة واحدة في النواة. ويتولى Plugin الخاص بك ما يلي:
- الإعداد — تحليل الحسابات ومعالج الإعداد
- الأمان — سياسة الرسائل الخاصة وقوائم السماح
- الاقتران — تدفق الموافقة على الرسائل الخاصة
- صياغة الجلسة — كيفية ربط معرّفات المحادثات الخاصة بالمزوّد بالمحادثات الأساسية، ومعرّفات السلاسل، وبدائل الأصل
- الصادر — إرسال النصوص والوسائط والاستطلاعات إلى المنصة
- التسلسل — كيفية ربط الردود ضمن السلاسل
:thread:، والإرسال.
إذا كانت قناتك تضيف معاملات message-tool تحمل مصادر وسائط، فاكشف أسماء هذه
المعاملات عبر describeMessageTool(...).mediaSourceParams. تستخدم النواة
هذه القائمة الصريحة لتطبيع مسارات sandbox وسياسة الوصول إلى الوسائط الصادرة،
بحيث لا تحتاج Plugins إلى حالات خاصة في النواة المشتركة لمعلمات الصورة
الرمزية أو المرفقات أو صورة الغلاف الخاصة بكل مزوّد.
ويُفضَّل إرجاع خريطة مفاتيحها هي الإجراءات مثل
{ "set-profile": ["avatarUrl", "avatarPath"] } حتى لا ترث الإجراءات غير
المرتبطة معاملات الوسائط الخاصة بإجراء آخر. ولا تزال المصفوفة المسطحة تعمل
للمعاملات التي تكون مشتركة عمدًا بين جميع الإجراءات المكشوفة.
إذا كانت منصتك تخزن نطاقًا إضافيًا داخل معرّفات المحادثات، فأبقِ هذا التحليل
داخل Plugin باستخدام messaging.resolveSessionConversation(...). فهذا هو
الخطاف القياسي لربط rawId بمعرّف المحادثة الأساسي، ومعرّف السلسلة الاختياري،
وbaseConversationId الصريح، وأي parentConversationCandidates.
عند إرجاع parentConversationCandidates، احرص على ترتيبها من الأصل الأضيق
إلى المحادثة الأوسع/الأساسية.
يمكن أيضًا لـ Plugins المضمّنة التي تحتاج إلى التحليل نفسه قبل إقلاع سجل
القنوات أن تكشف ملفًا علوي المستوى باسم session-key-api.ts مع تصدير مطابق
لـ resolveSessionConversation(...). وتستخدم النواة هذا السطح الآمن للتهيئة
فقط عندما لا يكون سجل Plugins وقت التشغيل متاحًا بعد.
يبقى messaging.resolveParentConversationCandidates(...) متاحًا كبديل توافق
قديم عندما يحتاج Plugin فقط إلى بدائل أصل فوق المعرّف العام/الخام. وإذا
وُجد الخطافان معًا، تستخدم النواة
resolveSessionConversation(...).parentConversationCandidates أولًا، ولا
تعود إلى resolveParentConversationCandidates(...) إلا إذا أغفلها الخطاف
القياسي.
الموافقات وقدرات القنوات
لا تحتاج معظم Plugins القنوات إلى شيفرة خاصة بالموافقات.- تتولى النواة
/approveداخل المحادثة نفسها، وحمولات أزرار الموافقة المشتركة، والتسليم الاحتياطي العام. - فضّل كائن
approvalCapabilityواحدًا على Plugin القناة عندما تحتاج القناة إلى سلوك خاص بالموافقة. - تمت إزالة
ChannelPlugin.approvals. ضع حقائق التسليم/الأصلي/العرض/المصادقة الخاصة بالموافقة علىapprovalCapability. - يقتصر
plugin.authعلى login/logout فقط؛ ولم تعد النواة تقرأ خطافات مصادقة الموافقة من ذلك الكائن. - يمثل
approvalCapability.authorizeActorActionوapprovalCapability.getActionAvailabilityStateنقطة الربط القياسية لمصادقة الموافقات. - استخدم
approvalCapability.getActionAvailabilityStateلتوفر مصادقة الموافقة داخل المحادثة نفسها. - إذا كانت قناتك تكشف عن موافقات exec أصلية، فاستخدم
approvalCapability.getExecInitiatingSurfaceStateلحالة السطح البادئ/العميل الأصلي عندما تختلف عن مصادقة الموافقة داخل المحادثة نفسها. تستخدم النواة هذا الخطاف الخاص بـ exec للتمييز بينenabledوdisabled، وتقرير ما إذا كانت القناة البادئة تدعم موافقات exec الأصلية، وضم القناة إلى إرشادات fallback الخاصة بالعميل الأصلي. تملأcreateApproverRestrictedNativeApprovalCapability(...)هذا الجزء للحالة الشائعة. - استخدم
outbound.shouldSuppressLocalPayloadPromptأوoutbound.beforeDeliverPayloadلسلوك دورة حياة الحمولات الخاص بالقناة مثل إخفاء مطالبات الموافقة المحلية المكررة أو إرسال مؤشرات الكتابة قبل التسليم. - استخدم
approvalCapability.deliveryفقط لتوجيه الموافقة الأصلية أو تعطيل fallback. - استخدم
approvalCapability.nativeRuntimeللحقائق الأصلية الخاصة بالموافقة التي تملكها القناة. أبقه كسول التحميل على نقاط دخول القنوات الساخنة باستخدامcreateLazyChannelApprovalNativeRuntimeAdapter(...)، الذي يمكنه استيراد وحدة وقت التشغيل لديك عند الطلب مع الاستمرار في تمكين النواة من تجميع دورة حياة الموافقة. - استخدم
approvalCapability.renderفقط عندما تحتاج القناة فعلًا إلى حمولات موافقة مخصصة بدلًا من العارض المشترك. - استخدم
approvalCapability.describeExecApprovalSetupعندما تريد القناة أن يشرح رد مسار التعطيل مفاتيح الإعداد الدقيقة اللازمة لتمكين موافقات exec الأصلية. يتلقى الخطاف{ channel, channelLabel, accountId }؛ ويجب على القنوات ذات الحسابات المسماة عرض مسارات ضمن نطاق الحساب مثلchannels.<channel>.accounts.<id>.execApprovals.*بدلًا من القيم الافتراضية ذات المستوى الأعلى. - إذا كانت القناة تستطيع استنتاج هويات رسائل خاصة ثابتة شبيهة بالمالك من الإعدادات الحالية، فاستخدم
createResolvedApproverActionAuthAdapterمنopenclaw/plugin-sdk/approval-runtimeلتقييد/approveداخل المحادثة نفسها من دون إضافة منطق خاص بالموافقة إلى النواة. - إذا كانت القناة تحتاج إلى تسليم موافقات أصلية، فأبقِ شيفرة القناة مركزة على تطبيع الوجهات وحقائق النقل/العرض. استخدم
createChannelExecApprovalProfileوcreateChannelNativeOriginTargetResolverوcreateChannelApproverDmTargetResolverوcreateApproverRestrictedNativeApprovalCapabilityمنopenclaw/plugin-sdk/approval-runtime. ضع الحقائق الخاصة بالقناة خلفapprovalCapability.nativeRuntime، ويفضل عبرcreateChannelApprovalNativeRuntimeAdapter(...)أوcreateLazyChannelApprovalNativeRuntimeAdapter(...)، حتى تتمكن النواة من تجميع المعالج وتملك تصفية الطلبات والتوجيه وإزالة التكرار والانتهاء والاشتراك في Gateway وإشعارات التوجيه إلى مكان آخر. وقد تم تقسيمnativeRuntimeإلى عدة نقاط ربط أصغر: availability— ما إذا كان الحساب مضبوطًا وما إذا كان ينبغي التعامل مع الطلبpresentation— ربط نموذج عرض الموافقة المشترك بحمولات أصلية معلقة/محلولة/منتهية أو بإجراءات نهائيةtransport— إعداد الوجهات بالإضافة إلى إرسال/تحديث/حذف رسائل الموافقة الأصليةinteractions— خطافات اختيارية للربط/إلغاء الربط/مسح الإجراء للأزرار أو التفاعلات الأصليةobserve— خطافات تشخيص اختيارية للتسليم- إذا كانت القناة تحتاج إلى كائنات يملكها وقت التشغيل مثل عميل أو token أو تطبيق Bolt أو مستقبِل Webhook، فسجّلها عبر
openclaw/plugin-sdk/channel-runtime-context. يتيح سجل runtime-context العام للنواة تهيئة المعالجات المدفوعة بالقدرات من حالة بدء تشغيل القناة من دون إضافة تعليمات ربط خاصة بالموافقة. - لا تلجأ إلى
createChannelApprovalHandlerأوcreateChannelNativeApprovalRuntimeذوي المستوى الأدنى إلا عندما لا تكون نقطة الربط المدفوعة بالقدرات معبّرة بما يكفي بعد. - يجب على قنوات الموافقات الأصلية تمرير كل من
accountIdوapprovalKindعبر تلك الأدوات المساعدة. إذ يُبقيaccountIdسياسة الموافقات متعددة الحسابات ضمن نطاق حساب bot الصحيح، بينما يُبقيapprovalKindسلوك exec مقابل موافقة Plugin متاحًا للقناة من دون فروع مضمّنة في النواة. - تتولى النواة الآن أيضًا إشعارات إعادة توجيه الموافقات. يجب ألا ترسل Plugins القنوات رسائل متابعة خاصة بها من نوع “تم إرسال الموافقة إلى الرسائل الخاصة / إلى قناة أخرى” من
createChannelNativeApprovalRuntime؛ وبدلًا من ذلك، اكشف عن توجيه origin + الرسائل الخاصة للموافق عبر أدوات المساعدة المشتركة لقدرات الموافقة، ودع النواة تجمع عمليات التسليم الفعلية قبل نشر أي إشعار إلى المحادثة البادئة. - حافظ على نوع معرّف الموافقة المُسلَّمة من البداية إلى النهاية. يجب ألا تقوم العملاء الأصلية بتخمين أو إعادة كتابة توجيه موافقة exec مقابل موافقة Plugin بالاعتماد على حالة محلية للقناة.
- يمكن لأنواع الموافقات المختلفة أن تكشف عمدًا عن أسطح أصلية مختلفة.
أمثلة حالية من Plugins المضمّنة:
- يحتفظ Slack بتوجيه الموافقات الأصلية متاحًا لكل من معرّفات exec وPlugin.
- يحتفظ Matrix بالتوجيه الأصلي نفسه للرسائل الخاصة/القناة وتجربة التفاعلات لموافقات exec وPlugin، مع السماح مع ذلك باختلاف المصادقة حسب نوع الموافقة.
- لا يزال
createApproverRestrictedNativeApprovalAdapterموجودًا كغلاف توافق، لكن يجب أن تفضّل الشيفرة الجديدة منشئ القدرات وأن تكشفapprovalCapabilityعلى Plugin.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-gateway-runtimeopenclaw/plugin-sdk/approval-handler-adapter-runtimeopenclaw/plugin-sdk/approval-handler-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtimeopenclaw/plugin-sdk/channel-runtime-context
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أدوات الإعداد الآمنة لوقت التشغيل: مهايئات ترقيع الإعداد الآمنة للاستيراد (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator)، وإخراج ملاحظات البحث، وpromptResolvedAllowFrom، وsplitSetupEntries، وبناة setup-proxy المفوضة - يمثل
openclaw/plugin-sdk/setup-adapter-runtimeنقطة الربط الضيقة الواعية بالبيئة لـcreateEnvPatchedAccountSetupAdapter - يغطي
openclaw/plugin-sdk/channel-setupبناة الإعداد ذي التثبيت الاختياري بالإضافة إلى بعض الأساسيات الآمنة للإعداد:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. واحتفظ
بـ envVars في وقت تشغيل القناة أو الثوابت المحلية فقط للنصوص الموجّهة
للمشغّل.
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لإعدادات الحسابات المتعددة وfallback الحساب الافتراضيopenclaw/plugin-sdk/inbound-envelopeوopenclaw/plugin-sdk/inbound-reply-dispatchلربط المسار/الغلاف الوارد وتسجيله ثم إرسالهopenclaw/plugin-sdk/messaging-targetsلتحليل/مطابقة الوجهاتopenclaw/plugin-sdk/outbound-mediaوopenclaw/plugin-sdk/outbound-runtimeلتحميل الوسائط بالإضافة إلى مفوضي الهوية/الإرسال الصادرopenclaw/plugin-sdk/thread-bindings-runtimeلدورة حياة ربط السلاسل وتسجيل المهايئاتopenclaw/plugin-sdk/agent-media-payloadفقط عندما يكون تخطيط حقول الحمولات القديمة للوكيل/الوسائط لا يزال مطلوبًاopenclaw/plugin-sdk/telegram-command-configلتطبيع الأوامر المخصصة في Telegram، والتحقق من التكرارات/التعارضات، وعقد إعدادات الأوامر الثابت في fallback
سياسة الإشارات الواردة
أبقِ معالجة الإشارات الواردة مقسمة إلى طبقتين:- جمع الأدلة الذي يملكه Plugin
- تقييم السياسة المشتركة
openclaw/plugin-sdk/channel-mention-gating لقرارات سياسة الإشارات.
واستخدم openclaw/plugin-sdk/channel-inbound فقط عندما تحتاج إلى
شريط أدوات inbound الأوسع.
حالات مناسبة للمنطق المحلي داخل Plugin:
- اكتشاف الرد على bot
- اكتشاف الاقتباس من bot
- التحقق من المشاركة في السلسلة
- استبعاد رسائل الخدمة/النظام
- ذاكرات تخزين أصلية للمنصة لازمة لإثبات مشاركة bot
requireMention- نتيجة الإشارة الصريحة
- قائمة السماح للإشارة الضمنية
- تجاوز الأوامر
- قرار التخطي النهائي
- احسب حقائق الإشارة المحلية.
- مرر هذه الحقائق إلى
resolveInboundMentionDecision({ facts, policy }). - استخدم
decision.effectiveWasMentionedوdecision.shouldBypassMentionوdecision.shouldSkipفي بوابة inbound الخاصة بك.
api.runtime.channel.mentions عن أدوات الإشارات المشتركة نفسها
لـ Plugins القنوات المضمّنة التي تعتمد بالفعل على حقن وقت التشغيل:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
implicitMentionKindWhen و
resolveInboundMentionDecision، فاستورد من
openclaw/plugin-sdk/channel-mention-gating لتجنب تحميل أدوات
وقت تشغيل inbound غير المرتبطة.
تبقى أدوات resolveMentionGating* الأقدم موجودة على
openclaw/plugin-sdk/channel-inbound كتصديرات توافق فقط. ويجب أن تستخدم
الشيفرة الجديدة resolveInboundMentionDecision({ facts, policy }).
شرح عملي
الحزمة وmanifest
أنشئ ملفات Plugin القياسية. إن الحقل
channel في package.json هو
ما يجعل هذا Plugin قناة. وللاطلاع على سطح بيانات الحزمة الوصفية الكامل،
راجع إعداد Plugin وConfig:ابنِ كائن Plugin القناة
تحتوي الواجهة
ChannelPlugin على العديد من أسطح المهايئات الاختيارية. ابدأ
بالحد الأدنى — id وsetup — ثم أضف المهايئات حسب حاجتك.أنشئ src/channel.ts:src/channel.ts
ما الذي يفعله `createChatChannelPlugin` من أجلك
ما الذي يفعله `createChatChannelPlugin` من أجلك
بدلًا من تنفيذ واجهات مهايئات منخفضة المستوى يدويًا، تمرر
خيارات تصريحية ويقوم البنّاء بتجميعها:
يمكنك أيضًا تمرير كائنات مهايئات خام بدلًا من الخيارات التصريحية
إذا كنت بحاجة إلى تحكم كامل.
| الخيار | ما الذي يربطه |
|---|---|
security.dm | محلل أمان رسائل خاصة محدد النطاق من حقول config |
pairing.text | تدفق اقتران رسائل خاصة قائم على النص مع تبادل رمز |
threading | محلل وضع reply-to (ثابت، أو ضمن نطاق الحساب، أو مخصص) |
outbound.attachedResults | دوال send تُرجع بيانات وصفية للنتيجة (معرّفات الرسائل) |
اربط نقطة الإدخال
أنشئ ضع واصفات CLI التي تملكها القناة في
index.ts:index.ts
registerCliMetadata(...) حتى يتمكن OpenClaw
من عرضها في المساعدة الجذرية دون تفعيل وقت تشغيل القناة الكامل،
بينما تلتقط التحميلات الكاملة العادية الواصفات نفسها أيضًا من أجل التسجيل
الفعلي للأوامر. وأبقِ registerFull(...) للأعمال الخاصة بوقت التشغيل فقط.
إذا كان registerFull(...) يسجل أساليب Gateway RPC، فاستخدم
بادئة خاصة بـ Plugin. تظل مساحات أسماء الإدارة في النواة (config.*,
وexec.approvals.*, وwizard.*, وupdate.*) محجوزة وتُحل دائمًا
إلى operator.admin.
يتولى defineChannelPluginEntry فصل أوضاع التسجيل تلقائيًا. راجع
نقاط الإدخال لمعرفة
جميع الخيارات.أضف نقطة إدخال للإعداد
أنشئ يحمّل OpenClaw هذا بدلًا من نقطة الإدخال الكاملة عندما تكون القناة معطلة
أو غير مضبوطة. وهذا يتجنب سحب شيفرة وقت تشغيل ثقيلة أثناء تدفقات الإعداد.
راجع الإعداد وConfig للحصول على التفاصيل.يمكن لقنوات مساحة العمل المضمّنة التي تقسم الصادرات الآمنة للإعداد إلى وحدات
جانبية أن تستخدم
setup-entry.ts للتحميل الخفيف أثناء الإلحاق الأولي:setup-entry.ts
defineBundledChannelSetupEntry(...) من
openclaw/plugin-sdk/channel-entry-contract عندما تحتاج أيضًا إلى
محدد صريح لوقت تشغيل الإعداد.تعامل مع الرسائل الواردة
يحتاج Plugin الخاص بك إلى استقبال الرسائل من المنصة وتمريرها إلى
OpenClaw. والنمط المعتاد هو Webhook يتحقق من الطلب ويقوم
بإرساله عبر معالج inbound الخاص بقناتك:
إن معالجة الرسائل الواردة خاصة بكل قناة. يمتلك كل Plugin قناة
مسار inbound الخاص به. انظر إلى Plugins القنوات المضمّنة
(مثل حزمة Plugin الخاصة بـ Microsoft Teams أو Google Chat) للاطلاع على أنماط حقيقية.
اختبر
اكتب اختبارات موضوعة بجوار الشيفرة في للاطلاع على أدوات الاختبار المساعدة المشتركة، راجع الاختبار.
src/channel.test.ts:src/channel.test.ts
بنية الملفات
مواضيع متقدمة
خيارات التسلسل
أوضاع رد ثابتة، أو ضمن نطاق الحساب، أو مخصصة
تكامل أداة message
describeMessageTool واكتشاف الإجراءات
تحليل الوجهة
inferTargetChatType, looksLikeId, resolveTarget
أدوات وقت التشغيل المساعدة
TTS وSTT والوسائط وsubagent عبر api.runtime
لا تزال بعض نقاط الربط الخاصة بالأدوات المساعدة المضمّنة موجودة لصيانة Plugins
المضمّنة ولأغراض التوافق. لكنها ليست النمط الموصى به لـ Plugins القنوات الجديدة؛
بل يُفضّل استخدام المسارات الفرعية العامة للقنوات/الإعداد/الرد/وقت التشغيل من سطح
SDK المشترك، إلا إذا كنت تصون عائلة Plugin المضمّنة تلك مباشرة.
الخطوات التالية
- Plugins المزودين — إذا كان Plugin الخاص بك يوفر أيضًا نماذج
- نظرة عامة على SDK — المرجع الكامل لاستيراد المسارات الفرعية
- اختبار SDK — أدوات الاختبار المساعدة واختبارات العقود
- Plugin Manifest — مخطط manifest الكامل