Channels 通道系统概述
OpenClaw 的通道系统将各种即时通讯平台(Telegram、Discord、WhatsApp、Slack 等)统一抽象成一致的接口,让 AI Agent 无需关心消息来自哪个平台。
源码位置
src/channels/ # 通道抽象层
├── plugins/ # 通道插件类型定义
│ └── types.ts # ChannelPlugin 核心接口
├── dock.ts # ChannelDock 元数据注册
├── registry.ts # 通道注册表
├── channel-config.ts # 通道配置解析
├── mention-gating.ts # @提及 门控
├── command-gating.ts # 命令门控
├── conversation-label.ts # 对话标签
├── sender-identity.ts # 发送者身份
├── sender-label.ts # 发送者标签
├── session.ts # 通道会话
├── typing.ts # 输入状态
├── targets.ts # 消息目标
├── location.ts # 位置信息
├── ack-reactions.ts # 确认反应
├── reply-prefix.ts # 回复前缀
├── logging.ts # 通道日志
└── allowlists/ # 白名单
src/telegram/ # Telegram 实现 (~87 files)
src/discord/ # Discord 实现 (~44 files)
src/slack/ # Slack 实现 (~36 files)
src/signal/ # Signal 实现 (~24 files)
src/imessage/ # iMessage 实现 (~16 files)
src/line/ # LINE 实现 (~36 files)
src/whatsapp/ # WhatsApp 实现
src/web/ # WebChat 实现 (~48 files)双层抽象
OpenClaw 的通道系统使用双层抽象:
| 层 | 文件 | 职责 | 加载时机 |
|---|---|---|---|
| Plugin | channels/plugins/types.ts | 运行时操作:发送、接收、登录 | 按需加载 |
| Dock | channels/dock.ts | 轻量元数据:配置、能力、限制 | 启动时加载 |
支持的通道
Source: src/channels/registry.ts
typescript
// src/channels/registry.ts (simplified)
const CHAT_CHANNEL_ORDER = [
"telegram",
"whatsapp",
"discord",
"googlechat",
"slack",
"signal",
"imessage",
];每个通道的元数据:
| 通道 | SDK | 分块限制 | 特性 |
|---|---|---|---|
| Telegram | grammy | 4000 字符 | Markdown, 按钮, 投票 |
| Discord | discord.js | 2000 字符 | Embed, 线程, 反应 |
| Baileys | 不定 | 媒体, 群组 | |
| Slack | @slack/bolt | 不定 | Block Kit, 线程 |
| Signal | signal-cli | 不定 | 端到端加密 |
| iMessage | AppleScript | 不定 | macOS 专属 |
| LINE | LINE SDK | 不定 | Flex Message |
章节导航
- 通道抽象层 — ChannelPlugin 接口、ChannelDock 元数据
- Telegram 实现 — grammy 集成、消息发送与接收
- Discord 实现 — discord.js 集成、Embed 与线程
- 消息路由 — 出站投递、分块、幂等性