Tài liệu này là nguồn tham khảo chính thức về cấu hình channel trong ZeroClaw.
Với các phòng Matrix được mã hóa, xem hướng dẫn chuyên biệt:
- Cần tham khảo config đầy đủ theo từng channel: xem mục
## 4. Ví dụ cấu hình theo từng channel. - Cần chẩn đoán khi không nhận được phản hồi: xem mục
## 6. Danh sách kiểm tra xử lý sự cố. - Cần hỗ trợ phòng Matrix được mã hóa: dùng Hướng dẫn Matrix E2EE.
- Cần thông tin triển khai/mạng (polling vs webhook): dùng Network Deployment.
Đây là triệu chứng phổ biến nhất (cùng loại với issue #499). Kiểm tra theo thứ tự sau:
- Allowlist không khớp:
allowed_userskhông bao gồm người gửi (hoặc để trống). - Room đích sai: bot chưa tham gia room được cấu hình
room_id/ alias. - Token/tài khoản không khớp: token hợp lệ nhưng thuộc tài khoản Matrix khác.
- Thiếu E2EE device identity:
whoamikhông trả vềdevice_idvà config không cung cấp giá trị này. - Thiếu key sharing/trust: các khóa room chưa được chia sẻ cho thiết bị bot, nên không thể giải mã sự kiện mã hóa.
- Trạng thái runtime cũ: config đã thay đổi nhưng
zeroclaw daemonchưa được khởi động lại.
Tất cả cài đặt channel nằm trong channels_config trong ~/.zeroclaw/config.toml.
[channels_config]
cli = trueMỗi channel được bật bằng cách tạo sub-table tương ứng (ví dụ: [channels_config.telegram]).
Khi chạy zeroclaw channel start (hoặc chế độ daemon), Telegram và Discord hỗ trợ chuyển đổi runtime theo phạm vi người gửi:
/models— hiển thị các provider hiện có và lựa chọn hiện tại/models <provider>— chuyển provider cho phiên người gửi hiện tại/model— hiển thị model hiện tại và các model ID đã cache (nếu có)/model <model-id>— chuyển model cho phiên người gửi hiện tại
Lưu ý:
- Việc chuyển đổi chỉ xóa lịch sử hội thoại trong bộ nhớ của người gửi đó, tránh ô nhiễm ngữ cảnh giữa các model.
- Xem trước bộ nhớ cache model từ
zeroclaw models refresh --provider <ID>. - Đây là lệnh chat runtime, không phải lệnh con CLI.
ZeroClaw hỗ trợ đầu vào multimodal qua các marker nội tuyến trong tin nhắn:
- Cú pháp:
[IMAGE:<source>] <source>có thể là:- Đường dẫn file cục bộ
- Data URI (
data:image/...;base64,...) - URL từ xa chỉ khi
[multimodal].allow_remote_fetch = true
Lưu ý vận hành:
- Marker được phân tích trong các tin nhắn người dùng trước khi gọi provider.
- Capability của provider được kiểm tra tại runtime: nếu provider không hỗ trợ vision, request thất bại với lỗi capability có cấu trúc (
capability=vision). - Các phần
mediacủa Linq webhook có MIME typeimage/*được tự động chuyển đổi sang định dạng marker này.
Hỗ trợ Matrix được kiểm soát tại thời điểm biên dịch bằng Cargo feature channel-matrix.
- Các bản build mặc định đã bao gồm hỗ trợ Matrix (
default = ["hardware", "channel-matrix"]). - Để lặp lại nhanh hơn khi không cần Matrix:
cargo check --no-default-features --features hardware- Để bật tường minh hỗ trợ Matrix trong feature set tùy chỉnh:
cargo check --no-default-features --features hardware,channel-matrixNếu [channels_config.matrix] có mặt nhưng binary được build mà không có channel-matrix, các lệnh zeroclaw channel list, zeroclaw channel doctor, và zeroclaw channel start sẽ ghi log rằng Matrix bị bỏ qua có chủ ý trong bản build này.
| Channel | Chế độ nhận | Cần cổng inbound công khai? |
|---|---|---|
| CLI | local stdin/stdout | Không |
| Telegram | polling | Không |
| Discord | gateway/websocket | Không |
| Slack | events API | Không (luồng token-based) |
| Mattermost | polling | Không |
| Matrix | sync API (hỗ trợ E2EE) | Không |
| Signal | signal-cli HTTP bridge | Không (endpoint bridge cục bộ) |
| webhook (Cloud API) hoặc websocket (Web mode) | Cloud API: Có (HTTPS callback công khai), Web mode: Không | |
| Webhook | gateway endpoint (/webhook) |
Thường là có |
| IMAP polling + SMTP send | Không | |
| IRC | IRC socket | Không |
| Lark/Feishu | websocket (mặc định) hoặc webhook | Chỉ ở chế độ Webhook |
| DingTalk | stream mode | Không |
| bot gateway | Không | |
| iMessage | tích hợp cục bộ | Không |
Với các channel có allowlist người gửi:
- Allowlist trống: từ chối tất cả tin nhắn đầu vào.
"*": cho phép tất cả người gửi (chỉ dùng để xác minh tạm thời).- Danh sách tường minh: chỉ cho phép những người gửi được liệt kê.
Tên trường khác nhau theo channel:
allowed_users(Telegram/Discord/Slack/Mattermost/Matrix/IRC/Lark/DingTalk/QQ)allowed_from(Signal)allowed_numbers(WhatsApp)allowed_senders(Email)allowed_contacts(iMessage)
[channels_config.telegram]
bot_token = "123456:telegram-token"
allowed_users = ["*"]
stream_mode = "off" # tùy chọn: off | partial
draft_update_interval_ms = 1000 # tùy chọn: giới hạn tần suất chỉnh sửa khi streaming một phần
mention_only = false # tùy chọn: yêu cầu @mention trong nhóm
interrupt_on_new_message = false # tùy chọn: hủy yêu cầu đang xử lý cùng người gửi cùng chatLưu ý về Telegram:
interrupt_on_new_message = truegiữ lại các lượt người dùng bị gián đoạn trong lịch sử hội thoại, sau đó khởi động lại việc tạo nội dung với tin nhắn mới nhất.- Phạm vi gián đoạn rất chặt chẽ: cùng người gửi trong cùng chat. Tin nhắn từ các chat khác nhau được xử lý độc lập.
[channels_config.discord]
bot_token = "discord-bot-token"
guild_id = "123456789012345678" # tùy chọn
allowed_users = ["*"]
listen_to_bots = false
mention_only = false[channels_config.slack]
bot_token = "xoxb-..."
app_token = "xapp-..." # tùy chọn
channel_id = "C1234567890" # tùy chọn
allowed_users = ["*"][channels_config.mattermost]
url = "https://mm.example.com"
bot_token = "mattermost-token"
channel_id = "channel-id" # bắt buộc để lắng nghe
allowed_users = ["*"][channels_config.matrix]
homeserver = "https://matrix.example.com"
access_token = "syt_..."
user_id = "@zeroclaw:matrix.example.com" # tùy chọn, khuyến nghị cho E2EE
device_id = "DEVICEID123" # tùy chọn, khuyến nghị cho E2EE
room_id = "!room:matrix.example.com" # hoặc room alias (#ops:matrix.example.com)
allowed_users = ["*"]Xem Hướng dẫn Matrix E2EE để xử lý sự cố phòng mã hóa.
[channels_config.signal]
http_url = "http://127.0.0.1:8686"
account = "+1234567890"
group_id = "dm" # tùy chọn: "dm" / group id / bỏ qua
allowed_from = ["*"]
ignore_attachments = false
ignore_stories = trueZeroClaw hỗ trợ hai backend WhatsApp:
- Chế độ Cloud API (
phone_number_id+access_token+verify_token) - Chế độ WhatsApp Web (
session_path, yêu cầu build flag--features whatsapp-web)
Chế độ Cloud API:
[channels_config.whatsapp]
access_token = "EAAB..."
phone_number_id = "123456789012345"
verify_token = "your-verify-token"
app_secret = "your-app-secret" # tùy chọn nhưng được khuyến nghị
allowed_numbers = ["*"]Chế độ WhatsApp Web:
[channels_config.whatsapp]
session_path = "~/.zeroclaw/state/whatsapp-web/session.db"
pair_phone = "15551234567" # tùy chọn; bỏ qua để dùng QR flow
pair_code = "" # tùy chọn pair code tùy chỉnh
allowed_numbers = ["*"]Lưu ý:
- Build với
cargo build --features whatsapp-web(hoặc lệnh run tương đương). - Giữ
session_pathtrên bộ nhớ lưu trữ bền vững để tránh phải liên kết lại sau khi khởi động lại. - Định tuyến trả lời sử dụng JID của chat nguồn, vì vậy cả trả lời trực tiếp và nhóm đều hoạt động đúng.
channels_config.webhook bật hành vi gateway đặc thù cho webhook.
[channels_config.webhook]
port = 8080
secret = "optional-shared-secret"Chạy với gateway/daemon và xác minh /health.
[channels_config.email]
imap_host = "imap.example.com"
imap_port = 993
imap_folder = "INBOX"
smtp_host = "smtp.example.com"
smtp_port = 465
smtp_tls = true
username = "bot@example.com"
password = "email-password"
from_address = "bot@example.com"
poll_interval_secs = 60
allowed_senders = ["*"][channels_config.irc]
server = "irc.libera.chat"
port = 6697
nickname = "zeroclaw-bot"
username = "zeroclaw" # tùy chọn
channels = ["#zeroclaw"]
allowed_users = ["*"]
server_password = "" # tùy chọn
nickserv_password = "" # tùy chọn
sasl_password = "" # tùy chọn
verify_tls = true[channels_config.lark]
app_id = "cli_xxx"
app_secret = "xxx"
encrypt_key = "" # tùy chọn
verification_token = "" # tùy chọn
allowed_users = ["*"]
use_feishu = false
receive_mode = "websocket" # hoặc "webhook"
port = 8081 # bắt buộc ở chế độ webhookHỗ trợ onboarding tương tác:
zeroclaw onboard --interactiveTrình hướng dẫn bao gồm bước Lark/Feishu chuyên biệt với:
- Chọn khu vực (
Feishu (CN)hoặcLark (International)) - Xác minh thông tin xác thực với endpoint auth của Open Platform chính thức
- Chọn chế độ nhận (
websockethoặcwebhook) - Tùy chọn nhập verification token webhook (khuyến nghị để tăng cường kiểm tra tính xác thực của callback)
Hành vi token runtime:
tenant_access_tokenđược cache với thời hạn làm mới dựa trênexpire/expires_intừ phản hồi xác thực.- Các yêu cầu gửi tự động thử lại một lần sau khi token bị vô hiệu hóa khi Feishu/Lark trả về HTTP
401hoặc mã lỗi nghiệp vụ99991663(Invalid access token). - Nếu lần thử lại vẫn trả về phản hồi token không hợp lệ, lời gọi gửi sẽ thất bại với trạng thái/nội dung upstream để dễ xử lý sự cố hơn.
[channels_config.dingtalk]
client_id = "ding-app-key"
client_secret = "ding-app-secret"
allowed_users = ["*"][channels_config.qq]
app_id = "qq-app-id"
app_secret = "qq-app-secret"
allowed_users = ["*"][channels_config.imessage]
allowed_contacts = ["*"]- Cấu hình một channel với allowlist rộng (
"*") để xác minh ban đầu. - Chạy:
zeroclaw onboard --channels-only
zeroclaw daemon- Gửi tin nhắn từ người gửi dự kiến.
- Xác nhận nhận được phản hồi.
- Siết chặt allowlist từ
"*"thành các ID cụ thể.
Nếu channel có vẻ đã kết nối nhưng không phản hồi:
- Xác nhận danh tính người gửi được cho phép bởi trường allowlist đúng.
- Xác nhận tài khoản bot đã là thành viên/có quyền trong room/channel đích.
- Xác nhận token/secret hợp lệ (và chưa hết hạn/bị thu hồi).
- Xác nhận giả định về chế độ truyền tải:
- Các channel polling/websocket không cần HTTP inbound công khai
- Các channel webhook cần HTTPS callback có thể truy cập được
- Khởi động lại
zeroclaw daemonsau khi thay đổi config.
Đặc biệt với các phòng Matrix mã hóa, dùng:
Dùng phụ lục này để phân loại sự cố nhanh. Khớp từ khóa log trước, sau đó thực hiện các bước xử lý sự cố ở trên.
RUST_LOG=info zeroclaw daemon 2>&1 | tee /tmp/zeroclaw.logSau đó lọc các sự kiện channel/gateway:
rg -n "Matrix|Telegram|Discord|Slack|Mattermost|Signal|WhatsApp|Email|IRC|Lark|DingTalk|QQ|iMessage|Webhook|Channel" /tmp/zeroclaw.log| Thành phần | Tín hiệu khởi động / hoạt động bình thường | Tín hiệu ủy quyền / chính sách | Tín hiệu truyền tải / lỗi |
|---|---|---|---|
| Telegram | Telegram channel listening for messages... |
Telegram: ignoring message from unauthorized user: |
Telegram poll error: / Telegram parse error: / Telegram polling conflict (409): |
| Discord | Discord: connected and identified |
Discord: ignoring message from unauthorized user: |
Discord: received Reconnect (op 7) / Discord: received Invalid Session (op 9) |
| Slack | Slack channel listening on # |
Slack: ignoring message from unauthorized user: |
Slack poll error: / Slack parse error: |
| Mattermost | Mattermost channel listening on |
Mattermost: ignoring message from unauthorized user: |
Mattermost poll error: / Mattermost parse error: |
| Matrix | Matrix channel listening on room / Matrix room ... is encrypted; E2EE decryption is enabled via matrix-sdk. |
Matrix whoami failed; falling back to configured session hints for E2EE session restore: / Matrix whoami failed while resolving listener user_id; using configured user_id hint: |
Matrix sync error: ... retrying... |
| Signal | Signal channel listening via SSE on |
(kiểm tra allowlist được thực thi bởi allowed_from) |
Signal SSE returned ... / Signal SSE connect error: |
| WhatsApp (channel) | WhatsApp channel active (webhook mode). / WhatsApp Web connected successfully |
WhatsApp: ignoring message from unauthorized number: / WhatsApp Web: message from ... not in allowed list |
WhatsApp send failed: / WhatsApp Web stream error: |
| Webhook / WhatsApp (gateway) | WhatsApp webhook verified successfully |
Webhook: rejected — not paired / invalid bearer token / Webhook: rejected request — invalid or missing X-Webhook-Secret / WhatsApp webhook verification failed — token mismatch |
Webhook JSON parse error: |
Email polling every ... / Email sent to ... |
Blocked email from ... |
Email poll failed: / Email poll task panicked: |
|
| IRC | IRC channel connecting to ... / IRC registered as ... |
(kiểm tra allowlist được thực thi bởi allowed_users) |
IRC SASL authentication failed (...) / IRC server does not support SASL... / IRC nickname ... is in use, trying ... |
| Lark / Feishu | Lark: WS connected / Lark event callback server listening on |
Lark WS: ignoring ... (not in allowed_users) / Lark: ignoring message from unauthorized user: |
Lark: ping failed, reconnecting / Lark: heartbeat timeout, reconnecting / Lark: WS read error: |
| DingTalk | DingTalk: connected and listening for messages... |
DingTalk: ignoring message from unauthorized user: |
DingTalk WebSocket error: / DingTalk: message channel closed |
QQ: connected and identified |
QQ: ignoring C2C message from unauthorized user: / QQ: ignoring group message from unauthorized user: |
QQ: received Reconnect (op 7) / QQ: received Invalid Session (op 9) / QQ: message channel closed |
|
| iMessage | iMessage channel listening (AppleScript bridge)... |
(allowlist liên hệ được thực thi bởi allowed_contacts) |
iMessage poll error: |
Nếu một channel task cụ thể bị crash hoặc thoát, channel supervisor trong channels/mod.rs phát ra:
Channel <name> exited unexpectedly; restartingChannel <name> error: ...; restartingChannel message worker crashed:
Các thông báo này xác nhận cơ chế tự restart đang hoạt động. Kiểm tra log trước đó để tìm nguyên nhân gốc rễ.