野火IM与AI对接开发说明

野火IM与AI的对接主要通过机器人(Robot)来完成。本文说明机器人的基本概念、对接架构,以及在AI场景下的常用能力。

本文中AI泛指大模型、AI Agent等人工智能服务;涉及具体执行任务的实体时,使用Agent来表述。

1. 什么是野火机器人

准确地说,野火机器人是虚拟用户的双向沟通能力

  • 机器人是IM系统中的一种特殊用户,由后端服务控制,拥有自己的身份(昵称、头像等),可以像普通用户一样出现在会话和群组中。
  • 沟通是双向的:Agent服务可以主动给用户发消息;用户发给机器人的消息也会通过回调地址推送给Agent服务处理。
  • 每个机器人有独立的ID和密钥(AK/SK),所有接口调用都需要签名鉴权,权限可控、可随时收回。

机器人通过 Server API 创建,之后Agent服务通过 Robot API 与IM服务交互。Java开发者可以直接使用 Server SDK,其中封装了RobotService的全部方法。

2. 对接架构

2.1. 直连模式

Agent服务暴露一个HTTP回调地址,IM服务把用户消息推送到该地址,Agent服务再通过Robot API(80端口)回复。此模式要求Agent服务部署在IM服务可达的网络中(同一内网或具有公网地址)。

2.2. 机器人网关模式(robot-gateway)

如果Agent服务处在内网,可以使用机器人网关解决网络穿透问题:

┌───────────────┐   WebSocket   ┌──────────────┐   HTTP回调/Robot API   ┌─────────┐
│ Agent服务/客户端│  ←────────→   │  机器人网关   │  ←─────────────────→   │  IM服务  │
└───────────────┘    (8884)     └──────────────┘        (8885)          └─────────┘
  • Agent服务作为客户端通过WebSocket主动连出到网关,无需公网IP,即可与IM服务双向通信。
  • 网关支持多机器人同时接入、动态鉴权、心跳保活与自动重连,提供Java和JS版本的客户端SDK。
  • 网关内置机器人工厂(BotFather)功能,用户在IM客户端内通过聊天命令(/create/list 等)即可在线创建和管理机器人,创建后自动下发机器人ID、密钥和网关连接地址。
  • 网关仓库中还提供了多种AI平台的现成对接插件:OpenClaw适配器、DeepSeek Harness(dsh)插件、Hermes桥接、Claude Code桥接(cc-connect)等,多数场景可以拿来即用。

另外,还提供了野火机器人MCP服务,把机器人API封装成MCP工具,Agent可以像调用工具一样发消息、管理群组。

3. AI对接的常用能力

3.1. 双向消息交互

用户消息通过回调推送给Agent服务;Agent服务通过 /robot/message/send 发送消息、通过 /robot/message/reply 回复指定消息。支持文本、图片、语音、视频、文件等各类消息。

3.2. 流式消息回复

对接大模型时,回复内容是逐步生成的。野火IM内置了流式消息类型,可以让用户看到Agent"正在打字"的效果:

  • 流式内容正在生成消息(类型14):持续下发同一个流ID(streamId)的全量文本,客户端在同一个气泡中实时刷新。
  • 流式文本取消消息(类型20):生成无产出或失败时发送,客户端按streamId删除对应的生成中/已生成消息,自身不落库。
  • 流式内容生成完成消息(类型15):生成结束后下发,把气泡内容"定稿"。

前两种消息均为透传消息(persistFlag=4),不产生冗余的历史记录。详见内置消息内容

3.3. 机器人在线状态

机器人可以设置自己的在线状态(如通过网关调用 /robot/set_online),用户在客户端上就能看到AI助手是否在线,避免向离线的AI助手提问。在线状态的展示需要客户端开启在线状态功能。

3.4. 会话级用户设置

