Skip to main content

Kênh và định tuyến

OpenClaw định tuyến phản hồi trở lại kênh nơi tin nhắn được gửi đến. Mô hình không chọn kênh; việc định tuyến mang tính xác định và do cấu hình máy chủ kiểm soát. Với phạm vi tin nhắn trực tiếp mặc định, tin nhắn trực tiếp từ mọi kênh đều hội tụ vào phiên chính của tác tử.

Thuật ngữ chính

  • Kênh: một plugin kênh đi kèm như discord, googlechat, imessage, irc, line, signal, slack, telegram hoặc whatsapp, cùng với các kênh plugin đã cài đặt. webchat là kênh giao diện người dùng WebChat nội bộ và không phải là kênh gửi đi có thể cấu hình.
  • AccountId: phiên bản tài khoản theo từng kênh (khi được hỗ trợ).
  • Tài khoản mặc định tùy chọn của kênh: channels.<channel>.defaultAccount chọn tài khoản được sử dụng khi đường dẫn gửi đi không chỉ định accountId.
    • Trong thiết lập nhiều tài khoản, hãy đặt một tài khoản mặc định rõ ràng (defaultAccount hoặc tài khoản có tên default) khi cấu hình từ hai tài khoản trở lên. Nếu không, định tuyến dự phòng có thể chọn ID tài khoản đã chuẩn hóa đầu tiên.
  • AgentId: một không gian làm việc + kho phiên biệt lập (“bộ não”).
  • SessionKey: khóa nhóm dùng để lưu trữ ngữ cảnh và kiểm soát tính đồng thời.

Tiền tố đích gửi đi

Đích gửi đi được chỉ định rõ ràng có thể bao gồm tiền tố nhà cung cấp, chẳng hạn như telegram:123 hoặc tg:123. Phần lõi chỉ coi tiền tố đó là gợi ý chọn kênh khi kênh được chọn là last hoặc chưa được phân giải, và chỉ khi plugin đã tải công bố hỗ trợ tiền tố đó. Nếu bên gọi đã chọn rõ một kênh, tiền tố nhà cung cấp phải khớp với kênh đó; các tổ hợp chéo kênh như gửi WhatsApp đến telegram:123 sẽ thất bại trước bước chuẩn hóa đích dành riêng cho plugin. Các tiền tố loại đích và dịch vụ như channel:<id>, user:<id>, room:<id>, thread:<id>, imessage:<handle>sms:<number> vẫn nằm trong cú pháp của kênh đã chọn. Bản thân chúng không chọn nhà cung cấp.

Dạng khóa phiên (ví dụ)

Theo mặc định, tin nhắn trực tiếp được gộp vào phiên chính của tác tử:
  • agent:<agentId>:<mainKey> (mặc định: agent:main:main)
session.dmScope kiểm soát việc gộp tin nhắn trực tiếp: main (mặc định) dùng chung một phiên chính, còn per-peer, per-channel-peerper-account-channel-peer giữ tin nhắn trực tiếp trong các phiên riêng biệt. Một liên kết định tuyến có thể ghi đè phạm vi cho các đối tác ngang hàng khớp với nó qua bindings[].session.dmScope. Ngay cả khi lịch sử hội thoại tin nhắn trực tiếp được dùng chung với phiên chính, sandbox và chính sách công cụ vẫn sử dụng khóa thời gian chạy trò chuyện trực tiếp được suy ra theo từng tài khoản cho tin nhắn trực tiếp bên ngoài để các tin nhắn bắt nguồn từ kênh không bị xử lý như lượt chạy phiên chính cục bộ. Các nhóm và kênh vẫn được tách biệt theo từng kênh:
  • Nhóm: agent:<agentId>:<channel>:group:<id>
  • Kênh/phòng: agent:<agentId>:<channel>:channel:<id>
Luồng:
  • Các luồng Slack/Discord nối thêm :thread:<threadId> vào khóa cơ sở.
  • Các chủ đề diễn đàn Telegram nhúng :topic:<topicId> vào khóa nhóm.
Ví dụ:
  • agent:main:telegram:group:-1001234567890:topic:42
  • agent:main:discord:channel:123456:thread:987654

Ghim tuyến tin nhắn trực tiếp chính

Khi session.dmScopemain, các tin nhắn trực tiếp có thể dùng chung một phiên chính. Để ngăn lastRoute của phiên bị ghi đè bởi tin nhắn trực tiếp từ người không phải chủ sở hữu, OpenClaw suy ra một chủ sở hữu được ghim từ allowFrom khi tất cả các điều kiện sau đều đúng:
  • allowFrom có đúng một mục không phải ký tự đại diện.
  • Mục đó có thể được chuẩn hóa thành ID người gửi cụ thể cho kênh đó.
  • Người gửi tin nhắn trực tiếp đến không khớp với chủ sở hữu được ghim đó.
