Channel 独立性说明:每个外部服务都有独立的 Channel
核心结论
每个外部服务(Telegram、WhatsApp、Discord、Slack 等)都有自己独立的 Channel Plugin!
它们不是共用同一个 Channel,而是:
- 每个服务有独立的实现
- 每个服务有独立的配置
- 每个服务有独立的能力声明
- 每个服务有独立的消息处理逻辑
一、源码证据
1. 独立的 Channel Plugin 实现
Telegram Channel Plugin
文件:
extensions/telegram/index.ts文件:
extensions/telegram/src/channel.ts(前 150 行)WhatsApp Channel Plugin
文件:
extensions/whatsapp/index.ts文件:
extensions/whatsapp/src/channel.ts(前 150 行)2. Channel 注册表管理
文件:
src/channels/registry.ts(前 100 行)文件:
src/channels/plugins/index.ts3. Channel Dock(轻量级元数据)
文件:
src/channels/dock.ts(部分代码)二、关键差异对比
对比表:Telegram vs WhatsApp vs Discord
特性 | Telegram | WhatsApp | Discord |
Channel ID | "telegram" | "whatsapp" | "discord" |
插件文件 | extensions/telegram/ | extensions/whatsapp/ | extensions/discord/ |
聊天类型 | direct, group, channel, thread | direct, group | direct, channel, thread |
原生命令 | ✅ 支持 | ❌ 不支持 | ✅ 支持 |
线程支持 | ✅ 支持 | ❌ 不支持 | ✅ 支持 |
流式输出 | ✅ 支持(blockStreaming) | ❌ 不支持 | ✅ 支持(coalesce) |
投票功能 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
文本限制 | 4000 字符 | 4000 字符 | 2000 字符 |
配对 ID 标签 | telegramUserId | whatsappSenderId | Discord User ID |
认证方式 | Bot Token | QR Code (Web) | Bot Token |
配置路径 | channels.telegram | channels.whatsapp | channels.discord |
账号格式化 | 移除 telegram: 前缀 | E.164 电话号码格式 | 小写用户 ID |
能力声明对比
关键差异:
- Telegram 支持
channel 类型(频道),WhatsApp 不支持
- WhatsApp 支持 polls(投票),Telegram 不支持
- Discord 不支持 group 类型,但支持 channel 和 thread
- 每个 Channel 的能力完全独立定义三、为什么每个服务需要独立的 Channel?
1. 协议差异
Telegram Bot API:
WhatsApp Web Protocol:
Discord Bot API:
结论:每个服务的消息格式完全不同,必须有独立的解析逻辑。
2. 认证方式差异
服务 | 认证方式 | 配置示例 |
Telegram | Bot Token | botToken: "123456:ABC-DEF..." |
WhatsApp | QR Code 扫码 | 扫码后自动保存 session |
Discord | Bot Token + Application ID | token: "...", applicationId: "..." |
Slack | OAuth + Socket Mode | token: "xoxb-...", appToken: "xapp-..." |
Signal | signal-cli 链接设备 | 需要外部 signal-cli 服务 |
结论:每个服务的认证流程完全不同,必须有独立的认证逻辑。
3. 功能特性差异
功能 | Telegram | WhatsApp | Discord | Slack |
频道(Channel) | ✅ | ❌ | ✅ | ✅ |
线程(Thread) | ✅ | ❌ | ✅ | ✅ |
投票(Poll) | ❌ | ✅ | ✅ | ✅ |
表情回应 | ✅ | ✅ | ✅ | ✅ |
原生命令 | ✅ | ❌ | ✅ | ✅ |
文件上传 | ✅ | ✅ | ✅ | ✅ |
语音消息 | ✅ | ✅ | ✅ | ❌ |
结论:每个服务支持的功能不同,必须有独立的能力声明。
4. 消息发送差异
Telegram 发送消息:
WhatsApp 发送消息:
Discord 发送消息:
结论:每个服务的发送 API 完全不同,必须有独立的发送逻辑。
四、Channel Plugin 的统一接口
虽然每个 Channel 的实现完全独立,但它们都遵循统一的
ChannelPlugin 接口:关键点:
- 统一接口:所有 Channel 都实现相同的接口
- 独立实现:每个 Channel 的实现完全独立
- 适配器模式:通过适配器屏蔽底层差异
五、Gateway 如何使用不同的 Channel
1. 注册阶段
2. 消息接收阶段
关键:虽然 Telegram 和 WhatsApp 的原始消息格式完全不同,但通过各自的 Channel Plugin 转换为统一格式后,Gateway 可以统一处理。
3. 消息发送阶段
关键:Gateway 根据消息来源的
channel 字段,动态获取对应的 Channel Plugin,调用其 outbound 适配器发送消息。六、配置示例
独立配置不同的 Channel
关键点:
- 每个 Channel 有独立的配置节
- 每个 Channel 的配置格式不同
- 每个 Channel 可以有多个账号
七、总结
核心要点
- 每个外部服务都有独立的 Channel Plugin:
- Telegram →
extensions/telegram/ - WhatsApp →
extensions/whatsapp/ - Discord →
extensions/discord/ - Slack →
extensions/slack/ - … 更多
- 每个 Channel 的实现完全独立:
- 独立的消息解析逻辑
- 独立的认证方式
- 独立的能力声明
- 独立的配置格式
- 独立的发送逻辑
- 统一的接口,独立的实现:
- 所有 Channel 都实现
ChannelPlugin接口 - 通过适配器模式屏蔽底层差异
- Gateway 通过统一接口调用不同的 Channel
- PluginRegistry 管理所有 Channel:
- 所有 Channel 注册到 PluginRegistry
- Gateway 从 PluginRegistry 获取 Channel
- 支持动态加载和卸载
- 可扩展性:
- 添加新的外部服务只需创建新的 Channel Plugin
- 无需修改 Gateway 核心代码
- 无需修改其他 Channel 的代码
类比理解
Channel 就像不同的”翻译器”:
关键:
- 每个外部服务说”不同的语言”(不同的协议)
- 每个 Channel Plugin 是”专门的翻译器”
- Gateway 只需要理解”统一的语言”(统一格式)
- 添加新服务 = 添加新翻译器
回答你的问题
问题:接入 Telegram 和 WhatsApp,所用的 Channel 是一样的吗?
答案:不一样!
- Telegram 使用
extensions/telegram/的 Telegram Channel Plugin
- WhatsApp 使用
extensions/whatsapp/的 WhatsApp Channel Plugin
- 它们是完全独立的实现
- 它们只是都遵循相同的
ChannelPlugin接口
- Gateway 通过统一接口调用它们,但底层实现完全不同
证据:
1. 独立的插件文件:
extensions/telegram/ vs extensions/whatsapp/
2. 独立的 Channel ID:"telegram" vs "whatsapp"
3. 独立的能力声明:Telegram 支持 4 种聊天类型,WhatsApp 只支持 2 种
4. 独立的配置路径:channels.telegram vs channels.whatsapp
5. 独立的注册:api.registerChannel({ plugin: telegramPlugin }) vs api.registerChannel({ plugin: whatsappPlugin })结论:每个外部服务都需要自己专属的 Channel Plugin!
Loading...
