Appearance
响应通道与外部即时通信
统一抽象
AgentResponseChannel 统一返回方式,要求实现:
- 提供
StreamHandler。 - 返回通道类型和活跃状态。
- 发送错误并在关闭时释放资源。
AgentResponseChannelRegistry 维护 sessionId → AgentResponseChannel。普通注册不会覆盖仍活跃的通道;SSE 重连使用 replace,避免旧通道关闭时误删新建 emitter。
流式事件
浏览器通过 AiChatbotAgentController 建立 SSE 连接,SseConnectionManager 管理 emitter、超时、错误和完成回调,并发送心跳注释保持反向代理连接。SseStreamHandler 推送 token、节点状态、工具结果和完成事件;断线期间的事件由 PendingSseEventStore 按会话保存,重连后再读取。
外部即时通信适配
ExternalImInboundGateway 把平台事件转换为 ExternalImInboundMessage,ExternalImConversationKeyFactory 为平台用户生成稳定会话键,ExternalImReplyRegistry 保存回复目标。出站消息由 ExternalImOutboundMessageFactory 统一生成,再交给微信、企业微信、钉钉或 QQ 的客户端实现。
| 平台 | 关键实现 | 管理控制器 |
|---|---|---|
| 微信 | channel/wechat | WechatChannelController |
| 企业微信 | channel/wecom | WeComChannelController |
| 钉钉 | DingTalkChannelRuntimeManager、扫码服务 | DingTalkChannelController |
QqBotAgentServer、WebSocket client | QqChannelController |
多实例注意事项
共享队列可以分发 Agent 消息,但外部 IM 的回复目标通常只在接入节点内存中。若消息被其他节点消费,可能出现执行完成但无法回发的问题。部署多实例时,应让同一外部会话固定到接入节点,或把 reply target 改为可共享存储并在网关层做路由。