यदि आपने पहले कोई OpenClaw plugin नहीं बनाया है, तो basic package
structure और manifest setup के लिए पहले
शुरू करना पढ़ें।
Channel plugins कैसे काम करते हैं
Channel plugins को अपने send/edit/react tools की ज़रूरत नहीं होती। OpenClaw core में एक sharedmessage tool रखता है। आपका plugin इनका मालिक होता है:
- Config - account resolution और setup wizard
- Security - DM policy और allowlists
- Pairing - DM approval flow
- Session grammar - provider-specific conversation ids को base chats, thread ids, और parent fallbacks से कैसे map किया जाता है
- Outbound - प्लेटफ़ॉर्म पर text, media, और polls भेजना
- Threading - replies को कैसे thread किया जाता है
- Heartbeat typing - heartbeat delivery targets के लिए optional typing/busy signals
:thread: bookkeeping, और dispatch का मालिक होता है।
नए channel plugins को openclaw/plugin-sdk/channel-outbound से
defineChannelMessageAdapter के साथ एक message adapter भी expose करना चाहिए। adapter यह declare करता है कि native transport वास्तव में कौन-सी durable final-send capabilities support करता है और text/media sends को legacy outbound adapter जैसी ही transport functions की ओर point करता है। capability केवल तब declare करें जब कोई contract test native side effect और returned receipt को prove करे।
पूरा API contract, examples, capability matrix, receipt rules, live
preview finalization, receive ack policy, tests, और migration table के लिए
Channel outbound API देखें।
यदि मौजूदा outbound adapter में पहले से सही send methods और
capability metadata है, तो एक और bridge हाथ से लिखने के बजाय
createChannelMessageAdapterFromOutbound(...) का उपयोग करके
message adapter derive करें।
Adapter sends को MessageReceipt values return करनी चाहिए। जब compatibility code को अभी भी legacy ids की ज़रूरत हो, तो नए lifecycle code में parallel messageIds fields रखने के बजाय उन्हें listMessageReceiptPlatformIds(...)
या resolveMessageReceiptPrimaryId(...) से derive करें।
Preview-capable channels को message.live.capabilities भी declare करनी चाहिए, exact live lifecycle के साथ जिसका वे ownership रखते हैं, जैसे draftPreview,
previewFinalization, progressUpdates, nativeStreaming, या
quietFinalization। जो channels draft preview को उसी जगह finalize करते हैं, उन्हें message.live.finalizer.capabilities भी declare करनी चाहिए, जैसे finalEdit,
normalFallback, discardPending, previewReceipt, और
retainOnAmbiguousFailure, और runtime logic को
defineFinalizableLivePreviewAdapter(...) तथा
deliverWithFinalizableLivePreviewAdapter(...) से route करना चाहिए। इन capabilities को verifyChannelMessageLiveCapabilityAdapterProofs(...) और
verifyChannelMessageLiveFinalizerProofs(...) tests से backed रखें, ताकि native preview,
progress, edit, fallback/retention, cleanup, और receipt behavior चुपचाप drift न हो सके।
Inbound receivers जो platform acknowledgements defer करते हैं, उन्हें monitor-local state में ack timing छिपाने के बजाय
message.receive.defaultAckPolicy और supportedAckPolicies declare करनी चाहिए। हर declared policy को
verifyChannelMessageReceiveAckPolicyAdapterProofs(...) से cover करें।
Legacy reply helpers जैसे createChannelTurnReplyPipeline,
dispatchInboundReplyWithBase, और recordInboundSessionAndDispatchReply
compatibility dispatchers के लिए उपलब्ध रहते हैं। नए channel code के लिए इन names का उपयोग न करें; नए plugins को message adapter, receipts, और
openclaw/plugin-sdk/channel-outbound पर receive/send lifecycle helpers से शुरू करना चाहिए।
Inbound authorization migrate करने वाले channels runtime receive
paths से experimental openclaw/plugin-sdk/channel-ingress-runtime subpath का उपयोग कर सकते हैं। subpath platform lookup और side effects को plugin में रखता है, जबकि allowlist state resolution, route/sender/command/event/activation
decisions, redacted diagnostics, और turn-admission mapping share करता है। Resolver को दिए गए descriptor में plugin identity normalization रखें; resolved state या decision से raw match values serialize न करें। API design,
ownership boundary, और test expectations के लिए
Channel ingress API देखें।
यदि आपका channel inbound replies के बाहर typing indicators support करता है, तो channel plugin पर
heartbeat.sendTyping(...) expose करें। Core heartbeat model run शुरू होने से पहले resolved heartbeat delivery target के साथ इसे call करता है और shared typing keepalive/cleanup lifecycle का उपयोग करता है। जब platform को explicit stop signal चाहिए, तो heartbeat.clearTyping(...) जोड़ें।
यदि आपका channel media sources carry करने वाले message-tool params जोड़ता है, तो उन
param names को describeMessageTool(...).mediaSourceParams के ज़रिए expose करें। Core sandbox path normalization और outbound media-access
policy के लिए उस explicit list का उपयोग करता है, इसलिए plugins को provider-specific
avatar, attachment, या cover-image params के लिए shared-core special cases की ज़रूरत नहीं होती।
{ "set-profile": ["avatarUrl", "avatarPath"] } जैसे action-keyed map को return करना prefer करें, ताकि unrelated actions किसी दूसरे action के media args inherit न करें। Flat array उन params के लिए अब भी काम करता है जो हर exposed action में जानबूझकर shared हैं।
जिन channels को platform-side media fetch के लिए temporary public URL expose करना पड़ता है, वे plugin state stores के साथ
openclaw/plugin-sdk/outbound-media से createHostedOutboundMediaStore(...) का उपयोग कर सकते हैं। Platform route parsing और token enforcement को channel plugin में रखें; shared helper केवल media loading, expiry metadata, chunk rows, और cleanup का मालिक होता है।
यदि आपके channel को message(action="send") के लिए provider-specific shaping की ज़रूरत है, तो
actions.prepareSendPayload(...) prefer करें। Native cards, blocks, embeds, या
अन्य durable data को payload.channelData.<channel> के अंतर्गत रखें और core को outbound/message adapter के ज़रिए actual send करने दें। actions.handleAction(...) को send के लिए केवल उन payloads के compatibility fallback के रूप में उपयोग करें जिन्हें serialize और retry नहीं किया जा सकता।
यदि आपका platform conversation ids के अंदर extra scope store करता है, तो वह parsing plugin में
messaging.resolveSessionConversation(...) के साथ रखें। यही rawId को base conversation id, optional thread
id, explicit baseConversationId, और किसी भी parentConversationCandidates से map करने वाला canonical hook है।
जब आप parentConversationCandidates return करें, तो उन्हें सबसे narrow parent से broadest/base conversation तक ordered रखें।
जब plugin code को route-like fields normalize करने हों, child thread की उसके parent route से तुलना करनी हो, या { channel, to, accountId, threadId } से stable dedupe key बनानी हो, तो
openclaw/plugin-sdk/channel-route का उपयोग करें। Helper numeric thread ids को उसी तरह normalize करता है जैसे core करता है, इसलिए plugins को ad hoc String(threadId) comparisons के बजाय इसे prefer करना चाहिए।
Provider-specific target grammar वाले plugins को
messaging.resolveOutboundSessionRoute(...) expose करना चाहिए, ताकि core को parser shims का उपयोग किए बिना provider-native
session और thread identity मिले।
Bundled plugins जिन्हें channel registry boot होने से पहले वही parsing चाहिए, वे matching
resolveSessionConversation(...) export के साथ top-level session-key-api.ts file भी expose कर सकते हैं। Core उस bootstrap-safe surface का उपयोग केवल तब करता है जब runtime plugin registry अभी उपलब्ध नहीं होती।
messaging.resolveParentConversationCandidates(...) legacy compatibility fallback के रूप में उपलब्ध रहता है, जब किसी plugin को generic/raw id के ऊपर केवल parent fallbacks चाहिए हों। यदि दोनों hooks मौजूद हैं, तो core पहले
resolveSessionConversation(...).parentConversationCandidates का उपयोग करता है और canonical hook उन्हें omit करने पर ही
resolveParentConversationCandidates(...) पर fallback करता है।
Approvals और channel capabilities
अधिकांश channel plugins को approval-specific code की ज़रूरत नहीं होती।- कोर same-chat
/approve, साझा अनुमोदन बटन पेलोड, और सामान्य फॉलबैक डिलीवरी का मालिक है। - जब चैनल को अनुमोदन-विशिष्ट व्यवहार चाहिए, तो चैनल Plugin पर एक
approvalCapabilityऑब्जेक्ट को प्राथमिकता दें। ChannelPlugin.approvalsहटा दिया गया है। अनुमोदन डिलीवरी/native/render/auth तथ्यों कोapprovalCapabilityपर रखें।plugin.authकेवल login/logout है; कोर अब उस ऑब्जेक्ट से अनुमोदन auth hooks नहीं पढ़ता।approvalCapability.authorizeActorActionऔरapprovalCapability.getActionAvailabilityStateकैनॉनिकल approval-auth seam हैं।- same-chat अनुमोदन auth उपलब्धता के लिए
approvalCapability.getActionAvailabilityStateका उपयोग करें। - यदि आपका चैनल native exec अनुमोदन दिखाता है, तो initiating-surface/native-client स्थिति के लिए
approvalCapability.getExecInitiatingSurfaceStateका उपयोग करें, जब वह same-chat अनुमोदन auth से अलग हो। कोर उस exec-विशिष्ट hook का उपयोगenabledबनामdisabledमें अंतर करने, यह तय करने कि initiating चैनल native exec अनुमोदन का समर्थन करता है या नहीं, और चैनल को native-client फॉलबैक मार्गदर्शन में शामिल करने के लिए करता है।createApproverRestrictedNativeApprovalCapability(...)सामान्य मामले के लिए इसे भर देता है। - चैनल-विशिष्ट पेलोड लाइफसाइकिल व्यवहार के लिए
outbound.shouldSuppressLocalPayloadPromptयाoutbound.beforeDeliverPayloadका उपयोग करें, जैसे डुप्लिकेट स्थानीय अनुमोदन प्रॉम्प्ट छिपाना या डिलीवरी से पहले typing indicators भेजना। approvalCapability.deliveryका उपयोग केवल native अनुमोदन रूटिंग या फॉलबैक suppression के लिए करें।- चैनल-स्वामित्व वाले native अनुमोदन तथ्यों के लिए
approvalCapability.nativeRuntimeका उपयोग करें। इसे hot चैनल entrypoints परcreateLazyChannelApprovalNativeRuntimeAdapter(...)के साथ lazy रखें, जो मांग पर आपका runtime मॉड्यूल import कर सकता है और फिर भी कोर को अनुमोदन lifecycle assemble करने देता है। approvalCapability.renderका उपयोग केवल तब करें जब किसी चैनल को साझा renderer की जगह सच में custom अनुमोदन पेलोड चाहिए।approvalCapability.describeExecApprovalSetupका उपयोग तब करें जब चैनल चाहता है कि disabled-path reply native exec अनुमोदन सक्षम करने के लिए जरूरी सटीक config knobs समझाए। hook को{ channel, channelLabel, accountId }मिलता है; named-account चैनलों को top-level defaults की जगहchannels.<channel>.accounts.<id>.execApprovals.*जैसे account-scoped paths render करने चाहिए।- यदि कोई चैनल मौजूदा config से स्थिर owner-जैसी DM identities infer कर सकता है, तो approval-विशिष्ट कोर logic जोड़े बिना same-chat
/approveको restrict करने के लिएopenclaw/plugin-sdk/approval-runtimeसेcreateResolvedApproverActionAuthAdapterका उपयोग करें। - यदि custom अनुमोदन auth जानबूझकर केवल same-chat फॉलबैक की अनुमति देता है, तो
openclaw/plugin-sdk/approval-auth-runtimeसेmarkImplicitSameChatApprovalAuthorization({ authorized: true })लौटाएं; अन्यथा कोर परिणाम को explicit approver authorization मानता है। - यदि चैनल-स्वामित्व वाला native callback अनुमोदन सीधे resolve करता है, तो resolve करने से पहले
isImplicitSameChatApprovalAuthorization(...)का उपयोग करें ताकि implicit फॉलबैक अब भी चैनल के सामान्य actor authorization से होकर जाए। - यदि किसी चैनल को native अनुमोदन डिलीवरी चाहिए, तो चैनल कोड को target normalization और transport/presentation facts पर केंद्रित रखें।
openclaw/plugin-sdk/approval-runtimeसेcreateChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver, औरcreateApproverRestrictedNativeApprovalCapabilityका उपयोग करें। चैनल-विशिष्ट तथ्यों कोapprovalCapability.nativeRuntimeके पीछे रखें, आदर्श रूप सेcreateChannelApprovalNativeRuntimeAdapter(...)याcreateLazyChannelApprovalNativeRuntimeAdapter(...)के जरिए, ताकि कोर handler assemble कर सके और request filtering, routing, dedupe, expiry, Gateway subscription, और routed-elsewhere notices का मालिक रहे।nativeRuntimeकुछ छोटे seams में विभाजित है: - जब कोई चैनल session-origin native delivery और explicit approval forwarding targets दोनों का समर्थन करता है, तो
openclaw/plugin-sdk/approval-native-runtimeसेcreateNativeApprovalChannelRouteGatesका उपयोग करें। helper approval config selection,modehandling, agent/session filters, account binding, session-target matching, और target-list matching को centralize करता है, जबकि callers अभी भी channel id, default forwarding mode, account lookup, transport-enabled check, target normalization, और turn-source target resolution के मालिक रहते हैं। core-owned channel policy defaults बनाने के लिए इसका उपयोग न करें; चैनल का documented default mode स्पष्ट रूप से pass करें। createChannelNativeOriginTargetResolver{ to, accountId, threadId }targets के लिए default रूप से साझा channel-route matcher का उपयोग करता है।targetsMatchकेवल तब pass करें जब चैनल के पास provider-specific equivalence rules हों, जैसे Slack timestamp prefix matching।- जब चैनल को default route matcher या custom
targetsMatchcallback चलने से पहले provider ids canonicalize करने हों, और delivery के लिए मूल target बनाए रखना हो, तोcreateChannelNativeOriginTargetResolverकोnormalizeTargetForMatchpass करें।normalizeTargetका उपयोग केवल तब करें जब resolved delivery target को ही canonicalize किया जाना चाहिए। availability- account configured है या नहीं और request handle होनी चाहिए या नहींpresentation- साझा अनुमोदन view model को pending/resolved/expired native payloads या final actions में map करेंtransport- targets prepare करें और native अनुमोदन messages send/update/delete करेंinteractions- native buttons या reactions के लिए optional bind/unbind/clear-action hooks, साथ ही optionalcancelDeliveredhook।cancelDeliveredतब implement करें जबdeliverPendingin-process या persistent state register करता है (जैसे reaction target store), ताकि यदि handler stopbindPendingचलने से पहले delivery cancel कर दे या जबbindPendingकोई handle न लौटाए, तो वह state release की जा सकेobserve- optional delivery diagnostics hooks- यदि चैनल को client, token, Bolt app, या webhook receiver जैसे runtime-owned objects चाहिए, तो उन्हें
openclaw/plugin-sdk/channel-runtime-contextके जरिए register करें। generic runtime-context registry कोर को approval-विशिष्ट wrapper glue जोड़े बिना channel startup state से capability-driven handlers bootstrap करने देती है। - lower-level
createChannelApprovalHandlerयाcreateChannelNativeApprovalRuntimeकी ओर केवल तब जाएं जब capability-driven seam अभी पर्याप्त expressive न हो। - native अनुमोदन चैनलों को उन helpers के जरिए
accountIdऔरapprovalKindदोनों route करने होंगे।accountIdmulti-account अनुमोदन policy को सही bot account तक scoped रखता है, औरapprovalKindexec बनाम plugin अनुमोदन व्यवहार को कोर में hardcoded branches के बिना चैनल के लिए उपलब्ध रखता है। - कोर अब approval reroute notices का भी मालिक है। चैनल Plugins को
createChannelNativeApprovalRuntimeसे अपने “approval went to DMs / another channel” follow-up messages नहीं भेजने चाहिए; इसके बजाय, shared approval capability helpers के जरिए accurate origin + approver-DM routing expose करें और initiating chat में कोई notice post करने से पहले कोर को actual deliveries aggregate करने दें। - delivered approval id kind को end-to-end preserve करें। native clients को channel-local state से exec बनाम plugin approval routing का अनुमान लगाना या rewrite नहीं करना चाहिए।
- अलग-अलग approval kinds जानबूझकर अलग native surfaces expose कर सकते हैं।
वर्तमान bundled उदाहरण:
- Slack exec और plugin ids दोनों के लिए native approval routing उपलब्ध रखता है।
- Matrix exec और plugin approvals के लिए वही native DM/channel routing और reaction UX रखता है, जबकि auth को approval kind के अनुसार अलग रहने देता है।
createApproverRestrictedNativeApprovalAdapterअब भी compatibility wrapper के रूप में मौजूद है, लेकिन नए code को capability builder को प्राथमिकता देनी चाहिए और Plugin परapprovalCapabilityexpose करना चाहिए।
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 को प्राथमिकता दें।
setup के लिए विशेष रूप से:
openclaw/plugin-sdk/setup-runtimeruntime-safe setup helpers को cover करता है:createSetupTranslator, import-safe setup patch adapters (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), lookup-note output,promptResolvedAllowFrom,splitSetupEntries, और delegated setup-proxy buildersopenclaw/plugin-sdk/setup-runtimeमेंcreateEnvPatchedAccountSetupAdapterके लिए env-aware adapter seam शामिल हैopenclaw/plugin-sdk/channel-setupoptional-install setup builders और कुछ setup-safe primitives को cover करता है:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars के साथ declare करें। operator-facing copy के लिए ही चैनल runtime envVars या local
constants रखें।
यदि आपका चैनल Plugin runtime शुरू होने से पहले status, channels list, channels status, या
SecretRef scans में दिख सकता है, तो
package.json में openclaw.setupEntry जोड़ें। वह entrypoint read-only command
paths में import करने के लिए safe होना चाहिए और उन summaries के लिए जरूरी channel metadata, setup-safe config adapter, status
adapter, और channel secret target metadata लौटाना चाहिए। setup entry से
clients, listeners, या transport runtimes शुरू न करें।
main चैनल entry import path को भी narrow रखें। Discovery चैनल activate किए बिना capabilities register करने के लिए
entry और channel Plugin module evaluate कर सकता है।
channel-plugin-api.ts जैसी files को setup wizards, transport clients, socket
listeners, subprocess launchers, या service startup modules import किए बिना channel
Plugin object export करना चाहिए। उन runtime
pieces को registerFull(...), runtime setters, या lazy
capability adapters से loaded modules में रखें।
createOptionalChannelSetupWizard, DEFAULT_ACCOUNT_ID,
createTopLevelChannelDmPolicy, setSetupChannelEnabled, और
splitSetupEntries
- broader
openclaw/plugin-sdk/setupseam का उपयोग केवल तब करें जब आपकोmoveSingleAccountChannelSectionToDefaultAccount(...)जैसे भारी shared setup/config helpers भी चाहिए
createOptionalChannelSetupSurface(...) को प्राथमिकता दें। generated
adapter/wizard config writes और finalization पर fail closed करते हैं, और वे validation, finalize, और docs-link
copy में वही install-required message reuse करते हैं।
अन्य hot चैनल paths के लिए, broader legacy
surfaces की जगह narrow helpers को प्राथमिकता दें:
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/channel-inboundइनबाउंड रूट/एनवेलप और रिकॉर्ड-और-डिस्पैच वायरिंग के लिएopenclaw/plugin-sdk/channel-targetsटार्गेट पार्सिंग हेल्पर के लिएopenclaw/plugin-sdk/outbound-mediaमीडिया लोडिंग के लिए औरopenclaw/plugin-sdk/channel-outboundआउटबाउंड पहचान/सेंड डेलिगेट और पेलोड प्लानिंग के लिएopenclaw/plugin-sdk/channel-coreसेbuildThreadAwareOutboundSessionRoute(...), जब किसी आउटबाउंड रूट को स्पष्टreplyToId/threadIdसुरक्षित रखना हो या बेस सेशन कुंजी अब भी मेल खाने के बाद मौजूदा:thread:सेशन फिर से प्राप्त करना हो। Provider Plugin अपने प्लेटफ़ॉर्म में नेटिव थ्रेड डिलीवरी सेमांटिक्स होने पर प्रीसिडेंस, सफ़िक्स व्यवहार, और थ्रेड id नॉर्मलाइज़ेशन को ओवरराइड कर सकते हैं।openclaw/plugin-sdk/thread-bindings-runtimeथ्रेड-बाइंडिंग लाइफ़साइकल और एडॉप्टर रजिस्ट्रेशन के लिएopenclaw/plugin-sdk/agent-media-payloadकेवल तब जब पुराना एजेंट/मीडिया पेलोड फ़ील्ड लेआउट अब भी आवश्यक होopenclaw/plugin-sdk/telegram-command-configTelegram कस्टम-कमांड नॉर्मलाइज़ेशन, डुप्लिकेट/कॉनफ़्लिक्ट वैलिडेशन, और फ़ॉलबैक-स्थिर कमांड कॉन्फ़िग कॉन्ट्रैक्ट के लिए
इनबाउंड मेंशन नीति
इनबाउंड मेंशन हैंडलिंग को दो लेयर में विभाजित रखें:- Plugin-स्वामित्व वाला एविडेंस संग्रह
- साझा नीति मूल्यांकन
openclaw/plugin-sdk/channel-mention-gating का उपयोग करें।
व्यापक इनबाउंड हेल्पर बैरल की आवश्यकता होने पर ही
openclaw/plugin-sdk/channel-inbound का उपयोग करें।
Plugin-स्थानीय लॉजिक के लिए अच्छा विकल्प:
- reply-to-bot पहचान
- quoted-bot पहचान
- थ्रेड-भागीदारी जांच
- सर्विस/सिस्टम-मैसेज बहिष्करण
- बॉट भागीदारी साबित करने के लिए ज़रूरी प्लेटफ़ॉर्म-नेटिव कैश
requireMention- स्पष्ट मेंशन परिणाम
- इम्प्लिसिट मेंशन अलाउलिस्ट
- कमांड बायपास
- अंतिम स्किप निर्णय
- स्थानीय मेंशन तथ्यों की गणना करें।
- उन तथ्यों को
resolveInboundMentionDecision({ facts, policy })में पास करें। - अपने इनबाउंड गेट में
decision.effectiveWasMentioned,decision.shouldBypassMention, औरdecision.shouldSkipका उपयोग करें।
api.runtime.channel.mentions उन बंडल्ड channel Plugin के लिए वही साझा मेंशन हेल्पर उजागर करता है
जो पहले से रनटाइम इंजेक्शन पर निर्भर हैं:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
implicitMentionKindWhen और
resolveInboundMentionDecision चाहिए, तो असंबंधित इनबाउंड
रनटाइम हेल्पर लोड करने से बचने के लिए
openclaw/plugin-sdk/channel-mention-gating से इम्पोर्ट करें।
मेंशन गेटिंग के लिए resolveInboundMentionDecision({ facts, policy }) का उपयोग करें।
वॉकथ्रू
Package and manifest
मानक Plugin फ़ाइलें बनाएं।
package.json में channel फ़ील्ड ही
इसे channel Plugin बनाता है। पूरी पैकेज-मेटाडेटा सतह के लिए,
Plugin Setup and Config देखें:configSchema plugins.entries.acme-chat.config को वैलिडेट करता है। इसे
उन Plugin-स्वामित्व वाली सेटिंग्स के लिए उपयोग करें जो channel account config नहीं हैं। channelConfigs
channels.acme-chat को वैलिडेट करता है और Plugin रनटाइम लोड होने से पहले कॉन्फ़िग
स्कीमा, सेटअप, और UI सतहों द्वारा उपयोग किया जाने वाला कोल्ड-पाथ स्रोत है।Build the channel plugin object
ChannelPlugin इंटरफ़ेस में कई वैकल्पिक एडॉप्टर सतहें हैं। न्यूनतम -
id और setup - से शुरू करें और ज़रूरत के अनुसार एडॉप्टर जोड़ें।src/channel.ts बनाएं:src/channel.ts
plugin-sdk/channel-config-helpers से हेल्पर उपयोग करें: resolveChannelDmAccess, resolveChannelDmPolicy, resolveChannelDmAllowFrom, और normalizeChannelDmPolicy account-local वैल्यूज़ को इनहेरिटेड root वैल्यूज़ से आगे रखते हैं। उसी resolver को normalizeLegacyDmAliases के ज़रिये doctor repair के साथ जोड़ें ताकि रनटाइम और माइग्रेशन वही कॉन्ट्रैक्ट पढ़ें।What createChatChannelPlugin does for you
What createChatChannelPlugin does for you
निम्न-स्तरीय एडॉप्टर इंटरफ़ेस को मैन्युअली लागू करने के बजाय, आप
डिक्लेरेटिव विकल्प पास करते हैं और बिल्डर उन्हें संयोजित करता है:
यदि आपको पूरा नियंत्रण चाहिए, तो आप डिक्लेरेटिव विकल्पों के बजाय रॉ एडॉप्टर ऑब्जेक्ट भी पास कर सकते हैं।रॉ आउटबाउंड एडॉप्टर
| विकल्प | यह क्या वायर करता है |
|---|---|
security.dm | कॉन्फ़िग फ़ील्ड से स्कोप्ड DM सुरक्षा resolver |
pairing.text | कोड एक्सचेंज के साथ टेक्स्ट-आधारित DM पेयरिंग फ़्लो |
threading | Reply-to-mode resolver (फिक्स्ड, अकाउंट-स्कोप्ड, या कस्टम) |
outbound.attachedResults | परिणाम मेटाडेटा (message IDs) लौटाने वाले सेंड फ़ंक्शन |
chunker(text, limit, ctx) फ़ंक्शन परिभाषित कर सकते हैं।
वैकल्पिक ctx.formatting डिलीवरी-समय फ़ॉर्मैटिंग निर्णय जैसे
maxLinesPerMessage लेकर चलता है; भेजने से पहले इसे लागू करें ताकि reply threading
और chunk boundaries साझा outbound delivery द्वारा एक बार में resolve हों।
Send contexts में replyToIdSource (implicit या explicit) भी शामिल होता है
जब कोई native reply target resolve हुआ हो, ताकि payload helpers explicit reply tags को
implicit single-use reply slot खर्च किए बिना सुरक्षित रख सकें।Wire the entry point
index.ts बनाएं:index.ts
registerCliMetadata(...) में रखें ताकि OpenClaw
उन्हें पूर्ण चैनल runtime सक्रिय किए बिना root help में दिखा सके,
जबकि सामान्य full loads अभी भी वास्तविक command
registration के लिए वही descriptors उठा लें। Runtime-only काम के लिए registerFull(...) रखें।
यदि registerFull(...) gateway RPC methods register करता है, तो
plugin-specific prefix का उपयोग करें। Core admin namespaces (config.*,
exec.approvals.*, wizard.*, update.*) reserved रहते हैं और हमेशा
operator.admin पर resolve होते हैं।
defineChannelPluginEntry registration-mode split को अपने आप संभालता है। सभी
options के लिए Entry Points देखें।सेटअप entry जोड़ें
Onboarding के दौरान हल्की loading के लिए जब channel disabled या unconfigured हो, तब OpenClaw full entry के बजाय इसे load करता है।
यह setup flows के दौरान भारी runtime code खींचने से बचाता है।
विवरण के लिए Setup and Config देखें।Bundled workspace channels जो setup-safe exports को sidecar
modules में split करते हैं, वे
setup-entry.ts बनाएँ:setup-entry.ts
openclaw/plugin-sdk/channel-entry-contract से
defineBundledChannelSetupEntry(...) का उपयोग कर सकते हैं, जब उन्हें
explicit setup-time runtime setter की भी जरूरत हो।Inbound messages संभालें
आपके plugin को platform से messages receive करके उन्हें
OpenClaw तक forward करना होगा। सामान्य pattern एक webhook है जो request को verify करता है और
उसे आपके channel के inbound handler के माध्यम से dispatch करता है:
Inbound message handling channel-specific होता है। हर channel plugin अपनी
inbound pipeline का मालिक होता है। वास्तविक patterns के लिए bundled channel plugins
(उदाहरण के लिए Microsoft Teams या Google Chat plugin package) देखें।
Test
Colocated tests Shared test helpers के लिए, Testing देखें।
src/channel.test.ts में लिखें:src/channel.test.ts
File structure
उन्नत विषय
Threading options
Fixed, account-scoped, या custom reply modes
Message tool integration
describeMessageTool और action discovery
Target resolution
inferTargetChatType, looksLikeId, reservedLiterals, resolveTarget
Runtime helpers
api.runtime के माध्यम से TTS, STT, media, subagent
Channel inbound API
Shared inbound event lifecycle: ingest, resolve, record, dispatch, finalize
कुछ bundled helper seams अब भी bundled-plugin maintenance और
compatibility के लिए मौजूद हैं। वे नए channel plugins के लिए recommended pattern नहीं हैं;
जब तक आप सीधे उस bundled plugin family को maintain नहीं कर रहे हों, common SDK
surface से generic channel/setup/reply/runtime subpaths को प्राथमिकता दें।
अगले चरण
- Provider Plugins - यदि आपका plugin models भी प्रदान करता है
- SDK Overview - पूरा subpath import reference
- SDK Testing - test utilities और contract tests
- Plugin Manifest - पूरा manifest schema