Agent Harness
Agent Harness 是围绕模型组织任务执行的运行时,也就是让模型请求得以执行的一组程序。模型根据上下文生成下一步,Harness 则提供信息、执行工具,并保存和验证结果。即使使用同一个模型,上下文选择和执行方式不同,也会影响任务成功率。
修复代码需要读取错误、修改文件并验证结果,本文用这个过程说明 Harness 各模块的配合。接着讨论任务跨越多个上下文窗口时怎样保留进度,以及权限检查和结果验证应放在哪些位置。
1. 面试核心
先记住这几条,再读正文- 运行时职责。 Harness 负责组装上下文、执行工具、保存状态,并校验权限和任务结果。卡 · 模块与职责
- 编码任务验收。 编码 Agent 通过运行测试和构建、检查代码差异(diff),验证交付结果。卡 · 综合题
- 上下文工程的范围。 上下文工程决定每轮给模型看哪些信息,Harness 还负责实际执行、授权、验证和恢复。卡 · 模块与职责
- Hook 的执行时机。 Hook 在指定事件发生时触发,能否阻止动作取决于触发时机和处理器的返回值。卡 · Hook 在什么时机运行,能阻止工具调用吗?
2. 模块与职责
模型提出一次工具调用后,还需要程序把请求变成实际操作。Harness 将这个过程分成下面的模块,让每一部分都有明确职责。
| 模块 | 职责 | 编码任务示例 |
|---|---|---|
| 执行循环 | 分发调用,限制轮数 | 超时、重复调用检测 |
| 工具层 | 校验契约并执行 | 搜索、编辑、运行测试 |
| 上下文 | 选择与压缩信息 | 规则、相关代码、当前错误 |
| 状态 | 保存任务进度 | 动作结果、待办、剩余预算 |
| 权限与沙箱 | 限制访问和副作用 | 路径、网络、命令授权 |
| 验证 | 检查验收条件 | 测试、类型检查、diff |
| 扩展 | 加载任务能力 | Skills、MCP、子 Agent |
| 可观测性 | 记录执行证据 | 调用 ID、耗时、用量、退出原因 |
工具契约描述工具能做什么、接收哪些参数、返回什么结果,工具层据此校验请求。上下文模块再从仓库规则、相关代码和最近的工具结果中选择当前所需的信息。窗口接近上限时,它还负责压缩旧消息,保留目标、已改文件和未解决错误。
权限模块按读取、写入、执行命令、联网和发布等动作划分授权范围。沙箱则限制程序实际能够访问的目录和网络。这样,模型提出的动作在执行前有权限检查,执行时也有范围约束。
各模块沿着一次调用的顺序协作:
- 上下文模块选择当前任务所需的信息,交给模型。
- 循环模块读取模型请求,工具层校验权限与参数后执行。
- 执行结果写回上下文,状态模块保存进度。
- 验证模块检查完成条件,循环模块据此继续或结束任务。
可观测性指能够通过记录了解系统的执行过程。调用 ID 将请求与结果对应起来,耗时、Token 用量和退出原因则帮助定位失败与成本来源。
模块通过明确接口连接,所以更换模型时,大部分执行和存储组件可以复用。不过,模型理解指令和选择工具的能力会变化,提示词、工具描述与预算仍需重新评测。
3. 一次修改任务的链路
修复失败的单元测试时,Harness 要让模型看见错误、修改代码,再验证修改是否有效。这个过程可以按以下六步理解:
- 加载任务与规则:把用户描述的失败现象放入上下文,并加载适用的仓库指令,如
AGENTS.md。系统提示还要说明通用规则和可用工具。 - 搜索代码:模型提出搜索与读取请求,定位失败测试和被测函数。工具层先检查访问范围,再执行读取。
- 控制读取量:大输出按页返回或截断,并提示还有哪些内容未展示。这样可以按需继续读取,避免一次把整个仓库放进上下文。
- 应用修改:模型提出补丁,运行时检查路径是否在授权工作区内。需要确认时先等待批准,再应用修改并返回 diff,也就是修改前后的代码差异。
- 验证与修正:测试命令在沙箱中执行,工具返回退出码和关键输出。失败输出写回上下文,供下一轮修正;长任务同时保存待办、已改文件和最近的测试结果。
- 保存并结束:测试、类型检查、构建与 diff 按任务要求完成验收后,保存结果并结束。达到步数或预算上限时,则保存进度并报告未完成。
这些外部检查为完成判断提供证据。测试能覆盖的范围有限,所以代码审查还要检查测试之外的风险。
完整的开发流程见 AI 辅助开发。
4. 长任务的处理
一个上下文窗口装不下全部工作时,下一段会话仍需要知道已经做了什么。Harness 因此要把进度保存在窗口之外,并准备以下四类信息或产物:
- 进度文件:记录目标、已完成项、剩余工作和未解决问题。新会话先读取这些信息,避免重复探索。
- 代码版本:用快照或授权后的增量提交记录可验证的改动。每完成一个可验证单元就保存版本,出错时便于比较差异,并在授权范围内恢复。新会话也能通过 Git 日志了解改动过程。
- 初始化脚本:记录依赖安装、服务启动和测试命令,让新会话可以一条命令重建所需环境,减少重新摸索的时间。
- 子任务产物:独立搜索或子任务可以使用自己的上下文,将结果保存为文件。主循环保留结论和证据位置,后续需要细节时再读取。
子任务怎样分派和汇总,见多 Agent 协作。
恢复时要重新读取当前代码与进度文件。如果其他人已经修改了代码,旧测试结果和旧结论就需要复核。检查点与副作用恢复见Agent 状态与持久化执行。
5. 常见问题
5.1 Harness 和 Agent 框架有什么关系?
框架提供可复用的 Harness 模块,应用再将它们组成自己的运行时。比如,框架可以提供执行循环、工具注册、状态检查点和调用追踪。应用仍需定义业务验收、权限和部署方式。
需要特殊的上下文策略、权限模型或部署环境时,可以评估自研。选型要看模块是否满足任务要求,具体能力比较见 Agent 框架。
5.2 Hook 在什么时机运行,能阻止工具调用吗?
Hook 是在指定事件发生时触发的处理器,能否阻断动作取决于事件时机和返回值。它把检查接到程序的执行流程中,减少依赖模型记住提示词规则的需要。
可以把命令钩子放在以下位置:
- 工具调用前检查命令和目标路径,决定是否允许执行。
- 写文件后运行格式化,或记录这次修改的结果。
- 会话结束时执行清理,释放本次任务使用的资源。
在 Claude Code 中,PreToolUse 命令钩子返回退出码 2 可以阻止调用。PostToolUse 在工具完成后运行,这时副作用已经发生,钩子无法撤销它。事件是否触发、规则是否匹配,以及处理器是否成功运行,都会影响检查效果。
强制权限应落实在工具执行路径和沙箱中。Hook 可以补充检查,但还要验证错误与超时时是否阻断,具体行为见 Hooks reference。
6 · 面试题卡片
本页题目与参考回答
6.1 什么是 Agent Harness?一个标准的 Harness 包含哪些核心模块?
考察重点
- 解释模型提出请求与运行时执行请求之间的职责边界。
- 按调用链路列出模块,并说明每个模块解决的问题。
参考回答
Harness 是围绕模型组织任务执行的运行时,负责提供上下文、执行请求,并保存和验证结果。
沿着一次调用,可以说明核心模块各自解决的问题:
- 上下文模块选择、排序并压缩信息,让模型读到当前任务需要的内容。
- 循环模块调用模型、分发动作,工具层校验契约与参数后执行请求。
- 权限与沙箱限制动作能访问的资源,状态模块保存会话与任务进度,供中断后恢复。
- 验证模块用测试、构建等证据检查结果,可观测性模块记录调用轨迹、耗时和用量。
Skills、MCP、子 Agent 和 Hook 可以按需扩展能力。模型负责生成下一步,实际动作与完成判断由这些程序共同实现。
6.2 如果让你从零设计一个 Coding Agent,你会怎么设计?
题型:综合题
考察重点
- 说明怎样围绕可验证的代码结果组织执行循环。
- 解释代码库上下文、长任务进度、权限和沙箱怎样配合。
相关内容:模块与职责、一次修改任务的链路、长任务的处理、停止条件与预算、代码库上下文、压缩时保留什么、执行沙箱、编码 Agent 评测。
参考回答
编码 Agent 的 Harness 应支持代码检索、修改和外部验证,并在预算内循环修正。
- 工具负责执行。 提供搜索、分页读取、补丁编辑和命令执行,返回 diff 与测试结果。
- 上下文负责延续任务。 加载相关代码和仓库规则,压缩时保留目标、已改文件、失败输出与待办。
- 程序控制权限和验收。 执行前检查授权,限制文件、网络和凭据访问,以测试、类型检查、构建和 diff 判断结果。
- 状态与轨迹支持恢复和评测。 保存进度及代码快照,记录步数、耗时和费用,再用真实修复任务检验成功率与恢复行为。
6.3 Harness 和上下文工程有什么区别?模型变强后 Harness 还重要吗?
考察重点
- 解释上下文工程在 Harness 中负责哪部分工作。
- 说明模型能力提升后,哪些设计可以简化,哪些运行时职责仍然存在。
参考回答
上下文工程是 Harness 的信息组织模块;模型变强后,实际执行与授权等职责仍需要 Harness。
上下文工程决定每轮给模型看什么,负责选择、排序、压缩和隔离信息。Harness 还需要执行工具、持久化状态,并校验权限和任务结果。
模型升级后,可以评估是否简化过细的工作流拆分、固定提示模板或多轮自我检查。这些结构如果不再改善结果,就会成为额外开销。执行、授权、外部验证与故障恢复仍由运行时承担,是否简化应通过同一任务集的对照评测决定。
6.4 Hook 能否保证危险工具调用一定被拦截?
考察重点:解释事件时机与错误处理怎样影响拦截,并区分 Hook 检查和执行权限。
相关内容:Hook 的事件与阻断能力。
参考回答
Hook 无法单独保证所有危险调用都被拦截,效果取决于事件、匹配规则和失败处理。
Claude Code 的 PreToolUse 命令钩子返回退出码 2 时,可以在执行前阻止调用。PostToolUse 运行时,工具副作用已经发生。所以权限检查还需落实到实际执行路径,并用沙箱限制访问范围。配置 Hook 后,还要验证规则未匹配、处理器异常或超时时的行为。