Hướng dẫn này trình bày cách xây dựng một Plugin kênh kết nối OpenClaw với một nền tảng nhắn tin. Sau khi hoàn tất, bạn sẽ có một kênh hoạt động với bảo mật DM, ghép nối, phân luồng trả lời và nhắn tin gửi đi.Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Nếu bạn chưa từng xây dựng Plugin OpenClaw nào, trước tiên hãy đọc
Bắt đầu để nắm cấu trúc gói cơ bản
và cách thiết lập manifest.
Cách Plugin kênh hoạt động
Plugin kênh không cần công cụ gửi/chỉnh sửa/phản ứng riêng. OpenClaw giữ một công cụmessage dùng chung trong phần lõi. Plugin của bạn sở hữu:
- Cấu hình - phân giải tài khoản và trình hướng dẫn thiết lập
- Bảo mật - chính sách DM và danh sách cho phép
- Ghép nối - luồng phê duyệt DM
- Ngữ pháp phiên - cách id cuộc trò chuyện riêng theo nhà cung cấp ánh xạ tới cuộc trò chuyện gốc, id luồng và phương án dự phòng cha
- Gửi đi - gửi văn bản, phương tiện và bình chọn tới nền tảng
- Phân luồng - cách các trả lời được phân luồng
- Gõ Heartbeat - tín hiệu đang gõ/bận tùy chọn cho các đích gửi Heartbeat
:thread: chung và điều phối.
Plugin kênh mới cũng nên cung cấp một adapter message bằng
defineChannelMessageAdapter từ openclaw/plugin-sdk/channel-message. Adapter
khai báo những khả năng gửi cuối bền vững nào mà cơ chế truyền tải gốc
thực sự hỗ trợ và trỏ các lần gửi văn bản/phương tiện tới cùng các hàm truyền tải như
adapter outbound cũ. Chỉ khai báo một khả năng khi kiểm thử hợp đồng
chứng minh tác dụng phụ gốc và biên nhận được trả về.
Để xem đầy đủ hợp đồng API, ví dụ, ma trận khả năng, quy tắc biên nhận, hoàn tất
bản xem trước trực tiếp, chính sách ack nhận, kiểm thử và bảng di chuyển, hãy xem
API tin nhắn kênh.
Nếu adapter outbound hiện có đã có đúng các phương thức gửi và
siêu dữ liệu khả năng, hãy dùng createChannelMessageAdapterFromOutbound(...) để
dẫn xuất adapter message thay vì viết thủ công một cầu nối khác.
Các lần gửi của adapter nên trả về giá trị MessageReceipt. Khi mã tương thích
vẫn cần id cũ, hãy dẫn xuất chúng bằng listMessageReceiptPlatformIds(...)
hoặc resolveMessageReceiptPrimaryId(...) thay vì giữ các trường
messageIds song song trong mã vòng đời mới.
Các kênh hỗ trợ xem trước cũng nên khai báo message.live.capabilities với
vòng đời trực tiếp chính xác mà chúng sở hữu, chẳng hạn như draftPreview,
previewFinalization, progressUpdates, nativeStreaming hoặc
quietFinalization. Các kênh hoàn tất bản xem trước nháp tại chỗ cũng nên
khai báo message.live.finalizer.capabilities, chẳng hạn như finalEdit,
normalFallback, discardPending, previewReceipt và
retainOnAmbiguousFailure, đồng thời định tuyến logic runtime qua
defineFinalizableLivePreviewAdapter(...) cộng với
deliverWithFinalizableLivePreviewAdapter(...). Giữ các khả năng đó được
chống lưng bằng kiểm thử verifyChannelMessageLiveCapabilityAdapterProofs(...) và
verifyChannelMessageLiveFinalizerProofs(...) để hành vi xem trước gốc,
tiến trình, chỉnh sửa, dự phòng/lưu giữ, dọn dẹp và biên nhận không thể âm thầm sai lệch.
Các bộ nhận đầu vào trì hoãn acknowledgement của nền tảng nên khai báo
message.receive.defaultAckPolicy và supportedAckPolicies thay vì giấu
thời điểm ack trong trạng thái cục bộ của trình giám sát. Bao phủ mọi chính sách đã khai báo bằng
verifyChannelMessageReceiveAckPolicyAdapterProofs(...).
Các helper trả lời/lượt cũ như createChannelTurnReplyPipeline,
dispatchInboundReplyWithBase và recordInboundSessionAndDispatchReply
vẫn có sẵn cho các dispatcher tương thích. Không dùng các tên đó cho mã
kênh mới; Plugin mới nên bắt đầu với adapter message, biên nhận và
các helper vòng đời nhận/gửi trên openclaw/plugin-sdk/channel-message.
Các kênh đang di chuyển ủy quyền đầu vào có thể dùng subpath thử nghiệm
openclaw/plugin-sdk/channel-ingress-runtime từ các đường dẫn nhận runtime.
Subpath này giữ việc tra cứu nền tảng và tác dụng phụ trong Plugin, đồng thời
chia sẻ phân giải trạng thái danh sách cho phép, quyết định tuyến/người gửi/lệnh/sự kiện/kích hoạt,
chẩn đoán đã biên tập và ánh xạ tiếp nhận lượt. Giữ chuẩn hóa định danh
Plugin trong descriptor bạn truyền cho resolver; không tuần tự hóa các giá trị khớp thô
từ trạng thái hoặc quyết định đã phân giải. Xem
API đầu vào kênh để biết thiết kế API,
ranh giới sở hữu và kỳ vọng kiểm thử.
Nếu kênh của bạn hỗ trợ chỉ báo đang gõ ngoài các trả lời đầu vào, hãy cung cấp
heartbeat.sendTyping(...) trên Plugin kênh. Phần lõi gọi nó với
đích gửi Heartbeat đã phân giải trước khi lần chạy mô hình Heartbeat bắt đầu và
dùng vòng đời keepalive/dọn dẹp đang gõ dùng chung. Thêm heartbeat.clearTyping(...)
khi nền tảng cần tín hiệu dừng rõ ràng.
Nếu kênh của bạn thêm tham số công cụ tin nhắn mang nguồn phương tiện, hãy cung cấp các
tên tham số đó qua describeMessageTool(...).mediaSourceParams. Phần lõi dùng
danh sách tường minh đó để chuẩn hóa đường dẫn sandbox và áp dụng chính sách truy cập
phương tiện gửi đi, vì vậy Plugin không cần các trường hợp đặc biệt trong phần lõi dùng chung cho
tham số avatar, tệp đính kèm hoặc ảnh bìa riêng theo nhà cung cấp.
Nên trả về một map theo khóa hành động, chẳng hạn như
{ "set-profile": ["avatarUrl", "avatarPath"] } để các hành động không liên quan không
kế thừa đối số phương tiện của hành động khác. Mảng phẳng vẫn hoạt động cho các tham số
được chủ ý chia sẻ trên mọi hành động được cung cấp.
Nếu kênh của bạn cần tạo hình riêng theo nhà cung cấp cho message(action="send"),
nên dùng actions.prepareSendPayload(...). Đặt thẻ gốc, khối, nhúng hoặc
dữ liệu bền vững khác dưới payload.channelData.<channel> và để phần lõi thực hiện
lần gửi thực tế qua adapter outbound/message. Chỉ dùng
actions.handleAction(...) cho gửi như một phương án dự phòng tương thích cho
payload không thể được tuần tự hóa và thử lại.
Nếu nền tảng của bạn lưu phạm vi bổ sung bên trong id cuộc trò chuyện, hãy giữ phần phân tích cú pháp đó
trong Plugin bằng messaging.resolveSessionConversation(...). Đó là hook
chuẩn để ánh xạ rawId sang id cuộc trò chuyện gốc, id luồng tùy chọn,
baseConversationId tường minh và mọi parentConversationCandidates.
Khi bạn trả về parentConversationCandidates, hãy giữ chúng theo thứ tự từ
cha hẹp nhất đến cuộc trò chuyện rộng nhất/gốc.
Dùng openclaw/plugin-sdk/channel-route khi mã Plugin cần chuẩn hóa
các trường giống tuyến, so sánh một luồng con với tuyến cha của nó hoặc xây dựng
khóa chống trùng lặp ổn định từ { channel, to, accountId, threadId }. Helper này
chuẩn hóa id luồng dạng số giống như phần lõi, vì vậy Plugin nên ưu tiên
nó thay cho các phép so sánh tùy biến String(threadId).
Plugin có ngữ pháp đích riêng theo nhà cung cấp có thể tiêm parser của mình vào
resolveChannelRouteTargetWithParser(...) mà vẫn nhận được cùng hình dạng đích tuyến
và ngữ nghĩa dự phòng luồng mà phần lõi dùng.
Các Plugin đi kèm cần cùng cách phân tích cú pháp trước khi registry kênh khởi động
cũng có thể cung cấp tệp session-key-api.ts cấp cao nhất với export
resolveSessionConversation(...) tương ứng. Phần lõi chỉ dùng bề mặt an toàn cho bootstrap đó
khi registry Plugin runtime chưa khả dụng.
messaging.resolveParentConversationCandidates(...) vẫn có sẵn như một
phương án dự phòng tương thích cũ khi Plugin chỉ cần các phương án dự phòng cha trên
id chung/thô. Nếu cả hai hook tồn tại, phần lõi dùng
resolveSessionConversation(...).parentConversationCandidates trước và chỉ
quay lại resolveParentConversationCandidates(...) khi hook chuẩn
bỏ qua chúng.
Phê duyệt và khả năng của kênh
Hầu hết Plugin kênh không cần mã riêng cho phê duyệt.- Phần lõi sở hữu
/approvetrong cùng cuộc trò chuyện, payload nút phê duyệt dùng chung và cơ chế gửi dự phòng chung. - Ưu tiên một đối tượng
approvalCapabilitytrên plugin kênh khi kênh cần hành vi riêng cho phê duyệt. ChannelPlugin.approvalsđã bị xóa. Đặt các dữ kiện gửi/native/render/auth của phê duyệt trênapprovalCapability.plugin.authchỉ dành cho đăng nhập/đăng xuất; phần lõi không còn đọc các hook auth phê duyệt từ đối tượng đó.approvalCapability.authorizeActorActionvàapprovalCapability.getActionAvailabilityStatelà seam auth phê duyệt chuẩn.- Dùng
approvalCapability.getActionAvailabilityStatecho khả năng sẵn có của auth phê duyệt trong cùng cuộc trò chuyện. - Nếu kênh của bạn phơi bày các phê duyệt exec native, dùng
approvalCapability.getExecInitiatingSurfaceStatecho trạng thái bề mặt khởi tạo/native-client khi nó khác với auth phê duyệt trong cùng cuộc trò chuyện. Phần lõi dùng hook riêng cho exec đó để phân biệtenabledvớidisabled, quyết định liệu kênh khởi tạo có hỗ trợ phê duyệt exec native hay không, và đưa kênh vào hướng dẫn dự phòng native-client.createApproverRestrictedNativeApprovalCapability(...)điền phần này cho trường hợp phổ biến. - Dùng
outbound.shouldSuppressLocalPayloadPrompthoặcoutbound.beforeDeliverPayloadcho hành vi vòng đời payload riêng theo kênh, chẳng hạn như ẩn các lời nhắc phê duyệt cục bộ trùng lặp hoặc gửi chỉ báo đang nhập trước khi gửi. - Chỉ dùng
approvalCapability.deliverycho định tuyến phê duyệt native hoặc chặn dự phòng. - Dùng
approvalCapability.nativeRuntimecho các dữ kiện phê duyệt native do kênh sở hữu. Giữ nó lazy trên các entrypoint kênh nóng bằngcreateLazyChannelApprovalNativeRuntimeAdapter(...), có thể import module runtime của bạn theo nhu cầu trong khi vẫn cho phép phần lõi lắp ráp vòng đời phê duyệt. - Chỉ dùng
approvalCapability.renderkhi kênh thật sự cần payload phê duyệt tùy chỉnh thay vì renderer dùng chung. - Dùng
approvalCapability.describeExecApprovalSetupkhi kênh muốn phản hồi ở nhánh disabled giải thích chính xác các núm cấu hình cần thiết để bật phê duyệt exec native. Hook nhận{ channel, channelLabel, accountId }; các kênh theo tài khoản được đặt tên nên render các đường dẫn theo phạm vi tài khoản nhưchannels.<channel>.accounts.<id>.execApprovals.*thay vì các mặc định cấp cao nhất. - Nếu một kênh có thể suy luận các danh tính DM ổn định giống chủ sở hữu từ cấu hình hiện có, dùng
createResolvedApproverActionAuthAdaptertừopenclaw/plugin-sdk/approval-runtimeđể giới hạn/approvetrong cùng cuộc trò chuyện mà không thêm logic phần lõi riêng cho phê duyệt. - Nếu một kênh cần gửi phê duyệt native, hãy giữ mã kênh tập trung vào chuẩn hóa đích cộng với các dữ kiện transport/presentation. Dùng
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver, vàcreateApproverRestrictedNativeApprovalCapabilitytừopenclaw/plugin-sdk/approval-runtime. Đặt các dữ kiện riêng của kênh phía sauapprovalCapability.nativeRuntime, tốt nhất thông quacreateChannelApprovalNativeRuntimeAdapter(...)hoặccreateLazyChannelApprovalNativeRuntimeAdapter(...), để phần lõi có thể lắp ráp handler và sở hữu việc lọc yêu cầu, định tuyến, khử trùng lặp, hết hạn, đăng ký Gateway và thông báo đã định tuyến nơi khác.nativeRuntimeđược tách thành vài seam nhỏ hơn: createChannelNativeOriginTargetResolverdùng trình khớp tuyến kênh dùng chung theo mặc định cho các đích{ to, accountId, threadId }. Chỉ truyềntargetsMatchkhi một kênh có quy tắc tương đương riêng theo provider, chẳng hạn như khớp tiền tố timestamp của Slack.- Truyền
normalizeTargetForMatchchocreateChannelNativeOriginTargetResolverkhi kênh cần chuẩn hóa id provider trước khi trình khớp tuyến mặc định hoặc callbacktargetsMatchtùy chỉnh chạy, trong khi vẫn giữ nguyên đích gốc để gửi. Chỉ dùngnormalizeTargetkhi chính đích gửi đã được phân giải cần được chuẩn hóa. availability- liệu tài khoản đã được cấu hình hay chưa và liệu một yêu cầu có nên được xử lý hay khôngpresentation- ánh xạ view model phê duyệt dùng chung thành payload native đang chờ/đã giải quyết/hết hạn hoặc hành động cuối cùngtransport- chuẩn bị đích cộng với gửi/cập nhật/xóa thông báo phê duyệt nativeinteractions- các hook bind/unbind/clear-action tùy chọn cho nút hoặc phản ứng nativeobserve- các hook chẩn đoán gửi tùy chọn- Nếu kênh cần các đối tượng do runtime sở hữu như client, token, ứng dụng Bolt hoặc webhook receiver, đăng ký chúng thông qua
openclaw/plugin-sdk/channel-runtime-context. Registry runtime-context chung cho phép phần lõi bootstrap các handler điều khiển bằng capability từ trạng thái khởi động kênh mà không thêm lớp keo wrapper riêng cho phê duyệt. - Chỉ dùng các API cấp thấp hơn
createChannelApprovalHandlerhoặccreateChannelNativeApprovalRuntimekhi seam điều khiển bằng capability chưa đủ biểu đạt. - Các kênh phê duyệt native phải định tuyến cả
accountIdvàapprovalKindqua các helper đó.accountIdgiữ chính sách phê duyệt đa tài khoản trong đúng phạm vi tài khoản bot, vàapprovalKindgiữ hành vi phê duyệt exec so với plugin sẵn có cho kênh mà không có nhánh hardcode trong phần lõi. - Phần lõi hiện cũng sở hữu các thông báo định tuyến lại phê duyệt. Plugin kênh không nên gửi thông báo theo sau riêng kiểu “phê duyệt đã đến DM / kênh khác” từ
createChannelNativeApprovalRuntime; thay vào đó, hãy phơi bày định tuyến origin + approver-DM chính xác thông qua các helper capability phê duyệt dùng chung và để phần lõi tổng hợp các lần gửi thực tế trước khi đăng bất kỳ thông báo nào trở lại cuộc trò chuyện khởi tạo. - Bảo toàn loại id phê duyệt đã gửi xuyên suốt từ đầu đến cuối. Native client không nên đoán hoặc ghi lại định tuyến phê duyệt exec so với plugin từ trạng thái cục bộ của kênh.
- Các loại phê duyệt khác nhau có thể cố ý phơi bày các bề mặt native khác nhau.
Các ví dụ tích hợp hiện tại:
- Slack giữ định tuyến phê duyệt native khả dụng cho cả id exec và plugin.
- Matrix giữ cùng định tuyến DM/kênh native và UX phản ứng cho các phê duyệt exec và plugin, trong khi vẫn cho phép auth khác nhau theo loại phê duyệt.
createApproverRestrictedNativeApprovalAdaptervẫn tồn tại như một wrapper tương thích, nhưng mã mới nên ưu tiên builder capability và phơi bàyapprovalCapabilitytrên 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, và
openclaw/plugin-sdk/reply-chunking khi bạn không cần bề mặt umbrella rộng hơn.
Riêng với setup:
openclaw/plugin-sdk/setup-runtimebao phủ các helper setup an toàn cho runtime: adapter patch setup an toàn khi import (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), đầu ra ghi chú tra cứu,promptResolvedAllowFrom,splitSetupEntries, và các builder setup-proxy được ủy quyềnopenclaw/plugin-sdk/setup-runtimebao gồm seam adapter nhận biết env chocreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupbao phủ các builder setup cài đặt tùy chọn cộng với một vài primitive an toàn cho setup:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,
channelEnvVars. Chỉ giữ envVars runtime kênh hoặc hằng số cục bộ
cho phần nội dung hướng tới operator.
Nếu kênh của bạn có thể xuất hiện trong status, channels list, channels status, hoặc
các lần quét SecretRef trước khi runtime plugin khởi động, hãy thêm openclaw.setupEntry trong
package.json. Entrypoint đó phải an toàn để import trong các đường dẫn lệnh chỉ đọc
và phải trả về metadata kênh, adapter cấu hình an toàn cho setup, adapter trạng thái,
và metadata đích bí mật kênh cần thiết cho các tóm tắt đó. Không
khởi động client, listener hoặc runtime transport từ entry setup.
Giữ đường dẫn import entry chính của kênh cũng hẹp. Discovery có thể đánh giá
entry và module plugin kênh để đăng ký capability mà không kích hoạt
kênh. Các tệp như channel-plugin-api.ts nên export đối tượng plugin kênh
mà không import wizard setup, client transport, listener socket,
trình khởi chạy subprocess hoặc module khởi động dịch vụ. Đặt các phần runtime đó
trong các module được tải từ registerFull(...), setter runtime hoặc adapter
capability lazy.
createOptionalChannelSetupWizard, DEFAULT_ACCOUNT_ID,
createTopLevelChannelDmPolicy, setSetupChannelEnabled, và
splitSetupEntries
- chỉ dùng seam rộng hơn
openclaw/plugin-sdk/setupkhi bạn cũng cần các helper setup/config dùng chung nặng hơn nhưmoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). Adapter/wizard được tạo
fail closed khi ghi cấu hình và finalize, đồng thời tái sử dụng
cùng thông báo yêu cầu cài đặt trên validation, finalize và nội dung liên kết docs.
Đối với các đường dẫn kênh nóng khác, hãy ưu tiên các helper hẹp thay vì các
bề mặt legacy rộng hơn:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolution, vàopenclaw/plugin-sdk/account-helperscho cấu hình đa tài khoản và dự phòng tài khoản mặc địnhopenclaw/plugin-sdk/inbound-envelopevàopenclaw/plugin-sdk/inbound-reply-dispatchcho route/envelope inbound và wiring ghi-nhận-và-dispatchopenclaw/plugin-sdk/messaging-targetscho phân tích/khớp đíchopenclaw/plugin-sdk/outbound-mediavàopenclaw/plugin-sdk/outbound-runtimecho tải media cộng với các delegate danh tính/gửi outbound và lập kế hoạch payloadbuildThreadAwareOutboundSessionRoute(...)từopenclaw/plugin-sdk/channel-corekhi một tuyến outbound nên giữ nguyênreplyToId/threadIdrõ ràng hoặc khôi phục session:thread:hiện tại sau khi khóa session cơ sở vẫn khớp. Các plugin provider có thể ghi đè độ ưu tiên, hành vi hậu tố và chuẩn hóa id thread khi nền tảng của chúng có ngữ nghĩa gửi thread native.openclaw/plugin-sdk/thread-bindings-runtimecho vòng đời thread-binding và đăng ký adapteropenclaw/plugin-sdk/agent-media-payloadchỉ khi layout trường payload agent/media legacy vẫn còn bắt buộcopenclaw/plugin-sdk/telegram-command-configcho chuẩn hóa lệnh tùy chỉnh Telegram, validation trùng lặp/xung đột và hợp đồng cấu hình lệnh ổn định khi dự phòng
Chính sách đề cập inbound
Giữ việc xử lý đề cập inbound tách thành hai lớp:- thu thập bằng chứng do plugin sở hữu
- đánh giá chính sách dùng chung
openclaw/plugin-sdk/channel-mention-gating cho các quyết định chính sách đề cập.
Chỉ dùng openclaw/plugin-sdk/channel-inbound khi bạn cần barrel helper inbound
rộng hơn.
Phù hợp với logic cục bộ của plugin:
- phát hiện trả lời bot
- phát hiện trích dẫn bot
- kiểm tra sự tham gia trong thread
- loại trừ tin nhắn dịch vụ/hệ thống
- cache native của nền tảng cần thiết để chứng minh bot đã tham gia
requireMention- kết quả nhắc đến tường minh
- danh sách cho phép nhắc đến ngầm định
- bỏ qua bằng lệnh
- quyết định bỏ qua cuối cùng
- Tính các dữ kiện nhắc đến cục bộ.
- Truyền các dữ kiện đó vào
resolveInboundMentionDecision({ facts, policy }). - Dùng
decision.effectiveWasMentioned,decision.shouldBypassMentionvàdecision.shouldSkiptrong cổng inbound của bạn.
api.runtime.channel.mentions cung cấp cùng các helper nhắc đến dùng chung cho
các Plugin kênh được đóng gói vốn đã phụ thuộc vào runtime injection:
buildMentionRegexesmatchesMentionPatternsmatchesMentionWithExplicitimplicitMentionKindWhenresolveInboundMentionDecision
implicitMentionKindWhen và
resolveInboundMentionDecision, hãy import từ
openclaw/plugin-sdk/channel-mention-gating để tránh tải các helper runtime
inbound không liên quan.
Các helper resolveMentionGating* cũ hơn vẫn còn trên
openclaw/plugin-sdk/channel-inbound chỉ dưới dạng export tương thích. Mã mới
nên dùng resolveInboundMentionDecision({ facts, policy }).
Hướng dẫn từng bước
Gói và manifest
Tạo các tệp Plugin tiêu chuẩn. Trường
channel trong package.json là
phần biến đây thành một Plugin kênh. Để xem toàn bộ bề mặt metadata của gói,
xem Thiết lập và cấu hình Plugin:configSchema xác thực plugins.entries.acme-chat.config. Dùng trường này cho
các thiết lập do Plugin sở hữu không phải là cấu hình tài khoản kênh. channelConfigs
xác thực channels.acme-chat và là nguồn cold-path được schema cấu hình,
thiết lập và các bề mặt UI sử dụng trước khi runtime của Plugin được tải.Xây dựng đối tượng Plugin kênh
Giao diện Với các kênh chấp nhận cả khóa DM cấp cao nhất chuẩn tắc và khóa lồng cũ, hãy dùng các helper từ
ChannelPlugin có nhiều bề mặt adapter tùy chọn. Bắt đầu với
mức tối thiểu - id và setup - rồi thêm adapter khi bạn cần.Tạo src/channel.ts:src/channel.ts
plugin-sdk/channel-config-helpers: resolveChannelDmAccess, resolveChannelDmPolicy, resolveChannelDmAllowFrom và normalizeChannelDmPolicy giữ các giá trị cục bộ theo tài khoản đứng trước các giá trị root được kế thừa. Ghép cùng resolver đó với quá trình sửa chữa của doctor thông qua normalizeLegacyDmAliases để runtime và migration đọc cùng một hợp đồng.createChatChannelPlugin làm gì cho bạn
createChatChannelPlugin làm gì cho bạn
Thay vì tự triển khai các giao diện adapter cấp thấp, bạn truyền vào
các tùy chọn khai báo và builder sẽ kết hợp chúng:
Bạn cũng có thể truyền các đối tượng adapter thô thay cho các tùy chọn khai báo
nếu cần toàn quyền kiểm soát.Adapter outbound thô có thể định nghĩa hàm
| Tùy chọn | Phần được nối dây |
|---|---|
security.dm | Resolver bảo mật DM có phạm vi từ các trường cấu hình |
pairing.text | Luồng ghép đôi DM dựa trên văn bản với trao đổi mã |
threading | Resolver chế độ reply-to (cố định, theo phạm vi tài khoản, hoặc tùy chỉnh) |
outbound.attachedResults | Các hàm gửi trả về metadata kết quả (ID tin nhắn) |
chunker(text, limit, ctx).
ctx.formatting tùy chọn mang các quyết định định dạng tại thời điểm phân phối
chẳng hạn như maxLinesPerMessage; áp dụng nó trước khi gửi để reply threading
và ranh giới chunk được phân giải một lần bởi phần phân phối outbound dùng chung.
Ngữ cảnh gửi cũng bao gồm replyToIdSource (implicit hoặc explicit)
khi một mục tiêu trả lời gốc đã được phân giải, để các helper payload có thể giữ lại
thẻ trả lời tường minh mà không tiêu thụ một slot trả lời ngầm định dùng một lần.Nối điểm vào
Tạo Đặt các descriptor CLI do kênh sở hữu trong
index.ts:index.ts
registerCliMetadata(...) để OpenClaw
có thể hiển thị chúng trong trợ giúp root mà không kích hoạt toàn bộ runtime kênh,
trong khi các lần tải đầy đủ thông thường vẫn nhận cùng các descriptor đó để đăng ký lệnh thật.
Giữ registerFull(...) cho công việc chỉ dành cho runtime.
Nếu registerFull(...) đăng ký các phương thức RPC của Gateway, hãy dùng
tiền tố riêng cho Plugin. Các namespace quản trị core (config.*,
exec.approvals.*, wizard.*, update.*) vẫn được giữ riêng và luôn
phân giải về operator.admin.
defineChannelPluginEntry tự động xử lý phần tách chế độ đăng ký. Xem
Điểm vào để biết tất cả
tùy chọn.Thêm điểm vào thiết lập
Tạo OpenClaw tải điểm này thay cho điểm vào đầy đủ khi kênh bị tắt
hoặc chưa được cấu hình. Nó tránh kéo mã runtime nặng vào trong các luồng thiết lập.
Xem Thiết lập và cấu hình để biết chi tiết.Các kênh workspace được đóng gói tách export an toàn cho thiết lập vào các module sidecar
có thể dùng
setup-entry.ts để tải nhẹ trong quá trình onboarding:setup-entry.ts
defineBundledChannelSetupEntry(...) từ
openclaw/plugin-sdk/channel-entry-contract khi chúng cũng cần một
setter runtime rõ ràng tại thời điểm thiết lập.Xử lý tin nhắn inbound
Plugin của bạn cần nhận tin nhắn từ nền tảng và chuyển tiếp chúng đến
OpenClaw. Mẫu điển hình là một Webhook xác thực yêu cầu và
điều phối nó qua handler inbound của kênh bạn:
Việc xử lý tin nhắn đến phụ thuộc vào từng kênh. Mỗi Plugin kênh sở hữu
pipeline tin nhắn đến riêng của nó. Hãy xem các Plugin kênh được đóng gói sẵn
(ví dụ gói Plugin Microsoft Teams hoặc Google Chat) để thấy các mẫu thực tế.
Test
Viết các kiểm thử đặt cùng vị trí trong Với các helper kiểm thử dùng chung, xem Testing.
src/channel.test.ts:src/channel.test.ts
Cấu trúc tệp
Chủ đề nâng cao
Threading options
Các chế độ trả lời cố định, theo phạm vi tài khoản hoặc tùy chỉnh
Message tool integration
describeMessageTool và khám phá hành động
Target resolution
inferTargetChatType, looksLikeId, resolveTarget
Runtime helpers
TTS, STT, phương tiện, subagent qua api.runtime
Channel turn kernel
Vòng đời lượt đến dùng chung: tiếp nhận, phân giải, ghi lại, điều phối, hoàn tất
Một số seam helper được đóng gói sẵn vẫn tồn tại để bảo trì Plugin được đóng gói sẵn và
đảm bảo tương thích. Chúng không phải mẫu được khuyến nghị cho các Plugin kênh mới;
hãy ưu tiên các subpath channel/setup/reply/runtime chung từ bề mặt SDK dùng chung,
trừ khi bạn đang trực tiếp bảo trì họ Plugin được đóng gói sẵn đó.
Bước tiếp theo
- Provider Plugins - nếu Plugin của bạn cũng cung cấp mô hình
- SDK Overview - tham chiếu import subpath đầy đủ
- SDK Testing - tiện ích kiểm thử và kiểm thử hợp đồng
- Plugin Manifest - schema manifest đầy đủ