机器人可以通过 /robot/conversation/user_setting 修改会话级用户设置(单聊和群聊都支持),请求参数为会话、类型(type)和值(value):

  • 群聊:设置会写入到群内所有成员(机器人本身除外)的用户设置中,设置的key带有会话信息,天然按会话隔离。
  • 单聊:设置会写入到对方用户的用户设置中。
  • 权限约束:该类型的设置(会话级用户设置scope)只允许机器人写入,普通客户端无权修改,避免数据被篡改。
  • 可扩展性:type可以自定义,业务方可以为不同的Agent状态定义不同的类型;value为字符串,可以存放任意内容(如JSON)。用户设置会自动实时同步到用户的所有端。

客户端读取当前用户关于该会话的用户设置,即可拿到机器人写入的内容。AI场景下可以用它来动态显示Agent的状态和进度,例如"思考中"、"正在检索资料"、"任务执行 60%"等。关于用户设置的更多说明请参考用户设置

3.5. 自定义消息与交互界面

机器人可以发送自定义消息,在客户端注册对应的消息内容类型后,可以渲染成各种样式:

  • 各类卡片(任务卡片、审批卡片、结果展示卡片等);
  • 带按钮的选择界面,用户点选后机器人收到回调继续处理。

配合群聊中"发给指定用户"(toUsers)的能力,还可以实现只有提问者可见的交互卡片。

3.6. 更新消息内容

机器人可以通过 /robot/message/update 更新已发送的消息内容。典型用法:先发送一条"任务处理中"的消息,任务状态变化时原地更新这条消息(进行中 → 完成/失败),避免刷屏。注意:更新消息功能需要专业版IM服务,机器人只能更新自己发送过的消息。

3.7. 群组管理

机器人拥有完整的群组操作能力:建群、拉人、踢人、设置管理员、修改群信息等。可以让Agent自动为任务建群、邀请相关人员、在任务结束后解散群组。

3.8. 频道(订阅式广播)

频道类似微信公众号,是基于订阅关系的一对多广播(用户可以关注或取消关注)。频道的owner可以是机器人,这样Agent就可以管理和运营自己的频道:

  • 适用于订阅式广播场景,比如AI每日摘要、资讯推送、系统公告等。
  • 甚至可以做全局公众号,面向系统内所有用户发布内容。
  • 与机器人形成互补:订阅广播用频道,双向交互用机器人。

频道的概念请参考频道,接口请参考Channel API

3.9. 音视频通话与会议

机器人可以以虚拟用户的身份参与到音视频通话和会议中。结合语音流处理能力,未来可以实现AI与用户实时音视频交互的场景。

4. 推荐实践

4.1. 用群组对应Agent的项目空间

Agent平台普遍有"项目空间(Workspace/Project)"的概念,推荐用群组来承载:

  • 群即空间,群成员是空间成员(人 + 机器人/Agent),群消息历史即空间共享上下文,会话级用户设置即空间配置和状态。
  • 配合机器人的群组管理能力,可以让Agent按任务动态建群、邀请相关的人和Agent加入、任务结束后解散,对应Agent工作流中"为每个任务开一个空间"的模式。

需要注意,群组没有真正的"工作目录",Agent项目空间中的文件资源需要用群文件、自定义消息等来承载,两者不是完全等价的。

4.2. 多Agent协作(Agent与Agent对话)

机器人本质上是普通用户身份,因此Agent之间也可以像人一样对话,天然支持多Agent协作:

  • 把多个机器人拉进同一个群,Agent A发出的消息会通过回调推送给Agent B的服务,B处理后再回复,A同样可以收到,形成Agent之间的对话链路。
  • 群组作为协作空间,对话过程对人类成员完全可见、可追溯,人可以随时介入、纠正或接管,这比Agent之间私下的API调用更透明。
  • 可以用@或自定义消息卡片来指定任务的接收方,配合会话级用户设置同步各Agent的分工和状态。

需要注意防止死循环:Agent互相触发可能无限对话下去,Agent服务侧需要做收敛控制,比如不响应其他机器人的消息、只在被@时响应、限制连续对话轮次等。另一个推荐的做法是让Agent支持流式取消消息(类型20):Agent收到消息开始生成回复后,如果判断这条消息不需要回复(比如来自其他机器人、对话已收敛),直接发送取消消息,客户端会按streamId删除对应的生成中消息且不落库,相当于"想了想决定不说了",不会在会话中留下任何痕迹。

