10.02概念更新于 2026年9月17日

Harness 的组件

工具调度、上下文管理、权限、会话、错误恢复与生命周期。

10.02 · 课时讲解

Harness 的组件

十个模块,每个模块背后都藏着一个需要产品拍板的决策。

1 / 12

一句话理解:Harness 可以拆成十个模块:循环控制、上下文装配、工具注册与调度、权限策略、执行环境、会话与状态、错误恢复、生命周期事件、预算限制和可观测性;每个模块背后都藏着一个需要产品来拍板的决策。

上一课我们知道了 Harness 是模型外面的整套运行系统。但“运行系统”太抽象,没法拿去评审。和研发讨论时,更有效的做法是画一张组件图,然后逐个模块问:“这里的默认行为是什么?谁来决定?出错了会怎样?”

这一课给你这张图,并用「订单售后诊断 Agent」把每个模块落到具体设计上。

一张架构图

Harness 组件架构:入口与会话管理、循环控制器内的七个环节、贯穿全程的横切能力,以及状态存储与 Trace 用户 / 触发器 入口与会话管理 恢复 / 分叉会话 循环控制器 · 反复执行,直到最终回答或触发停止条件 上下文装配 模型调用 输出解析 工具调度器 权限与策略引擎 执行环境 / 沙箱 结果整形 最终回答 · 停止 无工具调用 贯穿全程:生命周期事件(Hooks) · 预算与限制 · 错误恢复 状态与会话存储 Trace / 日志 / 计费
图 1 · Harness 组件架构:循环控制器反复执行七个环节,横切能力贯穿全程

读图顺序:请求进入后,循环控制器反复执行“装配上下文 → 调模型 → 解析输出 → 调度工具 → 权限检查 → 执行 → 整形结果 → 回到装配”,直到模型给出不含工具调用的最终回答,或触发停止条件。

十个模块逐个看

1. 循环控制器

负责“继续还是停”。停止的原因包括:模型给出最终回答、达到最大轮数、超出预算、被用户中断、遇到需要人工的节点。停止条件的设计细节见 停止条件。

产品决策:上限设多少?达到上限时是直接失败、返回部分结果,还是允许用户“加额度继续”?

2. 上下文装配器

每次调用模型前,把系统指令、项目说明、工具定义、历史消息、工具结果、记忆拼成一次请求。长任务里它还要负责压缩和清理(见 长任务的上下文管理)。

产品决策:哪些信息每步都给(例如业务规则),哪些按需加载(例如某类商品的退款政策)?

3. 工具注册与调度器

维护“有哪些工具、参数长什么样、实际调用哪个函数”,并决定多个工具调用是并行还是串行。一个值得借鉴的默认策略:Claude Agent SDK 会让只读工具并发执行,而会修改状态的工具(编辑文件、执行命令)按顺序执行,避免互相冲突。

这个分流策略可以画成下图:

工具调度器把同一轮的工具调用按读写分流:只读工具并发执行,修改状态的工具按顺序执行 模型 一轮发出多个调用 工具调度器 按读写分流 只读工具 · 并发执行 读文件 搜索 查询接口 修改状态的工具 · 按顺序执行 编辑文件 执行命令
图 2 · 调度策略:只读并发、写操作串行,避免互相冲突

产品决策:给模型暴露多少工具?是一次全部暴露,还是按场景动态加载?

4. 权限与策略引擎

在工具真正执行前判断“允许、拒绝还是问人”。常见的配置维度有三个:允许清单(自动放行)、拒绝清单(无论如何都不执行)、权限模式(整体上有多信任 Agent)。以 Claude Agent SDK 为例,权限模式包括默认模式、自动接受文件编辑、只规划不修改、以分类模型自动审批等多档,并明确建议“跳过所有权限检查”的模式只在隔离环境中使用。

产品决策:操作如何分级?详见 操作分级 与 Human-in-the-loop。

5. 执行环境

工具在哪里执行:调用远程 API、在本地终端、在容器沙箱、在浏览器里。执行环境决定了“最坏情况下能造成多大破坏”,详见 沙箱。

6. 会话与状态存储

保存对话历史、任务进度、中间产物,支持恢复与分叉。注意一个容易忽略的边界:Claude Agent SDK 的文档明确指出,会话保存的是 对话,不是文件系统;要回滚 Agent 改过的文件需要单独的文件检查点机制。这类边界在 会话与持久化 中展开。

7. 错误恢复

处理模型 API 限流、工具超时、参数错误、做到一半中断等情况。详见本模块的 错误恢复与重试。

