يرشدك هذا الدليل إلى إنشاء Plugin قناة يربط OpenClaw بمنصة مراسلة. بحلول النهاية سيكون لديك قناة عاملة مع أمان الرسائل المباشرة، والإقران، وتسلسل الردود، والمراسلة الصادرة.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
إذا لم تكن قد أنشأت أي Plugin في OpenClaw من قبل، فاقرأ
بدء الاستخدام أولا للتعرف على بنية الحزمة
الأساسية وإعداد البيان.
كيف تعمل Plugins القنوات
لا تحتاج Plugins القنوات إلى أدوات إرسال/تعديل/تفاعل خاصة بها. يحتفظ OpenClaw بأداةmessage مشتركة واحدة في النواة. يمتلك Plugin الخاص بك:
- الإعدادات - حل الحساب ومعالج الإعداد
- الأمان - سياسة الرسائل المباشرة وقوائم السماح
- الإقران - تدفق الموافقة عبر الرسائل المباشرة
- قواعد الجلسة - كيفية ربط معرفات المحادثات الخاصة بالمزود بالمحادثات الأساسية ومعرفات السلاسل والبدائل الأصلية
- الصادر - إرسال النص والوسائط والاستطلاعات إلى المنصة
- تسلسل المحادثات - كيفية ربط الردود بالسلاسل
- مؤشرات الكتابة في Heartbeat - إشارات كتابة/انشغال اختيارية لأهداف تسليم Heartbeat
:thread: العام، والتوجيه.
ينبغي أن تعرض Plugins القنوات الجديدة أيضا محول message باستخدام
defineChannelMessageAdapter من openclaw/plugin-sdk/channel-message. يعلن
المحول قدرات الإرسال النهائي المتينة التي يدعمها النقل الأصلي فعليا، ويوجه
إرسال النص/الوسائط إلى دوال النقل نفسها مثل محول outbound القديم. لا تعلن
عن قدرة إلا عندما يثبت اختبار عقد الأثر الجانبي الأصلي والإيصال المعاد.
للعقد الكامل للواجهة البرمجية، والأمثلة، ومصفوفة القدرات، وقواعد الإيصالات،
وإنهاء المعاينة الحية، وسياسة إقرار الاستلام، والاختبارات، وجدول الترحيل، راجع
واجهة برمجة رسائل القناة.
إذا كان محول outbound الحالي يتضمن بالفعل دوال الإرسال الصحيحة وبيانات
تعريف القدرات، فاستخدم createChannelMessageAdapterFromOutbound(...)
لاشتقاق محول message بدلا من كتابة جسر آخر يدويا.
ينبغي أن تعيد عمليات إرسال المحول قيما من نوع MessageReceipt. عندما لا تزال
شيفرة التوافق تحتاج إلى المعرفات القديمة، فاشتقها باستخدام
listMessageReceiptPlatformIds(...) أو resolveMessageReceiptPrimaryId(...)
بدلا من الاحتفاظ بحقول messageIds موازية في شيفرة دورة الحياة الجديدة.
ينبغي للقنوات القادرة على المعاينة أن تعلن أيضا عن message.live.capabilities
مع دورة الحياة الحية الدقيقة التي تمتلكها، مثل draftPreview أو
previewFinalization أو progressUpdates أو nativeStreaming أو
quietFinalization. وينبغي للقنوات التي تنهي معاينة مسودة في موضعها أن
تعلن أيضا عن message.live.finalizer.capabilities، مثل finalEdit و
normalFallback و discardPending و previewReceipt و
retainOnAmbiguousFailure، وأن توجه منطق وقت التشغيل عبر
defineFinalizableLivePreviewAdapter(...) إضافة إلى
deliverWithFinalizableLivePreviewAdapter(...). أبق هذه القدرات مدعومة
باختبارات verifyChannelMessageLiveCapabilityAdapterProofs(...) و
verifyChannelMessageLiveFinalizerProofs(...) حتى لا ينحرف سلوك المعاينة
الأصلية، والتقدم، والتعديل، والبديل/الاحتفاظ، والتنظيف، والإيصالات بصمت.
ينبغي للمستقبلات الواردة التي تؤجل إقرارات المنصة أن تعلن
message.receive.defaultAckPolicy و supportedAckPolicies بدلا من إخفاء
توقيت الإقرار في حالة محلية للمراقب. غط كل سياسة معلنة باستخدام
verifyChannelMessageReceiveAckPolicyAdapterProofs(...).
تظل أدوات الرد/الدور القديمة مثل createChannelTurnReplyPipeline و
dispatchInboundReplyWithBase و recordInboundSessionAndDispatchReply
متاحة لموجهات التوافق. لا تستخدم هذه الأسماء في شيفرة القنوات الجديدة؛ ينبغي
أن تبدأ Plugins الجديدة بمحول message، والإيصالات، ومساعدات دورة حياة
الاستقبال/الإرسال على openclaw/plugin-sdk/channel-message.
يمكن للقنوات التي ترحل تفويض الوارد استخدام المسار الفرعي التجريبي
openclaw/plugin-sdk/channel-ingress-runtime من مسارات الاستقبال في وقت التشغيل.
يبقي المسار الفرعي بحث المنصة والآثار الجانبية داخل Plugin، مع مشاركة حل حالة
قائمة السماح، وقرارات المسار/المرسل/الأمر/الحدث/التفعيل، والتشخيصات المنقحة،
وربط قبول الدور. أبق تطبيع هوية Plugin في الواصف الذي تمرره إلى المحلل؛ لا
تسلسل قيم المطابقة الخام من الحالة أو القرار المحلول. راجع
واجهة برمجة دخول القناة لتصميم الواجهة
البرمجية، وحدود الملكية، وتوقعات الاختبار.
إذا كانت قناتك تدعم مؤشرات الكتابة خارج الردود الواردة، فاعرض
heartbeat.sendTyping(...) على Plugin القناة. تستدعيه النواة مع هدف تسليم
Heartbeat المحلول قبل بدء تشغيل نموذج Heartbeat، وتستخدم دورة حياة إبقاء
الكتابة/التنظيف المشتركة. أضف heartbeat.clearTyping(...) عندما تحتاج المنصة
إلى إشارة إيقاف صريحة.
إذا أضافت قناتك معاملات لأداة الرسائل تحمل مصادر وسائط، فاعرض أسماء هذه
المعاملات عبر describeMessageTool(...).mediaSourceParams. تستخدم النواة هذه
القائمة الصريحة لتطبيع مسارات صندوق الحماية وسياسة الوصول إلى الوسائط الصادرة،
لذلك لا تحتاج Plugins إلى حالات خاصة في النواة المشتركة لمعاملات الصورة الرمزية
أو المرفق أو صورة الغلاف الخاصة بالمزود.
يفضل إرجاع خريطة بمفاتيح الإجراءات مثل
{ "set-profile": ["avatarUrl", "avatarPath"] } حتى لا ترث الإجراءات غير
ذات الصلة وسائط إجراء آخر. ما تزال المصفوفة المسطحة تعمل للمعاملات المشتركة
عمدا عبر كل إجراء معروض.
إذا احتاجت قناتك إلى تشكيل خاص بالمزود من أجل message(action="send")،
فيفضل استخدام actions.prepareSendPayload(...). ضع البطاقات الأصلية أو
الكتل أو التضمينات أو البيانات المتينة الأخرى تحت
payload.channelData.<channel> ودع النواة تنفذ الإرسال الفعلي عبر محول
الصادر/الرسائل. استخدم actions.handleAction(...) للإرسال فقط كبديل توافق
للحمولات التي لا يمكن تسلسلها وإعادة المحاولة عليها.
إذا كانت منصتك تخزن نطاقا إضافيا داخل معرفات المحادثات، فأبق هذا التحليل في
Plugin باستخدام messaging.resolveSessionConversation(...). هذا هو الخطاف
المعياري لربط rawId بمعرف المحادثة الأساسية، ومعرف سلسلة اختياري، و
baseConversationId صريح، وأي parentConversationCandidates. عندما تعيد
parentConversationCandidates، فأبقها مرتبة من الأصل الأضيق إلى المحادثة
الأوسع/الأساسية.
استخدم openclaw/plugin-sdk/channel-route عندما تحتاج شيفرة Plugin إلى تطبيع
حقول شبيهة بالمسارات، أو مقارنة سلسلة فرعية بمسارها الأصلي، أو بناء مفتاح
إزالة تكرار ثابت من { channel, to, accountId, threadId }. يطبع المساعد
معرفات السلاسل الرقمية بالطريقة نفسها التي تفعلها النواة، لذلك ينبغي أن تفضله
Plugins على مقارنات String(threadId) المخصصة.
يمكن أن تحقن Plugins ذات قواعد الهدف الخاصة بالمزود محللها في
resolveChannelRouteTargetWithParser(...) ومع ذلك تحصل على شكل هدف المسار
نفسه ودلالات الرجوع إلى السلسلة التي تستخدمها النواة.
يمكن أيضا لـ Plugins المضمنة التي تحتاج إلى التحليل نفسه قبل إقلاع سجل القنوات
أن تعرض ملف session-key-api.ts في المستوى الأعلى مع تصدير
resolveSessionConversation(...) مطابق. تستخدم النواة هذا السطح الآمن للتمهيد
فقط عندما لا يكون سجل Plugins في وقت التشغيل متاحا بعد.
يظل messaging.resolveParentConversationCandidates(...) متاحا كبديل توافق قديم
عندما لا يحتاج Plugin إلا إلى البدائل الأصلية فوق المعرف العام/الخام. إذا وجد
الخطافان معا، تستخدم النواة
resolveSessionConversation(...).parentConversationCandidates أولا ولا ترجع إلى
resolveParentConversationCandidates(...) إلا عندما يحذفها الخطاف المعياري.
الموافقات وقدرات القناة
لا تحتاج معظم Plugins القنوات إلى شيفرة خاصة بالموافقة.- تمتلك النواة
/approveفي نفس الدردشة، وحمولات أزرار الموافقة المشتركة، والتسليم الاحتياطي العام. - فضّل كائن
approvalCapabilityواحدًا على Plugin القناة عندما تحتاج القناة إلى سلوك خاص بالموافقات. - تمت إزالة
ChannelPlugin.approvals. ضع حقائق تسليم/أصلية/عرض/مصادقة الموافقة علىapprovalCapability. plugin.authمخصص لتسجيل الدخول/الخروج فقط؛ لم تعد النواة تقرأ خطافات مصادقة الموافقات من ذلك الكائن.approvalCapability.authorizeActorActionوapprovalCapability.getActionAvailabilityStateهما خط تماس مصادقة الموافقات القياسي.- استخدم
approvalCapability.getActionAvailabilityStateلتوفر مصادقة الموافقة في نفس الدردشة. - إذا كانت قناتك تعرض موافقات exec أصلية، فاستخدم
approvalCapability.getExecInitiatingSurfaceStateلحالة سطح البدء/العميل الأصلي عندما تختلف عن مصادقة الموافقة في نفس الدردشة. تستخدم النواة ذلك الخطاف الخاص بـ exec للتمييز بينenabledوdisabled، وتحديد ما إذا كانت القناة البادئة تدعم موافقات exec الأصلية، وتضمين القناة في إرشادات الرجوع الاحتياطي للعميل الأصلي. يملأcreateApproverRestrictedNativeApprovalCapability(...)هذا للحالة الشائعة. - استخدم
outbound.shouldSuppressLocalPayloadPromptأوoutbound.beforeDeliverPayloadلسلوك دورة حياة الحمولة الخاص بالقناة، مثل إخفاء مطالبات الموافقة المحلية المكررة أو إرسال مؤشرات الكتابة قبل التسليم. - استخدم
approvalCapability.deliveryفقط لتوجيه الموافقة الأصلية أو كبت الرجوع الاحتياطي. - استخدم
approvalCapability.nativeRuntimeلحقائق الموافقة الأصلية المملوكة للقناة. أبقه كسولًا في نقاط دخول القناة كثيرة الاستخدام باستخدامcreateLazyChannelApprovalNativeRuntimeAdapter(...)، والذي يمكنه استيراد وحدة وقت التشغيل عند الطلب مع السماح للنواة بتجميع دورة حياة الموافقة. - استخدم
approvalCapability.renderفقط عندما تحتاج القناة فعلًا إلى حمولات موافقة مخصصة بدلًا من العارض المشترك. - استخدم
approvalCapability.describeExecApprovalSetupعندما تريد القناة أن يشرح رد مسار التعطيل مفاتيح الإعدادات الدقيقة اللازمة لتمكين موافقات exec الأصلية. يتلقى الخطاف{ channel, channelLabel, accountId }؛ يجب أن تعرض قنوات الحسابات المسماة مسارات محددة النطاق للحساب مثلchannels.<channel>.accounts.<id>.execApprovals.*بدلًا من القيم الافتراضية على المستوى الأعلى. - إذا كان بإمكان قناة استنتاج هويات DM مستقرة شبيهة بالمالك من الإعدادات الحالية، فاستخدم
createResolvedApproverActionAuthAdapterمنopenclaw/plugin-sdk/approval-runtimeلتقييد/approveفي نفس الدردشة دون إضافة منطق خاص بالموافقة إلى النواة. - إذا احتاجت قناة إلى تسليم موافقة أصلي، فاجعل كود القناة مركزًا على تطبيع الهدف وحقائق النقل/العرض. استخدم
createChannelExecApprovalProfileوcreateChannelNativeOriginTargetResolverوcreateChannelApproverDmTargetResolverوcreateApproverRestrictedNativeApprovalCapabilityمنopenclaw/plugin-sdk/approval-runtime. ضع الحقائق الخاصة بالقناة خلفapprovalCapability.nativeRuntime، ويفضل عبرcreateChannelApprovalNativeRuntimeAdapter(...)أوcreateLazyChannelApprovalNativeRuntimeAdapter(...)، حتى تتمكن النواة من تجميع المعالج وامتلاك ترشيح الطلبات، والتوجيه، وإزالة التكرار، وانتهاء الصلاحية، واشتراك Gateway، وإشعارات التوجيه إلى مكان آخر. ينقسمnativeRuntimeإلى بضعة خطوط تماس أصغر: - يستخدم
createChannelNativeOriginTargetResolverمطابق مسارات القنوات المشترك افتراضيًا لأهداف{ to, accountId, threadId }. مرّرtargetsMatchفقط عندما تمتلك قناة قواعد تكافؤ خاصة بالمزوّد، مثل مطابقة بادئة الطابع الزمني في Slack. - مرّر
normalizeTargetForMatchإلىcreateChannelNativeOriginTargetResolverعندما تحتاج القناة إلى جعل معرّفات المزوّد قياسية قبل تشغيل مطابق المسارات الافتراضي أو رد نداءtargetsMatchمخصص، مع الحفاظ على الهدف الأصلي للتسليم. استخدمnormalizeTargetفقط عندما يجب جعل هدف التسليم المحلول نفسه قياسيًا. availability- ما إذا كان الحساب مضبوطًا وما إذا كان يجب التعامل مع الطلبpresentation- تعيين نموذج عرض الموافقة المشترك إلى حمولات أصلية معلقة/محلولة/منتهية أو إجراءات نهائيةtransport- تحضير الأهداف وإرسال/تحديث/حذف رسائل الموافقة الأصليةinteractions- خطافات ربط/إلغاء ربط/مسح إجراء اختيارية للأزرار أو التفاعلات الأصليةobserve- خطافات تشخيص التسليم الاختيارية- إذا احتاجت القناة إلى كائنات مملوكة لوقت التشغيل مثل عميل، أو رمز، أو تطبيق Bolt، أو مستقبل Webhook، فسجلها عبر
openclaw/plugin-sdk/channel-runtime-context. يتيح سجل سياق وقت التشغيل العام للنواة تمهيد المعالجات المدفوعة بالقدرات من حالة بدء تشغيل القناة دون إضافة غراء تغليف خاص بالموافقة. - استخدم
createChannelApprovalHandlerأوcreateChannelNativeApprovalRuntimeذوي المستوى الأدنى فقط عندما لا يكون خط التماس المدفوع بالقدرات معبرًا بما يكفي بعد. - يجب أن تمرر قنوات الموافقة الأصلية كلًا من
accountIdوapprovalKindعبر تلك المساعدات. يُبقيaccountIdسياسة موافقة الحسابات المتعددة محصورة في حساب البوت الصحيح، ويُبقيapprovalKindسلوك موافقات exec مقابل Plugin متاحًا للقناة دون فروع ثابتة في النواة. - تمتلك النواة الآن إشعارات إعادة توجيه الموافقة أيضًا. يجب ألا ترسل Plugins القنوات رسائل متابعة خاصة بها من نوع “ذهبت الموافقة إلى DMs / قناة أخرى” من
createChannelNativeApprovalRuntime؛ بدلًا من ذلك، اعرض توجيهًا دقيقًا للمنشأ + DM الموافق عبر مساعدات قدرة الموافقة المشتركة، ودع النواة تجمع عمليات التسليم الفعلية قبل نشر أي إشعار عائد إلى الدردشة البادئة. - حافظ على نوع معرّف الموافقة المسلّم من البداية إلى النهاية. يجب ألا تخمن العملاء الأصلية أو تعيد كتابة توجيه موافقة exec مقابل Plugin من حالة محلية للقناة.
- يمكن لأنواع الموافقات المختلفة أن تعرض أسطحًا أصلية مختلفة عمدًا.
الأمثلة المضمّنة الحالية:
- يحافظ Slack على توفر توجيه الموافقة الأصلي لكل من معرّفات exec وPlugin.
- يحافظ Matrix على نفس توجيه DM/القناة الأصلي وتجربة تفاعلات الموافقة لكل من موافقات 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-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، وبناة وكيل الإعداد المفوض - يتضمن
openclaw/plugin-sdk/setup-runtimeخط تماس المحول المدرك للبيئة لـcreateEnvPatchedAccountSetupAdapter - يغطي
openclaw/plugin-sdk/channel-setupبناة إعداد التثبيت الاختياري بالإضافة إلى بضعة بدائيات آمنة للإعداد:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. أبقِ envVars الخاصة بوقت تشغيل القناة أو الثوابت المحلية
للنص الموجّه للمشغلين فقط.
إذا كان بإمكان قناتك الظهور في status أو channels list أو channels status أو
عمليات فحص SecretRef قبل بدء وقت تشغيل Plugin، فأضف openclaw.setupEntry في
package.json. يجب أن تكون نقطة الدخول هذه آمنة للاستيراد في مسارات أوامر
للقراءة فقط، ويجب أن تعيد بيانات وصفية للقناة، ومحول إعدادات آمنًا للإعداد، ومحول حالة،
وبيانات وصفية لأهداف أسرار القناة اللازمة لتلك الملخصات. لا
تبدأ العملاء أو المستمعين أو أوقات تشغيل النقل من مدخل الإعداد.
أبقِ مسار استيراد مدخل القناة الرئيسي ضيقًا أيضًا. يمكن للاكتشاف تقييم
المدخل ووحدة Plugin القناة لتسجيل القدرات دون تفعيل
القناة. يجب أن تصدر ملفات مثل channel-plugin-api.ts كائن Plugin القناة
دون استيراد معالجات الإعداد، أو عملاء النقل، أو مستمعي المقابس،
أو مشغلات العمليات الفرعية، أو وحدات بدء تشغيل الخدمات. ضع قطع وقت التشغيل هذه
في وحدات تُحمّل من registerFull(...)، أو محددات وقت التشغيل، أو محولات
قدرات كسولة.
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لمسار/غلاف الوارد وتوصيل التسجيل والإرسالopenclaw/plugin-sdk/messaging-targetsلتحليل/مطابقة الأهدافopenclaw/plugin-sdk/outbound-mediaوopenclaw/plugin-sdk/outbound-runtimeلتحميل الوسائط بالإضافة إلى مفوضات الهوية/الإرسال الصادرة وتخطيط الحمولةbuildThreadAwareOutboundSessionRoute(...)منopenclaw/plugin-sdk/channel-coreعندما يجب أن يحافظ مسار صادر علىreplyToId/threadIdصريح أو يستعيد جلسة:thread:الحالية بعد أن يظل مفتاح الجلسة الأساسي مطابقًا. يمكن لـ Plugins المزوّدين تجاوز الأولوية، وسلوك اللاحقة، وتطبيع معرّف السلسلة عندما تمتلك منصتهم دلالات تسليم سلاسل أصلية.openclaw/plugin-sdk/thread-bindings-runtimeلدورة حياة ربط السلاسل وتسجيل المحولاتopenclaw/plugin-sdk/agent-media-payloadفقط عندما يظل تخطيط حقل حمولة الوكيل/الوسائط القديم مطلوبًاopenclaw/plugin-sdk/telegram-command-configلتطبيع أوامر Telegram المخصصة، والتحقق من التكرار/التعارض، وعقد إعداد أوامر مستقر عند الرجوع الاحتياطي
سياسة الإشارة الواردة
أبقِ معالجة الإشارات الواردة مقسمة إلى طبقتين:- جمع الأدلة المملوك لـ Plugin
- تقييم السياسة المشتركة
openclaw/plugin-sdk/channel-mention-gating لقرارات سياسة الإشارة.
استخدم openclaw/plugin-sdk/channel-inbound فقط عندما تحتاج إلى حزمة مساعدات الوارد
الأوسع.
ملائم جيدًا للمنطق المحلي في Plugin:
- اكتشاف الرد على البوت
- اكتشاف الاقتباس من البوت
- فحوصات مشاركة السلسلة
- استثناءات رسائل الخدمة/النظام
- ذاكرات التخزين المؤقت الأصلية للمنصة اللازمة لإثبات مشاركة البوت
requireMention- نتيجة الإشارة الصريحة
- قائمة السماح للإشارة الضمنية
- تجاوز الأمر
- قرار التخطي النهائي
- احسب حقائق الإشارة المحلية.
- مرر تلك الحقائق إلى
resolveInboundMentionDecision({ facts, policy }). - استخدم
decision.effectiveWasMentionedوdecision.shouldBypassMentionوdecision.shouldSkipفي بوابة الوارد لديك.
api.runtime.channel.mentions مساعدات الإشارة المشتركة نفسها
لـplugins القنوات المضمنة التي تعتمد بالفعل على حقن وقت التشغيل:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
implicitMentionKindWhen و
resolveInboundMentionDecision، فاستورد من
openclaw/plugin-sdk/channel-mention-gating لتجنب تحميل مساعدات وقت تشغيل الوارد
غير ذات الصلة.
تبقى مساعدات resolveMentionGating* الأقدم على
openclaw/plugin-sdk/channel-inbound كتصديرات توافق فقط. يجب أن تستخدم الشيفرة الجديدة
resolveInboundMentionDecision({ facts, policy }).
شرح تفصيلي
Package and manifest
أنشئ ملفات plugin القياسية. الحقل يتحقق
channel في package.json هو
ما يجعل هذا plugin قناة. للاطلاع على سطح بيانات تعريف الحزمة الكامل،
راجع إعداد Plugin وتكوينه:configSchema من plugins.entries.acme-chat.config. استخدمه
للإعدادات المملوكة للـplugin التي ليست تكوين حساب القناة. يتحقق channelConfigs
من channels.acme-chat وهو مصدر المسار البارد الذي تستخدمه أسطح مخطط التكوين
والإعداد وواجهة المستخدم قبل تحميل وقت تشغيل plugin.Build the channel plugin object
تحتوي واجهة بالنسبة إلى القنوات التي تقبل مفاتيح DM العلوية القياسية والمفاتيح المتداخلة القديمة، استخدم المساعدات من
ChannelPlugin على العديد من أسطح المحولات الاختيارية. ابدأ
بالحد الأدنى - id وsetup - وأضف المحولات عند الحاجة إليها.أنشئ src/channel.ts:src/channel.ts
plugin-sdk/channel-config-helpers: تحافظ resolveChannelDmAccess وresolveChannelDmPolicy وresolveChannelDmAllowFrom وnormalizeChannelDmPolicy على القيم المحلية للحساب قبل قيم الجذر الموروثة. اربط المحلل نفسه بإصلاح doctor عبر normalizeLegacyDmAliases حتى يقرأ وقت التشغيل والترحيل العقد نفسه.What createChatChannelPlugin does for you
What createChatChannelPlugin does for you
بدلا من تنفيذ واجهات المحولات منخفضة المستوى يدويا، تمرر
خيارات تعريفية ويؤلفها المنشئ:
يمكنك أيضا تمرير كائنات محول خام بدلا من الخيارات التعريفية
إذا كنت تحتاج إلى تحكم كامل.قد تعرف محولات الصادر الخام دالة
| الخيار | ما يربطه |
|---|---|
security.dm | محلل أمان DM محدد النطاق من حقول التكوين |
pairing.text | تدفق إقران DM نصي مع تبادل الرمز |
threading | محلل وضع الرد (ثابت، محدد بنطاق الحساب، أو مخصص) |
outbound.attachedResults | دوال إرسال تعيد بيانات تعريف النتيجة (معرفات الرسائل) |
chunker(text, limit, ctx).
يحمل ctx.formatting الاختياري قرارات التنسيق في وقت التسليم
مثل maxLinesPerMessage؛ طبقه قبل الإرسال حتى يتم حل ترابط الردود
وحدود التجزئة مرة واحدة بواسطة تسليم الصادر المشترك.
تتضمن سياقات الإرسال أيضا replyToIdSource (implicit أو explicit)
عندما يتم حل هدف رد أصلي، بحيث تستطيع مساعدات الحمولة الحفاظ
على وسوم الرد الصريحة دون استهلاك خانة رد ضمنية أحادية الاستخدام.Wire the entry point
أنشئ ضع واصفات CLI المملوكة للقناة في
index.ts:index.ts
registerCliMetadata(...) حتى يستطيع OpenClaw
عرضها في تعليمات الجذر دون تنشيط وقت تشغيل القناة الكامل،
بينما لا تزال التحميلات الكاملة العادية تلتقط الواصفات نفسها لتسجيل الأوامر الفعلي.
احتفظ بـregisterFull(...) للعمل الخاص بوقت التشغيل فقط.
إذا كان registerFull(...) يسجل طرق Gateway RPC، فاستخدم
بادئة خاصة بالـplugin. تبقى مساحات أسماء الإدارة الأساسية (config.*،
exec.approvals.*، wizard.*، update.*) محجوزة وتتحلل دائما
إلى operator.admin.
يتولى defineChannelPluginEntry تقسيم وضع التسجيل تلقائيا. راجع
نقاط الإدخال لكل
الخيارات.Add a setup entry
أنشئ يحمل OpenClaw هذا بدلا من الإدخال الكامل عندما تكون القناة معطلة
أو غير مكونة. يتجنب ذلك سحب شيفرة وقت التشغيل الثقيلة أثناء تدفقات الإعداد.
راجع الإعداد والتكوين للتفاصيل.يمكن لقنوات مساحة العمل المضمنة التي تفصل التصديرات الآمنة للإعداد إلى وحدات جانبية
استخدام
setup-entry.ts للتحميل الخفيف أثناء الإعداد الأولي:setup-entry.ts
defineBundledChannelSetupEntry(...) من
openclaw/plugin-sdk/channel-entry-contract عندما تحتاج أيضا إلى
محدد صريح لوقت التشغيل أثناء الإعداد.Handle inbound messages
يحتاج plugin لديك إلى تلقي الرسائل من المنصة وتمريرها إلى
OpenClaw. النمط المعتاد هو Webhook يتحقق من الطلب
ويرسله عبر معالج الوارد في قناتك:
معالجة الرسائل الواردة خاصة بكل قناة. كل Plugin خاص بقناة يملك
مسار المعالجة الواردة الخاص به. اطّلع على Plugins القنوات المضمّنة
(على سبيل المثال حزمة Plugin Microsoft Teams أو Google Chat) للاطلاع على أنماط حقيقية.
اختبار
اكتب اختبارات موضوعة بجانب الكود في للمساعدات المشتركة للاختبارات، راجع الاختبار.
src/channel.test.ts:src/channel.test.ts
بنية الملفات
موضوعات متقدمة
خيارات المحادثات المترابطة
أوضاع رد ثابتة، أو مرتبطة بالحساب، أو مخصصة
تكامل أداة الرسائل
describeMessageTool واكتشاف الإجراءات
حلّ الهدف
inferTargetChatType, looksLikeId, resolveTarget
مساعدات وقت التشغيل
TTS، وSTT، والوسائط، والوكيل الفرعي عبر api.runtime
نواة دورة القناة
دورة حياة مشتركة للدورة الواردة: الإدخال، الحل، التسجيل، الإرسال، الإنهاء
لا تزال بعض طبقات المساعدة المضمّنة موجودة لصيانة Plugins المضمّنة
والتوافق. ليست هي النمط الموصى به لإنشاء Plugins قنوات جديدة؛
فضّل المسارات الفرعية العامة للقناة/الإعداد/الرد/وقت التشغيل من سطح SDK
المشترك، ما لم تكن تصون عائلة Plugins المضمّنة تلك مباشرة.
الخطوات التالية
- Plugins المزوّدين - إذا كان Plugin الخاص بك يوفّر نماذج أيضًا
- نظرة عامة على SDK - مرجع كامل لاستيرادات المسارات الفرعية
- اختبار SDK - أدوات الاختبار واختبارات العقد
- بيان Plugin - مخطط البيان الكامل