4.3. 用会话线路(line)区分Agent会话

野火会话有一个线路(line)属性,用于过滤和区分会话。可以为Agent会话选一个单独的线路值(比如1),机器人发送消息时把会话的line设置为该值:

  • 客户端既可以按line把Agent会话和普通会话一起显示,也可以分开单独显示(比如一个独立的"AI助手"入口)。
  • 针对该线路的会话可以做特殊处理,比如启用流式消息刷新、渲染AI专用卡片、关闭已读回执等。

4.4. 设计交互卡片和进度状态

  • 简单结果用普通消息回复;需要用户选择或确认的,用自定义消息渲染成交互卡片,用户操作后机器人收到回调继续处理。
  • 长任务先回复一条"处理中"消息,过程中用更新消息接口原地刷新状态(进行中 → 完成/失败),避免刷屏。
  • 需要向会话内所有成员同步Agent的状态/进度时,使用会话级用户设置接口,客户端在会话界面读取展示。

4.5. 上下文记忆

Robot API只负责消息的收发,不提供历史消息查询,上下文记忆需要自行解决,两种方案:

  • Agent服务自己保存所有回调收到的消息,按会话组织,调用大模型时拼入上下文。
  • 在robot-gateway中按机器人和会话维度存储消息,Agent按需向网关查询。这样上下文存储集中在网关,多个Agent服务实例可以共享。

无论哪种方案,发往大模型前都要做上下文窗口的裁剪或摘要,群聊场景尤其要注意。

4.6. 状态指示

建议多种状态手段双管齐下,让用户清楚感知Agent的工作状态:

  • 输入提示("对方正在输入"):Agent收到消息开始处理时展示。
  • 流式生成中:回复内容开始生成后,用流式消息(类型14/15)实时刷新气泡。
  • 会话级用户设置:展示更精细的状态,比如"思考中"、"执行工具"、"运行完成"等,客户端在会话界面读取展示。

4.7. 媒体处理

  • 发送:Agent可以把生成的图片、语音、文件等通过对应的媒体消息类型发送给用户。
  • 接收:用户消息中的图片、语音、文件等媒体内容,Agent服务可以下载下来处理(比如语音先转文字再交给大模型)。

5. 安全与合规

  • 凭证安全:robotId/secret是机器人的全部权限凭证,所有接口调用都靠它签名(同时带时间戳防重放),务必妥善保管。目前robotId/secret保存在Agent本地,如果想要提高安全性,可以改造认证方式:把secret保存在robot-gateway侧,Agent本地不保存secret,改为通过临时验证获取cookie/token后再连接网关。
  • 权限边界:机器人只有普通用户的权限,权限可控、可随时收回。注意不要把管理API(/admin/)暴露给Agent,管理API权限过大,一旦泄露风险很高。
  • 内容合规:AI生成的内容需要符合相关法律法规,建议对Agent的输入和输出做审核,可以结合IM服务的敏感词等能力。开发运营社交类应用也要注意合规要求,请参考开发运营社交软件也要遵守法律

6. 持续演进

野火IM的连接能力是分步演进的:人和人的连接是IM的本职;机器人(虚拟用户的双向沟通能力)打通了服务和人的连接。进入AI时代,连接的主体从"人"扩展到"Agent",接下来要完善的是三类连接:

  • 人和Agent:让用户像与人聊天一样和AI助手协作,并实时感知Agent的工作状态——本文介绍的流式回复、交互卡片、会话级用户设置等能力都服务于这个目标。
  • 服务和Agent:现有系统可以用消息通知Agent,让Agent实时感知到现有服务的状态。
  • Agent和Agent:机器人本质上是普通用户,Agent之间可以在群组中像人一样对话和协作,过程对人可见、可介入、可接管。更多思考请参考Agent通信的未来

野火会持续推进,满足客户需求,更好地支撑AI应用的落地。

7. 参考文档

2018 © wildfirechat.net 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2026-09-03 09:00:47

results matching ""

    No results matching ""