8. 生命周期事件(Hooks)

在“工具调用前后、会话开始结束、上下文压缩前”等时刻插入确定性代码,用于审计、拦截、改写参数、注入上下文。详见 Hooks 与生命周期。

9. 预算与限制

轮数、Token、金额、时长、并发数。Claude Agent SDK 提供了按轮数(max_turns)和按金额(max_budget_usd)两种上限,触发时返回对应的错误类型;OpenAI Agents SDK 的 Runner 同样有 max_turns,超过时抛出 MaxTurnsExceeded。

10. 可观测性

记录每一次模型调用与工具调用的输入、输出、耗时、Token 与成本,支撑调试、评估和计费。详见 Tracing。

把组件落到订单售后诊断 Agent 上

模块 设计决策 默认值 谁拍板
循环控制 最大轮数;打转检测 15 轮;同一工具同一参数连续 3 次即停 产品 + 研发
上下文装配 订单操作记录保留条数;规则文档加载方式 最近 20 条;退款规则按商品类目按需加载 产品
工具调度 并行策略 查询类并行;创建工单串行 研发
权限策略 操作分级 查询自动;发通知需确认;改订单状态需主管审批 产品 + 业务
执行环境 数据分析脚本在哪跑 无外网的隔离容器 研发 + 安全
会话与状态 会话保留多久;批量任务进度存哪 会话 30 天;进度存业务库 产品 + 合规
错误恢复 重试与降级 超时重试 2 次;仍失败标记“待人工” 产品
Hooks 需要强制执行的规则 写操作前校验订单归属;所有调用写审计日志 产品 + 安全
预算 单任务成本上限 单个订单诊断不超过设定金额 产品
可观测性 记录粒度与脱敏 全量记录;手机号脱敏 研发 + 合规

这张表本身就是一份很好的评审材料:每一行都对应一个“如果不定,研发就会自己拍一个默认值”的决策点。

框架里的组件对应关系

不同框架把这些组件叫不同的名字。下表只列出已在官方文档核实过的对应项,便于你看文档时快速定位:

模块 Claude Agent SDK OpenAI Agents SDK LangGraph
循环控制 内置 Agent Loop,max_turns Runner,max_turns 由你定义的图(节点与边)
权限 allowed_tools、disallowed_tools、permission_mode 工具级审批(needs_approval)、Guardrails 在节点中用 interrupt() 暂停等待人工
生命周期 Hooks(如 PreToolUse、PostToolUse) RunHooks / AgentHooks 图中的节点本身
会话与状态 Sessions(resume / fork) Sessions(如 SQLiteSession) Checkpointer + thread_id
可观测性 结果消息中的用量与成本 内置 Tracing 需结合配套工具

常见误区

  • “这些组件第一版都要做全。” 第一版至少要有:最大轮数、工具错误处理、写操作确认、完整日志。其余可以随规模补齐。
  • “权限写在 Prompt 里就行。” Prompt 是建议,不是强制。必须保证的规则要放进权限引擎或 Hooks,见 程序校验优先。
  • “状态就是聊天记录。” 聊天记录很难被程序可靠解析。批量任务的进度应该是结构化数据,见 任务状态与 Checkpoint。

设计要点

  • 为每个模块写下“默认行为”和“失败行为”,缺一不可。
  • 把“必须遵守”的规则从 Prompt 中挑出来,下沉到权限引擎、Hooks 或工具实现里。
  • 每个工具调用都要有唯一 ID,贯穿权限判断、执行、日志与结果,方便追查。
  • 预算至少设两道:轮数上限和金额上限,并决定触发后的用户体验。
  • 会话、任务状态、业务数据分开存,不要让聊天记录充当数据库。

练习

拿出你正在设计(或正在使用)的一个 Agent,照着本课的“订单售后诊断 Agent”表格,填写十个模块的设计决策、默认值和拍板人。标出其中 还没有人想过 的格子,这些就是下一次评审会要讨论的议题。预计用时 40 分钟。

延伸阅读

  • How the agent loop works:Claude Agent SDK 对循环、消息类型、权限模式、预算与自动压缩的完整说明。
  • OpenAI Agents SDK:Agents、Handoffs、Guardrails、Sessions、Tracing 等核心原语。

下一步

接下来几课逐个拆开这些模块,先从最基础的一环讲起:下一课「上下文装配:每一轮请求怎么拼出来」,看 Harness 每一轮到底把哪些东西、按什么顺序交给模型。

试试:上下文、MCP、沙箱、Prompt 注入、外链