Plugin maintainer reference

API gửi đi của kênh

Các Plugin kênh cung cấp hành vi gửi tin nhắn đi từ openclaw/plugin-sdk/channel-outbound. Sử dụng openclaw/plugin-sdk/channel-inbound để điều phối việc nhận/ngữ cảnh/điều phối xử lý.

Lõi chịu trách nhiệm về xếp hàng đợi, tính bền vững, chính sách thử lại chung, hook, biên nhận và công cụ message dùng chung. Plugin chịu trách nhiệm về các lệnh gọi gửi/sửa/xóa gốc, chuẩn hóa đích, luồng hội thoại của nền tảng, trích dẫn được chọn, cờ thông báo, trạng thái tài khoản và các tác dụng phụ dành riêng cho nền tảng.

Bộ điều hợp

Hầu hết Plugin định nghĩa một bộ điều hợp message:

ts
   defineChannelMessageAdapter,  createMessageReceiptFromOutboundResults,} from "openclaw/plugin-sdk/channel-outbound"; export const demoMessageAdapter = defineChannelMessageAdapter({  id: "demo",  durableFinal: {    capabilities: {      text: true,      replyTo: true,      thread: true,      messageSendingHooks: true,    },  },  send: {    text: async ({ cfg, to, text, accountId, replyToId, threadId, signal }) => {      const sent = await sendDemoMessage({        cfg,        to,        text,        accountId: accountId ?? undefined,        replyToId: replyToId ?? undefined,        threadId: threadId == null ? undefined : String(threadId),        signal,      });       return {        receipt: createMessageReceiptFromOutboundResults({          results: [{ channel: "demo", messageId: sent.id, conversationId: to }],          kind: "text",          threadId: threadId == null ? undefined : String(threadId),          replyToId: replyToId ?? undefined,        }),      };    },  },});

Chỉ khai báo những khả năng mà cơ chế truyền tải gốc thực sự bảo toàn. Kiểm thử từng khả năng gửi, biên nhận, xem trước trực tiếp và xác nhận nhận đã khai báo bằng các trình trợ giúp hợp đồng được xuất từ đường dẫn con này.

Làm sạch văn bản thuần

Sử dụng sanitizeForPlainText(...) khi bộ điều hợp gửi đi cần chuyển đổi các thẻ định dạng HTML được hỗ trợ thành ký hiệu đánh dấu văn bản nhẹ. Mặc định giữ nguyên các dấu đánh dấu in đậm và gạch ngang theo kiểu trò chuyện hiện có. Chỉ truyền { style: "markdown" } khi kênh phân tích lại kết quả dưới dạng Markdown:

ts
 const chatText = sanitizeForPlainText(text);const markdownText = sanitizeForPlainText(text, { style: "markdown" });

Kiểu Markdown sử dụng **bold**~~strikethrough~~; chữ nghiêng và mã nội tuyến giữ các dấu _italic_ và dấu nháy ngược trong cả hai kiểu. Chọn kiểu tại ranh giới kênh thay vì viết lại văn bản đánh dấu sau khi làm sạch.

Bằng chứng phân phối

Một MessageReceipt ghi lại kết quả do bộ điều hợp kênh trả về. Các mã định danh tin nhắn cụ thể của nền tảng cho thấy đường dẫn gửi của nền tảng đã chấp nhận tin nhắn; chúng không chứng minh rằng thiết bị của người nhận đã hiển thị hoặc đọc tin nhắn đó. Các biên nhận không có mã định danh tin nhắn của nền tảng chỉ là siêu dữ liệu biên nhận cục bộ. Các kênh có biên nhận đã đọc hoặc trạng thái phân phối đến thiết bị nên theo dõi những thông tin đó thông qua một đường dẫn riêng dành riêng cho kênh.

