跳到主要内容

xAgent Agent Harness(上):会话如何理解任务变化并调整执行环境

· 阅读需 11 分钟

很多 Agent 系统把 Harness 描述成一个循环:把用户消息交给模型,执行模型返回的 Tool Call,再把结果送回模型。这个循环很重要,但它还没有回答另一个更早的问题:当用户继续发消息时,这条消息是在延续当前任务、进入同一任务的新阶段,还是已经超出当前会话的职责?

xAgent 把这部分放在业务 Agent 执行之前处理。原始输入先进入会话并成为稳定事实,系统再判断任务关系、维护会话目标,并在确有需要时调整 Skill 和 Tool。业务 Agent 看到的是已经对齐的任务状态和执行环境,而不是一组在会话创建时永久固定的能力。

DeepSeek Harness 任务编排与 xAgent 的共同边界

DeepSeek Harness 官方页面将 Agent 概括为 Model 与 Harness 的组合,并把模型、Tool、Skill、Session、Sandbox、Storage、Loop、Scheduling 和 UI 都放进可组合的插件体系。其官方架构文档进一步把 Session 表达为追加式事件日志,把 Agent Loop 拆成可替换的模型适配、Tool 注册、Session 和循环组件。

因此,DeepSeek Harness 任务编排 不是“给 DeepSeek 模型接几个 Tool”的同义词。它讨论的是模型调用之外,谁负责保存会话事实、装配能力并让任务连续推进。xAgent 解决的是同一层问题,但采用了自己的责任划分:

对照维度DeepSeek HarnessxAgent
运行时组合通过插件树和 Profile 组合模型、Tool、Skill 与运行组件为每个 Session 维护实际加载的 Skill、Tool 与运行策略
会话连续性追加式 Session 事件日志是上下文来源SessionEngine 持有历史、阶段目标、全局目标和运行状态
任务编排入口Agent、Session 与插件共同构成可替换的运行路径先判断新输入与当前阶段、会话目标的关系,再决定是否调整能力
主要边界强调插件和核心运行组件之间的契约强调 Brain、SessionEngine 与业务 Agent 之间的事实责任

两者的共同原则是:模型只是执行参与者,Harness 才负责连续性和能力装配。区别在于,DeepSeek 的公开设计重点是插件化运行时;本文聚焦 xAgent 如何在业务 Agent 启动前理解一次任务变化。xAgent 不是 DeepSeek Harness 的分支或前端,这里只做同一架构问题下的事实对照。

为什么普通 Tool Loop 不够

假设一个会话正在“研究 ComfyUI 并交付 Markdown 指南”,用户接下来可能发送三种消息:

  • 继续:仍然是当前阶段。
  • 把刚才的 Markdown 转成 Word:长期目标仍然相关,但进入了新的交付阶段。
  • 顺便帮我查一下明天的天气:已经超出这个专业会话的职责。

如果系统只对最新一句话提取关键词,继续 几乎没有可用语义;如果每条消息都重新选择全部能力,普通补充也会造成不必要的环境抖动;如果直接用新消息覆盖旧目标,专业会话又会逐渐失去原来的责任边界。

因此,xAgent 将“这条消息与当前任务是什么关系”和“这个任务需要什么能力”拆成两个问题。

两级目标描述会话任务

执行会话保留两个不同层级的目标:

目标表达什么何时变化
会话全局任务目标这个会话长期负责的业务范围和预期结果会话职责真正变化时
当前阶段任务目标全局目标下正在推进的当前步骤或交付阶段进入新阶段、补充或修正当前工作时

例如,“研究 ComfyUI 并交付完整指南”可以是会话全局目标,“整理节点连接关系”是当前阶段。转为 Word 交付时,当前阶段可以变化,但会话仍然属于同一个研究任务。

这两个目标是会话运行态的稳定事实。上下文摘要可以引用它们来保持连续性,但摘要不能反向覆盖目标;Plan 和 Task 的完整结构也继续由各自的事实责任方维护,不会复制进会话目标。

原始输入必须先成为事实

xAgent 不会在消息刚到达 Channel 时立即做相关度判断。消息先进入 Session 队列,Brain 取得该 Session 的唯一执行权,SessionEngine 按实际消费顺序绑定下一条输入并写入历史,然后才开始语义判断。

用户或会话协作输入
-> SessionEngine 排队并保存原始输入
-> Brain 取得当前 Session 的唯一 runner
-> SessionEngine 绑定下一条任务输入
-> 判断任务关系
-> 对齐任务状态与能力环境
-> 进入业务 Agent loop

这个顺序解决了两个问题。第一,任何辅助模型失败都不能让用户原始消息消失。第二,同一会话快速收到多条消息时,每条消息都基于前一条已经提交的最新任务状态判断,而不是读取消息到达瞬间的过期状态。

审批结果、Tool 结果、系统通知和确定性命令不会进入这条任务相关度链。它们各自沿已有的审批、执行或控制路径处理,避免被误判成新任务。

相关度 Agent 只提供信号

xAgent 使用一个内部、无状态的任务相关度 Agent。它只接收:

  • 当前用户原始消息及稳定资源引用;
  • 当前阶段任务目标;
  • 会话全局任务目标。

