什么是 Agent Harness
@[toc]
## 从“会回答”到“能完成任务”
假设你让模型修复一个 Python 程序。聊天模型可以给出修改建议,但要把建议变成结果,还需要读取文件、执行修改、运行测试,再根据真实错误继续调整。模型之外负责这些动作、上下文和约束的运行环境,就是本教程要构建的 **Agent Harness**。
Harness 原意可以理解为承载、连接和约束系统的装置。在 Agent 开发中,它为模型提供观察环境与采取行动的接口。模型决定下一步做什么,Harness 负责让动作真正发生,并把结果送回模型。
## 模型、Agent 与 Harness 怎么区分
本专栏把“模型”理解为负责理解任务、推理和选择动作的部分,把“Agent 系统”理解为模型、工具、状态与执行循环组成的整体。Harness 是围绕模型搭建的运行环境,负责提供信息、执行动作并实施约束。
例如模型可以判断“先读配置,再运行测试”,但它不会凭空拥有你的文件和终端。Harness 将读取工具与命令工具提供给它,并负责把真实结果反馈回来。确定性步骤也可以由程序直接控制,实际系统常把工作流与模型决策结合使用。
| 部分 | 负责什么 | 编程场景示例 |
| --- | --- | --- |
| 模型 | 理解目标、分析信息、选择动作 | 决定先读配置还是先运行测试 |
| 工具 | 执行明确的操作 | 读文件、替换文本、运行命令 |
| 知识 | 提供领域方法和资料 | 项目规范、API 文档、Skill |
| 上下文 | 承载当前可见的信息 | 对话历史、工具结果、任务摘要 |
| 持久状态 | 保存跨会话目标和进度 | 任务 JSON、团队名册、事件日志 |
| 权限 | 约束哪些动作可以执行 | 目录边界、沙箱、审批与预算 |
## 最小闭环长什么样
阅读后续代码前,先认识三个常见词:**Schema** 是参数格式说明;**handler** 是接收参数并实际执行操作的函数;**上下文** 是本次模型请求能够看到的提示、消息历史和工具结果。它们分别回答“怎么调用”“谁来执行”“模型现在知道什么”。
下面先展示最小循环的核心片段,帮助理解流程。它用到的 client、MODEL、SYSTEM、TOOLS 和 run_bash 会在下一篇“Agent 循环”中与完整程序一起给出;本篇先理解闭环即可。
```python
def agent_loop(messages: list):
while True:
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=TOOLS, max_tokens=8000,
)
# Append assistant turn
messages.append({"role": "assistant", "content": response.content})
# If the model didn't call a tool, we're done
if response.stop_reason != "tool_use":
return
# Execute each tool call, collect results
results = []
for block in response.content:
if block.type == "tool_use":
print(f"\033[33m$ {block.input['command']}\033[0m")
output = run_bash(block.input["command"])
print(output[:200])
results.append({"type": "tool_result", "tool_use_id": block.id,
"content": output})
messages.append({"role": "user", "content": results})
```
可以按四个动作读这段代码:
1. 把现有 messages 和工具定义一起发给模型。
2. 保存模型响应,让后续请求能够看到已经发生的工具调用。
3. 如果存在 tool_use,执行工具并用 tool_use_id 关联结果。
4. 把 tool_result 放回消息列表,再调用模型;没有工具调用时退出。
这形成了“观察 → 决策 → 行动 → 反馈”的闭环。它让模型能根据实际输出修改方案,但不会自动保证任务成功。运行测试、检查退出码和确认交付物仍是必要步骤。
## Harness 工程师要解决哪些问题
首先是工具设计。工具名称和参数应明确,失败结果要能帮助模型修正动作。其次是知识组织:让模型先看到简短索引,再按需加载领域说明。然后是上下文管理:把局部调查交给子 Agent,把重复长输出移出活跃历史,将重要目标保存在磁盘。
当任务变大,还需要异步执行、团队消息与目录隔离。后台任务解决等待,团队邮箱解决协作通信,任务系统解决目标与依赖,worktree 解决工作目录分离。这些机制各自处理不同问题,不能用“多开几个 Agent”替代全部工程设计。
权限同样属于 Harness:不应只靠提示词告诉模型“不要越界”。文件路径、命令权限和需要授权的动作,要在执行入口做明确检查。教学代码展示机制,生产系统还需要更完整的保护与恢复能力。
## 专栏学习路线
本专栏共 13 篇:本篇导读,加上 s01 到 s12 的十二个机制。所有文章放在“Agent Harness 教程”目录中,按编号阅读即可。
| 文章 | 核心机制 | 学习结果 |
| --- | --- | --- |
| 01|Agent 循环:让模型真正动手 | agent_loop | 理解 messages、tool_use、tool_result 和 stop_reason 如何组成最小执行闭环。 |
| 02|工具调用:设计可扩展的工具层 | tool_use | 掌握工具 Schema、处理函数与分发字典之间的关系,并理解路径校验的边界。 |
| 03|Todo 规划:让多步任务有进度 | todo_write | 实现带状态校验的 TodoManager,并理解进度提醒怎样进入上下文。 |
| 04|子 Agent:隔离上下文,拆解复杂任务 | subagent | 理解独立 messages 列表、工具权限差异,以及父子 Agent 之间的结果边界。 |
| 05|Skill 加载:按需提供领域知识 | skill_loading | 理解 Skill 的两层加载方式,并实现从 SKILL.md 到工具结果的知识通道。 |
| 06|上下文压缩:为长任务保留关键记忆 | context_compact | 区分微压缩、自动摘要和手动压缩,并理解压缩会带来的信息损失。 |
| 07|任务系统:持久化目标与依赖关系 | task_system | 掌握任务 JSON 文件、状态流转与 blockedBy 依赖解除机制。 |
| 08|后台任务:让慢操作与思考并行 | background_tasks | 理解后台任务 ID、执行线程、状态查询与结果通知队列。 |
| 09|Agent 团队:用异步邮箱协调队友 | agent_teams | 理解团队名册、独立循环和 JSONL 邮箱,区分持久化身份与常驻执行。 |
| 10|团队协议:让请求与审批形成闭环 | team_protocols | 掌握 request_id 关联机制,以及 pending、approved、rejected 状态机。 |
| 11|自治 Agent:主动认领任务与恢复工作 | autonomous_agents | 理解 WORK 与 IDLE 两阶段、自动认领条件和身份重注入。 |
| 12|Worktree 隔离:为任务建立独立工作区 | worktree_task_isolation | 理解任务与 worktree 的双向关联、隔离命令执行,以及保留和删除的生命周期。 |
前六课建立单 Agent 的工具、规划与上下文能力;第七、八课引入持久任务与后台执行;后四课讨论团队、协议、自治和工作区隔离。后续十二篇教程都贴出独立运行所需的完整代码,工具集合不保证逐课累加。
## 开始前需要准备什么
开始学习只需准备两样东西:
1. **Python 3.10 或更高版本。** 用于运行后续教程提供的程序。
2. **可用的 Anthropic 兼容接口。** 准备好 API 密钥、接口支持的模型名称;使用兼容服务时还需要接口地址。接口应支持 Anthropic Messages 协议和工具调用。
后续每篇教程都会直接给出完整的可运行代码、依赖安装命令、配置说明和所需的练习材料。到对应章节时,按步骤创建文件、粘贴代码,填写你自己的接口配置即可运行。
下一篇从最小 Agent 循环开始:用完整程序创建文件、运行命令,再读取真实结果。导读篇先建立概念,不需要先启动任何程序。
## 这套教程能带你走到哪里
学完后,你应能说明一个 Agent 系统怎样调用工具、规划工作、管理记忆、持久保存任务,以及怎样让多个执行者协作。你也应能识别教学实现与生产要求的差距:完整权限治理、可靠消息投递、事务认领、会话恢复与 MCP 运行时并未在这里全部实现。
更换领域时,闭环思路仍然有用。例如客服系统把文件工具换成知识检索与工单接口,研究助手把命令执行换成文献检索与实验工具;工具、知识和授权边界都要随业务变化重新设计。
本教程围绕编程 Agent 的常见机制展开,重点是理解并亲手搭建 Harness。模型能力和环境质量共同决定结果,好的 Harness 能让动作更可控、结果更可验证。