Nếu bộ điều hợp kênh có thể chứng minh rằng việc thử lại một lỗi không thể tạo bản sao của lần gửi hiển thị cho người nhận và chưa có lệnh gọi nào có khả năng hoàn tất bắt đầu, hãy ném new PlatformMessageNotDispatchedError("...", { cause: error }) từ openclaw/plugin-sdk/error-runtime. Khi đó, lõi có thể xóa bằng chứng cũ về lần thử gửi và thử lại ý định đã xếp hàng một cách an toàn. Chỉ bộ điều hợp sở hữu ranh giới điều phối cuối cùng mới được đưa ra khẳng định này. Tuyệt đối không sử dụng dấu hiệu này sau khi một lệnh gọi hoàn tất/gửi bắt đầu hoặc trả về kết quả không rõ ràng; đánh dấu sai có thể gửi trùng tin nhắn.

Các bộ điều hợp gửi đi hiện có

Nếu kênh đã có bộ điều hợp outbound tương thích, hãy dẫn xuất bộ điều hợp tin nhắn thay vì sao chép mã gửi:

ts
 export const messageAdapter = createChannelMessageAdapterFromOutbound({  id: "demo",  outbound,  durableFinal: {    capabilities: {      text: true,      media: true,    },  },});

Gửi bền vững

Các trình trợ giúp gửi lúc chạy cũng nằm trong channel-outbound:

  • sendDurableMessageBatch(...)
  • withDurableMessageSendContext(...)
  • deliverInboundReplyWithMessageSendContext(...)
  • các trình trợ giúp truyền trực tuyến bản nháp/tiến trình như resolveChannelDraftStreamingChunking(...)

sendDurableMessageBatch(...) trả về một kết quả rõ ràng:

Kết quả Ý nghĩa
sent ít nhất một tin nhắn hiển thị trên nền tảng đã được đường dẫn gửi của nền tảng chấp nhận
suppressed không tin nhắn nền tảng nào nên bị coi là thiếu
partial_failed ít nhất một tin nhắn nền tảng đã được chấp nhận trước khi một tải trọng hoặc tác dụng phụ sau đó thất bại
failed không có biên nhận nền tảng nào được tạo

Sử dụng payloadOutcomes khi một lô kết hợp các tải trọng đã gửi, bị chặn và thất bại. Không suy ra việc hook hủy từ một kết quả phân phối trực tiếp cũ trống.

Chấp nhận phân phối trì hoãn

Sử dụng message.durableFinal.admitDeferredDelivery(...) khi một tài khoản đã phân giải không thể chấp nhận an toàn việc gửi đi hoặc phân phối trì hoãn do lõi quản lý. Lõi gọi hook này một cách đồng bộ trước công việc gửi đi trực tiếp, bao gồm cả các đường dẫn bỏ qua việc lưu bền hàng đợi, và gọi lại trước khi phát lại một ý định đã khôi phục. Ngữ cảnh bao gồm cfg, channel, to, accountIdphaselive hoặc recovery.

Trả về { status: "allowed" } để tiếp tục. Trả về { status: "permanent_rejection", reason } khi lượt phân phối không được phép lưu bền, gửi trực tiếp hoặc phát lại. Một lần từ chối trực tiếp sẽ thất bại trước khi tạo hàng đợi, chạy hook tin nhắn hoặc thực hiện công việc trên nền tảng. Một lần từ chối khi khôi phục đánh dấu bản ghi trong hàng đợi là thất bại và bỏ qua việc đối soát cũng như phát lại. Không cung cấp hook đồng nghĩa với được phép.

Hook là một quyết định chấp nhận đồng bộ, không phải đường dẫn gửi. Chỉ đọc cấu hình hoặc trạng thái lúc chạy đã được tải; không thực hiện I/O mạng, hệ thống tệp hay I/O bất đồng bộ khác. Các kiểm thử hợp đồng nên kiểm tra cả hai giai đoạn và cả hai biến thể kết quả thông qua ChannelMessageDurableFinalAdapter từ openclaw/plugin-sdk/channel-outbound.

Điều phối tương thích

Xây dựng việc điều phối phản hồi đầu vào thông qua dispatchChannelInboundReply(...) từ channel-inbound. Giữ việc phân phối qua nền tảng trong bộ điều hợp phân phối; sử dụng channel-outbound cho các bộ điều hợp tin nhắn, gửi bền vững, biên nhận, xem trước trực tiếp và các tùy chọn quy trình phản hồi.

Was this useful?
On this page

On this page