它不接收完整 History、候选 Skill、候选 Tool、Memory、执行步骤或已有编排结果。输出也只有两个分数:当前消息与当前阶段的相关度,以及与会话全局目标的相关度。

相关度 Agent 不生成新目标,不推荐 Skill,不决定是否压缩,也不直接修改会话。它只是把一个难以用字符串规则完成的语义比较,转换成受约束的运行时信号。真正的状态变化仍由 Brain 根据分数和确定性运行状态选择,并通过 SessionEngine 的业务动作提交。

两个维度如何选择后续流程

对外理解这套逻辑时,不需要依赖具体阈值。高、低和不确定三个区间形成以下决策边界:

当前阶段相关度全局目标相关度默认解释系统行为
当前工作的继续、补充或修正保持任务和能力环境,继续执行
同一职责内的新阶段更新阶段目标,按需调整能力,并评估是否压缩上一阶段
新任务或职责范围外请求不覆盖当前会话目标和能力,保留给责任路由重新判断
阶段与全局目标可能冲突保留现状,不自动替换目标
不确定任意信号不足以支持状态变化保留上下文和能力,由业务 Agent 判断或询问用户

分数不是业务事实,也不会默认写入会话目标或上下文摘要。这样可以调整评分模型和阈值,而不把一次模型判断变成永久状态。

任务状态与能力环境分开变化

任务发生变化,不代表执行环境一定要重建。用户修正文案、补充一个约束或要求继续当前工作时,现有 Skill 和 Tool 通常仍然适用,xAgent 会直接保留它们。

任务首次初始化或进入新阶段时,才进入环境准备链:

已经对齐的完整任务
-> 提取用于召回的任务要点
-> 召回 Skill、ToolSet 和 Memory 候选
-> Orchestrator 从候选中选择目标能力
-> SessionEngine 差异更新当前 Skill 和 Tool

下面是一条客服运营周报任务在环境准备阶段的真实状态。任务要点提取、相关 Skill、Tool 与 Memory 查找,以及能力编排被投影为彼此独立的阶段:

xAgent 在接收客服运营周报任务后显示任务要点提取、能力查找和任务编排状态

任务要点只用于候选召回,不会和完整任务一起重复进入 Orchestrator。调整模式会同时携带当前能力,Orchestrator 可以保留仍然适用的选择,只对目标环境做差异调整。它只消费一份规范化任务、当前能力和已经召回的候选集合,也不创建 Session、不改写任务目标、不选择模型或 Agent 身份。

这种拆分避免了三个模型角色互相覆盖:相关度 Agent 判断消息关系,任务语义提取负责召回,Orchestrator 负责能力选择。会话事实仍由 SessionEngine 维护。

编排完成后,实际加载到会话中的能力仍然可以检查。这个任务最终选中了数据可视化与周报 Skill,并加载了计划、能力发现和文件读写工具:

xAgent 会话高级配置显示任务编排后实际选中的数据可视化、周报 Skill 与计划和文件工具

接收任务的会话自己准备环境

新版链路也改变了子会话的创建方式。主会话负责判断是否已有合适的责任会话;确实需要新会话时,session_create_sub 只创建一个具备确定性默认配置和最小能力的可运行会话,并原样移交任务消息与资源引用。

创建方不再提前替子会话解释任务、选择业务 Skill 和 Tool,或者生成一套执行 Prompt。子会话收到任务后,和普通用户输入一样进入统一的任务控制循环,由实际承担工作的会话初始化自己的目标和能力环境。

这让“谁执行任务,谁理解任务”成为稳定边界,也让环境编排失败不再阻止会话创建和原始任务移交。多会话之间如何传递任务与材料,可继续阅读多 Agent 会话事件协作

辅助判断失败不能接管主流程

任务相关度判断是一项可退化的前置能力。调用失败、输出不合法或模型暂时不可用时,xAgent 按“没有足够证据改变任务”处理:保留现有目标、能力环境和压缩状态,并继续处理已经保存的用户消息。

环境调整失败与相关度失败是不同问题。已经提交的原始消息和任务状态不能因此丢失,现有能力也不能先被清空再等待一次可能失败的全量重建。系统应保留可恢复事实,让失败在自己的责任边界内收束。

用户可以观察到什么

当消息只是延续当前工作时,用户通常只会短暂看到任务语义理解,然后任务继续执行。当消息进入新阶段并需要不同能力时,时间线会依次显示类似状态:

正在理解任务语义
-> 正在提取任务要点
-> 正在发现任务能力
-> 正在编排任务
-> 正在应用任务环境

这些状态表达当前 Harness 正在推进的阶段,不是模型生成的聊天内容。它们也不意味着每条消息都会走完全部步骤。

能力如何按需进入会话,可阅读AI Agent 如何按需发现和加载工具与 Skill;任务进行中哪些设置从后续模型调用生效,可阅读任务执行中的动态切换

下一篇:对齐之后怎样持续执行

任务控制循环解决的是“当前消息属于什么任务,以及需要什么环境”。环境准备完成后,业务 Agent 才进入固定的模型与 Tool 执行循环。

下一篇《xAgent Agent Harness(下):一次任务如何持续执行、暂停与恢复》将继续说明唯一 runner、上下文装配、Tool Call、审批等待、上下文压缩和重启恢复怎样组成同一条执行链。长任务的用户侧组织方式也可先参考AI Agent 如何执行长任务