Channel独立性说明

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.ts

3. 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 类型,但支持 channelthread - 每个 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 可以有多个账号

七、总结

核心要点

  1. 每个外部服务都有独立的 Channel Plugin
      • Telegram → extensions/telegram/
      • WhatsApp → extensions/whatsapp/
      • Discord → extensions/discord/
      • Slack → extensions/slack/
      • … 更多
  1. 每个 Channel 的实现完全独立
      • 独立的消息解析逻辑
      • 独立的认证方式
      • 独立的能力声明
      • 独立的配置格式
      • 独立的发送逻辑
  1. 统一的接口,独立的实现
      • 所有 Channel 都实现 ChannelPlugin 接口
      • 通过适配器模式屏蔽底层差异
      • Gateway 通过统一接口调用不同的 Channel
  1. PluginRegistry 管理所有 Channel
      • 所有 Channel 注册到 PluginRegistry
      • Gateway 从 PluginRegistry 获取 Channel
      • 支持动态加载和卸载
  1. 可扩展性
      • 添加新的外部服务只需创建新的 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...