Trong trường hợp không khớp này, OpenClaw vẫn ghi lại siêu dữ liệu phiên đến, nhưng bỏ qua việc cập nhật lastRoute của phiên chính.

Ghi nhận đầu vào có bảo vệ

Plugin kênh có thể đánh dấu bản ghi phiên đến là createIfMissing: false khi một đường dẫn có bảo vệ không được tạo phiên OpenClaw mới. Trong chế độ đó, OpenClaw có thể cập nhật siêu dữ liệu và lastRoute cho một phiên hiện có, nhưng không tạo mục phiên chỉ dành cho tuyến chỉ vì đã quan sát thấy một tin nhắn.

Quy tắc định tuyến (cách chọn tác tử)

Định tuyến chọn một tác tử cho mỗi tin nhắn đến:
  1. Khớp chính xác đối tác ngang hàng (bindings với peer.kind + peer.id).
  2. Khớp đối tác ngang hàng cha (kế thừa luồng).
  3. Khớp ký tự đại diện đối tác ngang hàng (peer.id: "*" cho một loại đối tác ngang hàng).
  4. Khớp máy chủ + vai trò (Discord) qua guildId + roles.
  5. Khớp máy chủ (Discord) qua guildId.
  6. Khớp nhóm làm việc (Slack) qua teamId.
  7. Khớp tài khoản (accountId trên kênh).
  8. Khớp kênh (bất kỳ tài khoản nào trên kênh đó, accountId: "*").
  9. Tác tử mặc định (agents.list[].default, nếu không thì mục đầu tiên trong danh sách, dự phòng về main).
Khi một liên kết bao gồm nhiều trường khớp (peer, guildId, teamId, roles), tất cả các trường được cung cấp đều phải khớp để liên kết đó được áp dụng. Tác tử khớp xác định không gian làm việc và kho phiên nào được sử dụng.

Nhóm phát sóng (chạy nhiều tác tử)

Nhóm phát sóng cho phép chạy nhiều tác tử cho cùng một đối tác ngang hàng khi OpenClaw thông thường sẽ phản hồi (ví dụ: trong các nhóm WhatsApp, sau bước kiểm soát đề cập/kích hoạt). Cấu hình:
Xem: Nhóm phát sóng.

Tổng quan cấu hình

  • agents.list: các định nghĩa tác tử có tên (không gian làm việc, mô hình, v.v.).
  • bindings: ánh xạ các kênh/tài khoản/đối tác ngang hàng đến với tác tử.
Ví dụ:

Lưu trữ phiên

Các hàng phiên thời gian chạy nằm trong cơ sở dữ liệu SQLite của từng tác tử dưới thư mục trạng thái (mặc định ~/.openclaw):
  • ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
Các bản cài đặt cũ hơn có thể có tệp bản ghi hội thoại JSONL cũ và kho hàng sessions.json trong ~/.openclaw/agents/<agentId>/sessions/. Quá trình khởi động Gateway và openclaw doctor --fix tự động nhập các hàng/lịch sử cũ đang hoạt động vào SQLite. Sử dụng openclaw doctor --session-sqlite inspect --session-sqlite-all-agents và trình tự xác thực Doctor khi cần bằng chứng di chuyển rõ ràng. Bạn vẫn có thể chọn đường dẫn kho cũ qua khuôn mẫu session.store{agentId} cho quy trình di chuyển và bảo trì ngoại tuyến. Khả năng khám phá phiên của Gateway và ACP cũng quét các kho tác tử dựa trên ổ đĩa trong gốc agents/ mặc định và trong các gốc session.store dùng khuôn mẫu. Các kho được phát hiện phải nằm trong gốc tác tử đã phân giải đó và sử dụng tệp sessions.json cũ thông thường. Các liên kết tượng trưng và đường dẫn ngoài gốc sẽ bị bỏ qua.

Hành vi WebChat

WebChat gắn vào tác tử đã chọn và mặc định sử dụng phiên chính của tác tử. Vì vậy, WebChat cho phép xem ngữ cảnh chéo kênh của tác tử đó tại một nơi.

Ngữ cảnh phản hồi

Phản hồi đến bao gồm:
  • ReplyToId, ReplyToBodyReplyToSender khi có.
  • Ngữ cảnh được trích dẫn được nối vào Body dưới dạng khối [Replying to ...].
Hành vi này nhất quán trên mọi kênh.

Liên quan