核心要点
统一入站出站接口:receive 把各平台原始消息解析成标准 Message,send 把标准回复适配回各渠道格式,核心逻辑只面向标准模型
适配器模式:每个渠道一个 Adapter,封装该平台的鉴权、消息解析、富文本/文件处理与回调差异,新增渠道即新增一个适配器
统一领域模型:抽象出与平台无关的 Message、User、Session(含渠道标识、会话标识),让上层 Agent 逻辑复用
能力差异治理:用特性开关/能力描述声明各渠道支持的富文本、卡片、文件、流式等,不支持时自动降级
统一入口:webhook 与回调收口到一个网关层做验签、去重、路由,再分发到对应适配器
标准回答
问题本质:把"平台差异"挡在核心之外
接入 Telegram、飞书、钉钉、Web 这些渠道时,每家的消息格式、富文本能力、文件传输、事件模型和鉴权方式都不同。如果让 Agent 核心逻辑直接处理这些差异,代码会迅速腐化。Channel 抽象层的目标,就是把差异收敛在边界,核心只面向一套统一接口。
统一的入站 / 出站接口
定义两个方向的标准动作:
- receive:各渠道的原始事件(webhook 推送、长轮询等)经适配器解析成统一的 Message——抽取出文本、附件、发送者、会话标识、平台元数据;
- send:上层产出与平台无关的标准回复,适配器再把它翻译成该渠道的具体格式(Telegram 的 sendMessage、飞书的卡片、钉钉的 markdown 等)。
核心 Agent 只读写标准 Message,完全不感知底层是哪家平台。
适配器模式:每渠道一个 Adapter
为每个渠道实现一个 Adapter,遵循同一套 Channel 接口(如 parseIncoming、send、verify、capabilities)。Adapter 内部封装该平台的鉴权/验签、消息体解析、富文本与文件处理、回调机制。新增一个渠道,就等于新增一个 Adapter 并注册,核心零改动——这正是开闭原则的落地。
统一领域模型:Message / User / Session
抽象出与平台无关的领域对象:Message(文本、富文本块、附件、引用关系)、User(跨渠道唯一标识 + 渠道内 id)、Session(由渠道 + 会话/群组标识构成,承载上下文)。这套模型是上层逻辑复用的基础,也是后续做会话隔离、记忆、统计的统一口径。
处理能力差异:降级与特性开关
各渠道能力参差:有的支持富交互卡片,有的只支持纯文本;有的能流式,有的不行。每个 Adapter 通过 capabilities 声明自身能力,上层据此选择渲染策略——不支持卡片就降级为 markdown 或纯文本,不支持流式就整段返回。用特性开关而不是 if 平台名硬编码,扩展性更好。
统一入口:webhook 与回调收口
所有平台的 webhook / 回调先进入一个统一网关,集中做验签、幂等去重(防平台重试导致重复处理)、限流与路由,再按渠道分发到对应 Adapter。这样安全与可靠性逻辑只写一份,避免每个渠道各自为政。
常见误区
⚠️ 常见踩坑
最大的误区是抽象层"形似而神不似"——名义上有统一接口,实际上层逻辑里到处 if (channel === "feishu") 做特判,差异根本没被收敛。另一个坑是把标准 Message 设计得贴着某一个平台(通常是最先接入的那个),换平台时模型不够通用。还有人忽略幂等:平台 webhook 会重试,不做去重就会重复回复用户。能力差异也常被忽视,在不支持卡片的渠道发卡片直接报错。
追问
追问 1:不同渠道的富文本/卡片能力差异很大,怎么统一又不丢能力?
用"统一中间表示 + 各渠道渲染器"。上层产出与平台无关的结构化内容(文本块、列表、按钮、图片等),每个 Adapter 实现一个渲染器,把中间表示翻译成该平台原生格式;能力不足时按 capabilities 降级(卡片转 markdown、markdown 转纯文本)。这样既保留高能力渠道的体验,又不在低能力渠道上报错。
追问 2:同一个人在不同渠道,User 身份怎么统一?
区分渠道内身份与全局身份:每条消息带渠道内 id(如飞书 open_id),系统维护一张映射表把多个渠道身份关联到一个全局用户。关联手段可以是显式绑定(扫码/验证码)、或共同的邮箱/手机号。没绑定前各渠道视为独立用户,绑定后再合并画像与权限,避免误把不同人当成同一人。
追问 3:怎么保证新增一个渠道不影响已有渠道?
靠接口契约 + 隔离。新渠道只需实现统一的 Channel/Adapter 接口并注册,核心代码不改,符合开闭原则。配合契约测试(mock 各平台 payload 验证解析与发送)保证新 Adapter 行为合规;运行时各 Adapter 互相隔离,一个渠道的异常或限流不波及其他渠道。上线时先灰度新渠道,验证无误再放量。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习