问题域/PD-19

多渠道消息适配

Multi-Channel Messaging Adapter

统一抽象多个聊天平台(IM/Email/社交)的消息收发接口,通过适配器模式和消息总线解耦渠道实现与核心业务逻辑,支持动态注册和生命周期管理。

子问题

1.平台 API 差异抽象(WebSocket vs HTTP vs SDK)

2.消息格式统一(文本/图片/文件/富文本)

3.权限控制(allow_from 白名单)

4.消息路由与会话隔离

5.渠道生命周期管理(启动/停止/重连)

6.消息去重策略差异(OrderedDict vs deque vs set,各渠道独立实现)

7.WebSocket 到 HTTP 轮询的自动降级与恢复

8.跨线程事件桥接(飞书 SDK 回调在独立线程,需 run_coroutine_threadsafe)

9.出站消息进度过滤(区分最终回复与中间状态推送)

10.显式用户授权门控(Email 的 consent_granted 机制)

各项目的解法1 solutions

Signals

横向对比

维度Nanobot
适配器基类ABC 定义 start/stop/send + _handle_message 模板方法 + is_allowed 权限检查
消息总线双向 asyncio.Queue,零依赖,无持久化
渠道数量9 个(Telegram/WhatsApp/Discord/Feishu/Slack/DingTalk/QQ/Email/Mochat)
连接策略混合:长轮询/WebSocket/Socket Mode/IMAP,各渠道独立实现
格式转换每渠道独立转换(Markdown→HTML/mrkdwn/Card JSON),无统一中间格式
权限控制基类 allow_from 白名单 + Slack 分层策略(DM/群组/mention)
容错机制各渠道自带重连循环(5s),Mochat 有 WebSocket→HTTP 轮询降级
消息去重Feishu OrderedDict/QQ deque/Mochat set,各渠道独立实现
配置方式Pydantic BaseSettings + camelCase 别名,YAML/ENV 统一配置

最佳实践

1.使用 ABC 基类定义统一接口(start/stop/send),通过 MessageBus 异步队列解耦

2.每个渠道独立配置,支持 allow_from 白名单控制访问权限

3.延迟导入渠道 SDK,缺少依赖只 warning 不崩溃,保证其他渠道正常运行

4.模板方法统一权限检查,子类无需重复实现 ACL 逻辑

5.出站分发协程独立运行,按 msg.channel 路由,支持进度消息过滤配置