多 Agent 如何通过会话事件协作
多个 Agent 共同完成任务时,最直接的做法是把所有角色、消息和工具调用都塞进同一个上下文。但任务一旦变长,不同角色的材料、历史和执行状态会相互干扰,也很难判断某条消息究竟应该由哪个 Agent 处理。
xAgent 采用独立会话加会话事件的方式组织协作。每个 Agent 会话保留自己的上下文、任务状态和工作区范围;需要交换信息或推动另一个会话继续工作时,再发送目标明确的会话事件。
为什么使用独立会话
独立会话让不同 Agent 可以分别维护自己的任务目标、角色说明、模型上下文、Tool、Skill、计划、进度、工作区和正式产物。这样可以避免研究、写作、数据处理和外部发送等不同工作全部混在一个上下文中,也允许某个会话等待审批或外部条件时,其他会话继续运行。
主 Agent 与子 Agent 的分工
| 会话类型 | 主要职责 |
|---|---|
| 主 Agent 会话 | 直接承接用户目标,决定是否拆分任务、创建或激活子会话,并保持用户的主要交互入口。 |
| 子 Agent 会话 | 围绕明确目标独立执行一段工作,维护自己的上下文、计划、工具和产物。 |
子 Agent 不是主会话中的一段隐藏思考,而是一个真正独立的 Agent 会话。用户可以进入子会话查看过程,也可以继续补充要求或优化结果。
什么是会话事件
会话事件是一条发送给明确目标会话的轻量消息,可以包含事件来源、目标会话、任务或状态说明、期望动作,以及工作区文件或外部资源引用。
事件不会把发送方的全部历史复制到目标会话。发送方只传递当前协作真正需要的信息,目标会话继续使用自己的上下文处理。
通知与协作事件的区别
通知事件
通知事件适合报告进度、完成状态、异常提醒、产物位置或需要用户关注的事实。
通知会显示在目标会话的 UI 历史中,但不会进入模型上下文,也不会自动唤醒目标 Agent。这样既能让用户看到状态变化,又不会让大量进度消息持续占用上下文。
通知适合“让人知道”,不适合“要求另一个 Agent 立即继续工作”。
协作事件
协作事件适合让目标 Agent 接手或继续处理工作,例如主 Agent 向已有子 Agent 派发任务、把后续阶段移交给另一个会话,或者让目标会话根据新材料继续分析。
协作事件会进入目标会话的运行队列,转换为该会话的新输入,并激活后续处理。目标 Agent 使用自己的上下文、工具和工作区边界完成任务。
判断方式很简单:只需要展示状态时使用通知;需要目标 Agent 真正继续执行时使用协作事件。
为什么通知不进入模型上下文
多 Agent 系统会产生大量“开始处理”“进度更新”“文件已生成”等状态消息。如果全部进入模型上下文,会挤占任务材料、增加无意义调用,并可能因为普通状态更新错误触发新一轮执行。
xAgent 将通知作为用户可见的会话事实保存,但在模型请求时过滤掉。只有确实需要 Agent 处理的协作事件才进入运行链路。
会话事件总线如何工作
xAgent 内置了持久化会话事件队列:
- 发送方明确目标会话和事件模式。
- xAgent 校验目标会话存在并属于当前用户。
- 事件进入持久队列,等待消费端领取。
- 事件被投递给目标会话。
- 通知写入 UI 历史;协作事件进入运行队列。
- 目标会话根据当前状态立即处理或排队等待。
事件进入队列或完成投递,只代表目标会话已经稳定接收,不代表业务任务已经完成。最终结果仍应通过任务状态、产物、Tool 结果或后续通知确认。
持久队列还可以避免事件在目标会话繁忙或投递入口暂时不可用时被直接丢弃。
哪些入口可以产生会话事件
Agent 会话
主 Agent 可以创建子会话并发送第一条激活事件,也可以向已有目标会话发送协作事件。子会话可以通过通知向用户或上级会话报告状态和完成结果。
触发器
定时触发器或外部触发器命中后,可以把预先配置的任务发送到指定会话。触发器只负责提交事件,不等待目标会话完成整个任务。
连接器
微信、Telegram 等连接器收到消息后,可以将消息转换为会话事件。消息明确引用某个会话时进入该会话;没有指定目标时,通常进入当前用户的主会话。
连接器还可以携带图片或文档。xAgent 完成资源解析后,再把它们作为目标会话可使用的附件交给 Agent。
外部接口
企业系统或其他服务可以通过受控接口触发事件入口,把业务变化送到目标 Agent 会话。外部调用仍需经过对应的身份验证和权限控制。
一个协作示例
假设用户希望持续收集行业新闻,并定期生成分析报告:
- 主 Agent 创建“新闻采集”和“报告生成”两个子会话。
- 定时触发器向新闻采集会话发送协作事件,激活新一轮采集任务。
- 新闻采集会话把资料和整理结果保存到自己的会话产物中。
- 完成后发送通知,让用户看到本轮采集已经结束并获得产物引用。
- 需要生成报告时,主 Agent 或用户向报告生成会话发送协作事件,并附上已确认的资料引用。
- 报告生成会话使用自己的上下文和 Skill 完成报告,不需要继承新闻采集会话的全部历史。
这种方式传递的是明确任务和产物,而不是合并两个 Agent 的所有对话历史。
安全边界
只允许同一用户的会话通信
事件入队前会校验目标会话归属。当前版本只允许事件发送到同一用户拥有的会话,不支持跨用户会话通信。
跨用户通信会同时涉及身份冒用、数据泄露、外部账号权限和审批责任。在没有独立授权与审计机制前,直接允许 Agent 跨用户发送事件是不安全的。
必须有明确目标
会话事件不是无边界广播。事件创建时必须确定目标会话,队列不会根据来源内容自行猜测投递对象。
事件不绕过审批
协作事件可以激活目标会话,但后续 Tool 调用、文件操作、外部发送和业务系统修改仍需遵守目标会话的权限、工作区边界和审批策略。
连接器不扩大外部权限
连接器只是消息和事件入口。目标系统中能够读取、发送或修改哪些内容,仍由用户授权和外部系统权限决定。
当前版本的边界
- 当前提供会话级通知和协作能力,完整的项目级 Agent Team 仍在后续规划中。
- 通知不会自动触发目标 Agent,发送方应根据目的选择正确模式。
- 事件成功投递不等于业务任务成功完成。
- 当前不支持跨用户会话协作。
- 复杂协作应传递明确任务、文件产物和可验证结果,避免只发送模糊状态。