地图 《AI 应用工程师学习地图》 第 4 / 7 个系列
- 模型作为组件
- Prompt 与上下文工程
- 检索与知识接入
- 工具、Agent 与 harness
- 评测、可观测与可追溯即将发布
- 生产化与运营即将发布
- 产品与体验即将发布
上一个系列:检索与知识接入下一个系列:评测、可观测与可追溯即将发布
内容简介
《工具、Agent 与 harness:模型怎么从回答变成做事》是一组共九篇的系列文章,是《AI 应用工程师学习地图》第四层(L4)的正文。前三层讲的模型只回答:它读上下文、给出文本。这一层讲它怎么做事——调用工具、执行命令、修改文件、操作业务对象——以及让这件事可靠所需要的一切:一个循环、一套协议、一个运行时、一组权限、一层沙箱、一个持久化的会话、几个子 agent、一份记忆、一个把人放在合适位置的机制。业内把模型之外的这一切叫 harness(马具)。
2026 年是 harness 成为独立产品的一年。OpenAI 在 9 月 10 日把驱动 Codex 的 harness 作为 Agents API 公测——”OpenAI 托管并维护 harness,你选择 agent 的计算环境”,并强调 harness 建在开源的 Codex 代码库上(codex-rs,五十多万行 Rust)。DeepSeek 在 8 月 13 日发布 DeepSeek Harness(dsh)开发者预览,MIT 许可,口号是”一切都是插件”:模型、工具、技能、会话、沙箱、存储、循环、调度、UI 全部是可替换的 Cordis 插件。Anthropic 的 Claude Code 把自己的 harness 以 Agent SDK 的形式开放,权限系统、hooks、子 agent、技能都可编程。学术界与社区有 OpenHarness 一类开源实现。四个 harness 在同一批问题上给出了不同答案:循环放在哪、工具怎么注册、上下文怎么压、权限怎么判、沙箱用什么、会话怎么存、子 agent 怎么起——本系列第六篇把它们放在源码层面对照。
它回答的问题是:
一个 agent 循环的最小形态是什么,成熟的 harness 在它之上加了什么?工具调用的协议(MCP)2026 年长什么样,为什么出现了 tool search 与程序化工具调用?agent 运行时为什么是一种新的服务形态?权限与沙箱怎么设计才能让 PocketOS 那样的事不发生?Codex、DeepSeek Harness、Claude Code、OpenHarness 各自怎么解这些问题?多 agent 什么时候值得?人该站在环内、环上还是环外?1
九篇沿一条线走。第一篇解剖最小的 agent 循环——模型读上下文、返回工具调用、应用执行、结果写回、再来——用 Codex 的三层循环(submission_loop → turn loop → 工具编排器)与 DeepSeek Harness 的 agent-loop(领取 prompt → 在会话日志上开一个 turn → 组装 → 流式 → 分发工具 → 追加)做实例,说明终止条件、循环卫士(重复工具调用提醒、单次工具超时)为什么必要。第二篇讲工具调用的协议:MCP 的 2026-07-28 版(无状态核心、多轮往返请求、扩展框架——Tasks、Apps、Skills over MCP——授权加固、由 Linux 基金会下的 Agentic AI Foundation 治理)、工具描述、tool search(定义按需加载)与程序化工具调用(模型写一段程序调用多个工具、只返回结果——Anthropic 的 PTC、OpenAI GPT-5.6 的 Responses PTC、Cloudflare 的 Code Mode、DeepSeek Harness 的 Code 模式与 ptc-runtime、Codex 的 code-mode crate)。第三篇讲运行时——为什么 agent 是传统服务与模型 serving 之外的第三种服务形态:事件溯源的会话日志(DeepSeek Harness 的”模型可见 ⟺ 已记录”不变量、resume / fork / replay 在同一事件流上)、Codex 的 rollout 与 thread-store、LangGraph 的 checkpoint、Temporal 一类 durable execution、OpenAI Agents API 的托管运行时与九家沙箱合作方、挂起等人、事件流推前端。第四篇讲长任务的上下文管理与子 agent:《Prompt 与上下文工程(04):上下文预算与压缩——给每一部分定配额,超了怎么办》的卸载 / 清理 / 压缩在运行时里的实现(Codex 的 compact* 模块、DeepSeek Harness 的 compaction 与 spill 包组)、plan / todo / goal 作为复述机制、子 agent 的三种形态(Claude Code 的 subagent 与 agent teams、Codex 的 multi_agents、DeepSeek Harness 能把 Claude Code 与 Codex 作为子 agent 拉起)。第五篇讲权限、沙箱与安全边界——本系列最重要的一篇:Codex 的权限档(read_only / workspace / danger_full_access)、审批策略、execpolicy 的 Starlark 前缀规则(allow / prompt / forbidden)、Guardian 审查、三平台沙箱(macOS Seatbelt、Linux bubblewrap + Landlock + seccomp、Windows 受限令牌);Claude Code 权限判定的六步顺序(hooks → deny → ask → 模式 → allow → 回调)与五种模式;DeepSeek Harness 的 read-only / workspace-write / danger-full-access 与审批策略插件;云沙箱;工具返回里的注入;PocketOS 事件的五环在这一层如何逐环被防住。第六篇是源码级对照——语言与架构、循环、工具注册、上下文、权限、沙箱、会话、子 agent、扩展模型、UI 面、模型耦合、基准模式——以及 Agents API(托管)、Agents SDK(库)、Harness(自托管产品)三种交付形态的取舍。第七篇讲多 agent:什么时候需要、orchestrator-workers / handoff / 层级三种模式、Claude Code agent teams 与 GPT-5.6 的 ultra 模式、A2A 协议、成本(Anthropic 的研究系统约 15 倍 token)与调试代价、”先用一个 agent 加更好的工具”。第八篇讲 memory 与 human-in-the-loop:记忆的写入与遗忘(Anthropic 的 memory tool、Claude Code 自动记忆 25 KB、Codex 的 memories)、人从环内退到环上、环外的路径与每一级需要的验证、审批粒度、request_user_input 与 MCP elicitation、本体驱动的业务 agent 作为业务侧的 harness。第九篇讲可靠性、评测与运营:失败分类学、幂等工具、预算、轨迹评测(SWE-bench Verified、Terminal-Bench 4.0、τ-bench)、trace、每任务成本、从 demo 到生产的清单。
系列的组织原则:harness 的每一个组件都是对 L1 某条失效模式的防线。循环卫士防死循环,权限与沙箱防越界(PocketOS),会话日志防”任务跑到一半丢了”,压缩防上下文腐化,子 agent 防预算耗尽,人机分工防不可逆的错误。九篇的每一篇都标出它防的是哪一条、代价是什么。
缩写
本系列的 30 个缩写(展开)
| 缩写 | 全称 | 一句话解释 |
|---|---|---|
| A2A | Agent2Agent | 不同厂商的 agent 之间互相委派任务的协议 |
| AAIF | Agentic AI Foundation | Linux 基金会下治理 MCP 等项目的基金会 |
| ACL | access control list | 访问控制列表,按用户 / 组列出允许的操作 |
| ACP | Agent Client Protocol | 客户端驱动外部 agent 的协议,如拉起 Claude Code |
| AIP | Artificial Intelligence Platform | Palantir 的 AI 平台,agent 在本体上做动作 |
| CIMD | Client ID Metadata Document | 用一个 URL 上的元数据文档代替客户端注册 |
| DCR | Dynamic Client Registration | OAuth 客户端运行时自动注册(RFC 7591) |
| DDL | data definition language | 建表、删表这类改数据库结构的语句 |
| E2E | end-to-end | 端到端测试 |
| GenAI | generative AI | 生成式 AI;OpenTelemetry 为它定了语义约定 |
| gRPC | gRPC Remote Procedure Calls | Google 开源的 RPC 框架,用 Protobuf 编码 |
| JSONL | JSON Lines | 每行一个 JSON 对象的文本格式,适合只追加写 |
| LSP | Language Server Protocol | 编辑器与语言服务器之间的协议,MCP 借鉴了它 |
| MCP | Model Context Protocol | 模型客户端连接工具服务器的开放协议 |
| MRTR | multi round-trip request | server 需要输入时结束请求,由 client 带结果重发 |
| OAuth | Open Authorization | 授权委托标准,远程 MCP server 用它鉴权 |
| OOM | out of memory | 内存耗尽 |
| p50 / p95 | 50th / 95th percentile | 中位数 / 第 95 百分位,用来看长尾 |
| PTC | programmatic tool calling | 模型写程序调多个工具,只把结果送回上下文 |
| RFC | Request for Comments | IETF 发布互联网标准的文档系列 |
| RPC | remote procedure call | 远程过程调用 |
| SAE | Society of Automotive Engineers | 国际汽车工程师学会,自动驾驶 0–5 级出自它 |
| SBPL | Sandbox Profile Language | macOS Seatbelt 沙箱的策略语言 |
| seccomp | secure computing mode | Linux 限制进程能用哪些系统调用的机制 |
| stdio | standard input/output | 标准输入输出,本地 MCP server 的传输方式 |
| TS | TypeScript | TypeScript 的简写 |
| TTFT | time to first token | 从发出请求到收到第一个 token 的时间 |
| TUI | terminal user interface | 在终端里画出来的交互界面 |
| VPC | virtual private cloud | 云上隔离出来的私有网络 |
| ZDR | zero data retention | 零数据保留:供应商不存请求与响应数据 |
为什么写这个系列?
harness 决定了同一个模型能走多远
“同样的模型,更好的 harness,更好的 agent”——DeepSeek 把 harness 作为独立产品发布时的理由,也是 OpenAI 把 Codex 的 harness 拆成 Agents API 的理由。2026 年的前沿模型能力相近,产品之间的差距越来越多地来自模型之外:工具集设计得好不好、上下文压得对不对、权限判得准不准、任务中断了能不能续、人在哪一步介入。一个只会调 API 的团队与一个会建 harness 的团队,用同一个模型做出的产品差一个量级。
源码公开了,可以对照着讲
这是写这个系列的时机。Codex 的 codex-rs 是公开的 Rust 代码库(core、sandboxing、execpolicy、hooks、app-server、code-mode 等几十个 crate),DeepSeek Harness 是公开的 TypeScript 单体仓库(packages/core 的 agent-loop / session / tools、sandbox / compaction / spill / subagent / guard / ptc-runtime 等包组,附架构文档与 Cordis 教程),Claude Code 的 Agent SDK 文档把权限判定顺序、子 agent 与 agent teams 的差别、hooks 的生命周期写得很具体。三家在同一批问题上的不同答案,是理解”harness 是什么”最好的教材——比任何框架教程都好。
事故告诉我们缺哪一格会怎样
《模型作为组件(01):失效模式——非确定性、幻觉、上下文与越界,把「模型会出错」拆成七条可检测的性质》讲过的三个事件——Replit 的 agent 在代码冻结期删库、PocketOS 的 Cursor agent 用一个无关文件里权限过宽的 token 在 9 秒内删掉生产卷与备份、OpenAI 约 700 个测试中的 agent 入侵 Hugging Face——每一个都能在 harness 的组件表上找到缺的那一格:环境隔离、最小权限、确认门、可回滚、沙箱出口。本系列第五篇逐环讲这些格子怎么填。
现有材料的断层
- 框架文档(LangGraph、各家 Agent SDK)教你用它的 API,不讲它为什么这样设计、别家为什么不这样;
- 供应商的发布博客各讲自己的 harness,没有横向对照;
- 安全研究讲 prompt injection 与沙箱逃逸,很少与 agent 的权限模型放在一起讲;
- “agent 教程”多停在 ReAct 循环与工具调用,不讲运行时、持久化、权限、子 agent 这些让循环能上生产的部分。
本系列想填补的是从”能写一个 ReAct 循环”到”能为一个业务场景设计 harness——选交付形态、定工具集、建会话日志、写权限规则、配沙箱、决定人站在哪、用轨迹评测证明它可靠”之间的那段路。
适合哪些读者?
要做 agent 产品的应用工程师
全部九篇。第一、五、九篇是最小必读。
平台工程师,要为团队提供 agent 运行时
第三、五、六篇:运行时形态、权限与沙箱、三种交付形态的取舍。
想读懂 Codex / DeepSeek Harness / Claude Code 的开发者
第六篇是入口,第一、四、五篇给每个子系统的展开。
业务侧的 AI 应用负责人
第五、八篇:agent 能做什么错事、人该站在哪、本体驱动的业务 agent 怎样把验证前移。
系列的整体主线
| 篇 | 主题 | 建立的东西 | 防 L1 的哪条失效 | 代价 |
|---|---|---|---|---|
| 1 | 最小循环 | 循环的形态、终止条件、卫士;Codex 与 DeepSeek Harness 的循环实现 | 非确定性(死循环) | 步数与预算上限 |
| 2 | 工具与 MCP |
|
指令遵循(用错工具);上下文(定义占预算) | 协议复杂度 |
| 3 | 运行时 |
|
“任务丢了”;供应商变更(锁定) | 持久化与恢复的工程 |
| 4 | 上下文与子 agent |
|
上下文标称 ≠ 有效;预算耗尽 | 子 agent 的 token 与调试 |
| 5 | 权限与沙箱 | 权限档、审批策略、执行策略语言、三平台沙箱、注入 | 越界 | 摩擦与审批疲劳 |
| 6 | 源码对照 | 四个 harness 的十二维对照;三种交付形态 | —(综合) | — |
| 7 | 多 agent |
|
预算耗尽(多 agent 的 15 倍) | token 与调试 |
| 8 | memory 与人 |
|
越界(不可逆);知识截止(记忆) | 人的时间 |
| 9 | 可靠性与评测 |
|
全部(验证) | 评测的工程 |
三条贯穿的线:
- 循环之外的一切都是 harness。 模型只做两件事:决定下一步、读结果。校验、权限、执行、配对、截断、持久化、恢复、压缩、隔离、审批、评测——全是应用侧的。第一篇立这个框,后面八篇填。
- 验证能自动化到什么程度,agent 就能自主到什么程度。 代码有测试所以 coding agent 最先成熟;业务动作没有测试,所以要把验证前移到本体(第八篇);不可逆动作永远要确认门(第五篇)。
- 权限范围是错误的上限。 模型的判断永远不是 100%,让错误不变成灾难的是权限、隔离、确认、可回滚(第五篇);harness 的价值首先是把错误的上限压低,其次才是让模型更能干。
章节结构与分章导读
1. 最小 agent 循环的解剖
核心问题:agent 循环的最小形态是什么?它在哪些地方会失控?Codex 与 DeepSeek Harness 的循环各分几层、每层管什么?2
从一个 40 行的循环开始:组装上下文 → 调模型 → 有工具调用则执行并写回 → 否则结束;加上四个卫士——步数上限、token 预算、重复调用检测、单次工具超时。然后看两个生产实现:Codex 的三层——submission_loop(会话生命周期,接收 Op)→ turn loop(一次用户输入触发:组装 prompt、调 Responses API、处理输出项)→ 工具编排器(tools/orchestrator.rs:审批 → 选沙箱 → 首次尝试 → 失败时的升级路径),客户端与会话之间是一对操作 / 事件队列(app-server 的 JSON-RPC 之上);DeepSeek Harness 的 agent-loop——领取排队的 prompt → 在会话日志上开一个 turn → 经 system-prompt 组装请求前缀、从日志派生历史 → 流式调模型 → 经工具注册表分发 → 把每个模型可见的事实追加回日志再派生下一步;guard 包组的两个卫士:重复工具调用提醒(模型重复完全相同的调用时提醒它换方法或结束)与单次工具超时。Anthropic《Building effective agents》里”工作流 vs agent”的区分作为设计起点:能用固定流程的不要用循环。
2. 工具调用与 MCP:协议、tool search 与程序化工具调用
核心问题:MCP 2026-07-28 版改了什么,为什么?工具描述怎么写才让模型用对?tool search 与程序化工具调用各解决什么问题?3
《模型作为组件(02):API 契约(一)——消息、工具调用、结构化输出与流式,四家 API 的共同骨架》讲了工具调用的往返协议,这一篇讲工具的生态协议。MCP(Model Context Protocol)2025 年 12 月由 Anthropic 捐给 Linux 基金会下的 Agentic AI Foundation(OpenAI、Block 共同创始),TypeScript 与 Python SDK 各过十亿次下载;2026-07-28 版是发布以来最大的修订:无状态核心(initialize 握手取消,版本与能力协商放进每个请求的 _meta 与 MCP-Protocol-Version 头,Streamable HTTP 去掉会话 id——能在普通 HTTP 基础设施上横向扩展)、多轮往返请求替代服务端发起的请求、扩展框架(反向 DNS 标识、独立版本:Tasks——长任务的轮询与持久句柄、MCP Apps——对话内渲染的 UI、Skills over MCP、企业托管授权)、授权加固(RFC 9207 的 iss 校验、RFC 8707 的 resource 参数绑定受众、动态客户端注册弃用改为客户端元数据文档 CIMD),Sampling / Roots / Logging 十二个月弃用窗口,注册表仍在预览。然后是三个工程问题:工具描述的写法(《模型作为组件(02):API 契约(一)——消息、工具调用、结构化输出与流式,四家 API 的共同骨架》的延伸,Codex 的 agents_md 与 DeepSeek Harness 的 system-prompt 怎样把工具说明拼进系统提示);tool search——几十个 MCP 工具的完整 schema 占几千 token,Codex(tools/handlers/tool_search.rs)、Claude Code(MCP 工具 schema 延迟加载)、OpenAI Responses 都做成按需加载,代价是这些定义不在缓存前缀里(《Prompt 与上下文工程(05):prompt caching 与上下文的排列》);程序化工具调用(PTC)——让模型写一段程序,在沙箱里调用多个工具、处理中间结果、只把最终输出送回上下文:Anthropic 的 programmatic tool calling、OpenAI GPT-5.6 在 Responses 里的 PTC(同时让它兼容零数据保留)、Cloudflare 的 Code Mode、DeepSeek Harness 的 Code 模式(工具经 Code Mode SDK 暴露、一个 TypeScript 程序组合多步)与 ptc-runtime 包组(模型写一个程序调用宿主函数、只返回打印输出与返回值)、Codex 的 code-mode 系列 crate——它解决的是 L2 的预算问题:中间结果不进上下文。
3. agent 运行时:会话、持久化与 durable execution
核心问题:为什么 agent 运行时是一种新的服务形态?事件溯源的会话日志解决什么?durable execution 是什么?托管运行时(Agents API)与自托管各换了什么?4
地图里那张三列表(传统服务 / 模型 serving / agent 运行时)在这里展开:一次调用分钟到小时、几十次模型调用与工具执行交替;每一步都要持久化,崩溃、重启、等人之后从断点续跑;控制流由模型决定、运行时只给边界;可能挂起几小时等审批;并发单位是会话。事件溯源的会话日志是这一形态的核心数据结构——DeepSeek Harness 把它作为不变量:”任何进入模型请求的东西都必须能从会话日志重建;一个新的模型可见输入需要一个会话事件”,append-only 的 SessionEvent 日志是唯一事实来源,resume、fork、search、replay 在同一事件流上操作,Trajectory 视图按来源检视每一条;Codex 的 rollout 与 thread-store、app-server 之上的操作 / 事件队列是同一思想的 Rust 实现。durable execution:LangGraph 把 agent 建成带 checkpoint 的状态图、Temporal 一类工作流引擎把每步持久化、崩溃后从 checkpoint 继续——agent 运行时最接近的老概念。托管运行时:OpenAI Agents API(2026-09-10 公测,无额外费用、只收 token 与工具费)把会话状态、编排、上下文压缩、恢复放在 OpenAI 侧,你选沙箱(OpenAI 托管、自己的基础设施、或 Blaxel / Cloudflare / Daytona / DigitalOcean / E2B / Modal / Oracle / Runloop / Vercel 九家合作方),一次 API 调用创建能跑几天的 agent;它与 Agents SDK(库,控制权在你的进程里)是两种交付形态,第六篇比较。挂起与唤醒(等人、等外部事件)、事件流推前端、中断与取消、并发会话的隔离。
4. 长任务的上下文管理与子 agent
核心问题:L2 讲的卸载 / 清理 / 压缩在运行时里怎么实现?plan / todo / goal 是什么?三种子 agent 各在什么情况下用?5
《Prompt 与上下文工程(04):上下文预算与压缩——给每一部分定配额,超了怎么办》讲了策略,这一篇看实现:Codex 的 core/src/compact*.rs 系列(本地压缩、远程压缩 v2、token 预算、图片预算、模型回退);DeepSeek Harness 的 compaction 包组(自动压缩、/compact 命令、工具结果修剪器先修剪再压缩、图片卸载为占位符)与 spill 包组(把全文存到上下文之外、返回一个带取回指引的定位符——《Prompt 与上下文工程(04):上下文预算与压缩——给每一部分定配额,超了怎么办》”卸载”的实现)。复述的实现:Codex 的 plan 工具与 get_context_remaining,DeepSeek Harness 的 plan / todo / goal 三个包(记录式规划、todo_write 工具、会话目标)——Manus 的 todo.md 在这里是一等功能。子 agent的三种形态:Claude Code 的 subagent(自己的上下文窗口、结果只回主 agent、token 较低)与 agent teams(各自独立、互相直接通信、共享任务列表、每个是独立实例、token 较高,v2.1.178 起免设置步骤但仍是实验特性);Codex 的 multi_agents / multi_agents_v2 工具处理器与 agent-roles crate;DeepSeek Harness 的 subagent 包组——进程内 fork(继承历史)、进程内 spawn(全新)、进程外驱动,以及 subagent-claude-code / subagent-codex / subagent-acp:一个 harness 把另外两个 harness 作为子 agent 拉起,这是 2026 年 harness 之间的互操作已经成为事实的证据。什么时候用子 agent(隔离探索性上下文、并行独立子任务、专业化角色),什么时候不用(任务本来就是串行的、结果需要完整过程)。
5. 权限、沙箱与安全边界
核心问题:权限档、审批策略、执行策略、沙箱四层各管什么?Codex、Claude Code、DeepSeek Harness 各怎么判一个工具调用能不能执行?PocketOS 的五环在这一层怎么逐环被防住?6
这是本系列最重要的一篇。四层:权限档(能碰什么)——Codex 的 PermissionProfile::read_only、:workspace(只写工作区根目录、.git 与 .codex 只读、网络可选受限)、:danger_full_access;DeepSeek Harness 的 read-only / workspace-write / danger-full-access;Claude Code 的 allow / deny / ask 规则(Bash(rm *) 一类作用域规则)。审批策略(什么时候问人)——Codex 的 AskForApproval 与 execpolicy:Starlark 写的前缀规则 prefix_rule(pattern=[...], decision=allow|prompt|forbidden, justification, match, not_match),match / not_match 是加载时校验的单元测试;Guardian 审查(一个模型审另一个模型的高风险调用);Claude Code 判定的六步顺序——hooks 先跑(可直接拒绝)→ deny 规则(即使 bypassPermissions 也生效)→ ask 规则 → 当前模式(bypassPermissions 放行、acceptEdits 放行文件操作、plan 把写操作一律送回调、dontAsk 拒绝所有未决)→ allow 规则 → canUseTool 回调;DeepSeek Harness 的审批策略插件。沙箱(执行时真正拦住)——Codex 三平台:macOS Seatbelt(sandbox-exec + SBPL 策略文件,写根目录之外只读)、Linux bubblewrap + Landlock + seccomp(分离的文件系统策略走 bubblewrap、旧路径走 Landlock)、Windows 受限令牌 + ACL + Job Objects,网络经代理策略;DeepSeek Harness 的 sandbox-local / sandbox-policy / sandbox-windows-acl;云沙箱(E2B、Modal、Daytona 一类 microVM / 容器)。输入边界——工具返回是不可信输入,间接注入从这里进来(《模型作为组件(02):API 契约(一)——消息、工具调用、结构化输出与流式,四家 API 的共同骨架》、L6 的分层防御)。然后把 PocketOS 的五环放到四层上:无关文件里的 token(权限档:agent 不该读到它 / 凭据不该在工作区)、权限过宽(最小权限)、staging 能碰生产(环境隔离)、无确认(审批策略:删除类命令 prompt 或 forbidden)、备份同卷(可回滚性)——每一环在一个成熟的 harness 里都有对应的格子。审批疲劳与”策略化授权”(从逐个批到批一类)。
6. 源码级对照:Codex、DeepSeek Harness、Claude Code、OpenHarness
核心问题:四个 harness 在十二个维度上各怎么选?为什么?Agents API、Agents SDK、自托管 harness 三种交付形态怎么取舍?7
一张十二行的对照表:语言与架构(Codex:Rust 工作区几十个 crate、core 为重心;DeepSeek Harness:TypeScript 单体仓库、几十个 @deepseek-ai/dsh-* 包、Cordis 插件树、profile / bundle / patch 三层配置;Claude Code:TypeScript,产品闭源、Agent SDK 与文件系统约定开放;OpenHarness:Python 开源、轻量、oh 一条命令)、循环(三层 vs 日志驱动 vs SDK 封装)、工具注册(tools/registry.rs + 路由 + 并行 vs 作用域注册表 + 守卫执行管线 vs 内置 + MCP + hooks)、上下文(compact* vs compaction + spill vs auto-compact 83.5%)、权限与审批(execpolicy Starlark + Guardian vs 审批策略插件 vs 六步判定)、沙箱(三平台原生 vs sandbox 包组 vs 工作目录与命令限制 + 云沙箱)、会话(rollout / thread-store vs 事件溯源 JSONL + 检查点 vs 会话文件)、子 agent(multi_agents vs 七种后端含 Claude Code / Codex vs subagent / agent teams)、扩展模型(Codex 的 plugins / hooks / skills / MCP vs 一切皆插件 + 四种模式 vs hooks / skills / plugins / MCP)、UI 面(TUI / app-server JSON-RPC / exec vs web / headless / sdk / acp 四个 profile vs CLI / IDE / SDK)、模型耦合(Responses API vs 多供应商含 pi-ai 目录 vs Claude 专用)、基准(DeepSeek Harness 的 Minimal 模式——只留 shell 与文件编辑器,为公平比较模型)。三种交付形态:Agents API(托管:会话、编排、压缩、恢复在 OpenAI 侧,你选沙箱,零基础设施,绑定 OpenAI 模型;早期用户报告 4 倍延迟降低、60% 每任务成本降低、86% 失败响应减少)、Agents SDK / Agent SDK(库:控制权在你的进程,自己管持久化)、自托管 harness(DeepSeek Harness 一类:全部可替换、多模型、自己运维)。每个维度写”为什么这样选”,最后一节是”从每家学什么”。
7. 多 agent:编排、handoff 与 A2A
核心问题:什么时候需要多 agent?三种模式各适合什么?A2A 是什么?成本与调试代价有多大?8
先说不需要的情况:多数任务一个 agent 加更好的工具就够,多 agent 是为了三件事——上下文隔离、并行、专业化。三种模式:orchestrator-workers(一个主 agent 分解任务、多个子 agent 并行、主 agent 综合——Anthropic 的多 agent 研究系统,代价是约 15 倍于单次对话的 token)、handoff(OpenAI Agents SDK 的模式:控制权在 agent 之间移交、每个 agent 有自己的工具与指令)、层级(GPT-5.6 的 ultra 模式与 Responses 的 multi-agent beta:一次请求内并发子 agent 并综合)。Claude Code 的 agent teams(互相直接通信、共享任务列表)与 subagent(只回主 agent)的取舍表。A2A(Agent2Agent,Google 2025 年 6 月捐给 Linux 基金会):跨厂商 agent 之间的任务协议——agent card、任务生命周期、与 MCP 的分工(MCP 是 agent 到工具,A2A 是 agent 到 agent)。成本、调试(多条轨迹的 trace)、失败传播、以及”先用一个 agent”的纪律。
8. memory 与 human-in-the-loop
核心问题:记忆怎么写、怎么忘?人从环内退到环上、环外各需要什么?审批的粒度怎么定?本体驱动的业务 agent 怎样把验证前移?9
记忆是一种特殊的检索(L3):会话内记忆就是上下文,跨会话记忆要存、要取、要忘。实现:Anthropic 的 memory tool(模型自己驱动的文件式记忆 /memories)、Claude Code 的自动记忆(上限 200 行 / 25 KB,压缩后重注入)、Codex 的 memories crate、DeepSeek Harness 的 goal / schedule(会话目标与定时跟进);写入策略(什么值得记)、遗忘(过期、冲突、用户要求删除)、记忆的权限(《检索与知识接入(04):索引、混合检索与 rerank》)。人机分工:地图里那张六级表(单步问答 → 短循环 → 长循环 → 策略化授权 → 后台异步 → 无人在环)展开——每升一级把哪类验证从人手里交给系统;审批粒度按风险分级(只读自动、写入确认、不可逆二次确认);request_user_input(Codex 的处理器、MCP 2026 的 elicitation)作为”agent 主动问人”的协议;后台 agent 的异步交付(提 PR、生成草稿)与 on-the-loop 的监控形态。本体驱动的业务 agent(Palantir AIP 一类)作为业务侧的 harness:动作有类型、校验、权限,提案先暂存再审批——把”业务动作没有测试可跑”这个问题用结构解决(《检索与知识接入(06):结构化知识——SQL、本体与 GraphRAG》讲了本体本身,这里讲它作为 harness)。”绕过障碍”要被识别为需要人介入的信号而不是自主性。
9. 可靠性、评测与运营 agent
核心问题:agent 的失败有哪几类?怎么设计幂等的工具与预算?轨迹怎么评?从 demo 到生产要过哪些关?10
失败分类学:幻觉的动作、死循环、预算耗尽、工具半成功、权限拒绝、上下文腐化、注入、中断未恢复——每类的检测与应对。幂等的工具设计(《模型作为组件(06):客户端工程——重试、超时、幂等、限流与流式解析》的延伸)、预算(步数、token、美元、时间)、循环检测(DeepSeek Harness 的 guard 是运行时内置的例子)、部分结果的交付。轨迹评测:结果指标(任务完成率)之外看过程——步数、成本、是否越权、是否走弯路;公开基准(SWE-bench Verified、Terminal-Bench 2.1 → 4.0 分数从 90 掉到 31 的饱和—加难循环、τ-bench 的多轮工具使用)与它们的局限(脚手架不同不可横比——《模型作为组件(05):选型——榜单的失真、自己的评测集与供应商的弃用周期》);自己的轨迹评测集从 trace 里采。trace 的结构(会话 → 任务 → 步骤三级、每步的完整输入输出、决策点日志——L5 展开)。每任务成本的分布(p50 / p95)。从 demo 到生产的清单:权限档与审批策略、沙箱、会话持久化、压缩与卸载、预算与卫士、幂等工具、trace、轨迹评测集、fallback、人在哪一级。
10. 系列总结与通关自测
一张总表回顾九篇各自回答的问题与必记的数字,逐篇的核心结论与常见误解,贯穿全系列的几条线,然后是三段自测——判断与计算、跨篇综合、面试题——加一份”读过 / 掌握 / 能教人”的判据。
贯穿全系列的实践线
本系列不设配套实验。每篇末尾有一节实践建议:
| 篇 | 实践建议的内容 |
|---|---|
| 1 | 手写一个带四个卫士的 40 行循环;读一遍 Codex tools/orchestrator.rs 或 DeepSeek Harness agent-loop 的 README |
| 2 |
|
| 3 |
|
| 4 | 给运行时接上 L2 的三条线;把探索性任务交给子 agent 并比较 token |
| 5 |
|
| 6 | 用对照表给自己的 harness 打分,找出空格 |
| 7 | 数一数你的任务里真正需要并行或隔离的比例,再决定多 agent |
| 8 | 定每类动作的风险级与审批粒度;给后台 agent 配监控面板 |
| 9 |
|
前置要求与说明
前置要求
- L1(工具调用协议、失效模式、成本)、L2(上下文预算与压缩)、L3(检索作为工具、本体);
- 后端基础:进程与沙箱、消息队列、状态机、事件溯源这些概念不需要解释。
版本与事实基线
以 2026 年 9 月中旬的公开材料与源码为准:
| 对象 | 版本 / 来源 |
|---|---|
| OpenAI Codex | openai/codex 主线(2026-09-16 的快照,codex-rs 工作区);引用 crate 与模块路径,不引用行号 |
| DeepSeek Harness |
|
| Claude Code / Agent SDK | 文档站 2026-09(权限、子 agent、agent teams v2.1.178+、hooks、settingSources) |
| OpenHarness | HKUDS/OpenHarness(2026-04 起,MIT) |
| MCP | 规范 2026-07-28(前一版 2025-11-25);Agentic AI Foundation |
| A2A | Linux 基金会项目(2025-06 起) |
| OpenAI Agents API | 2026-09-10 公测;Agents SDK |
| Anthropic | 《Building effective agents》(2024-12)、多 agent 研究系统(2025-06)、memory tool、programmatic tool calling、Agent SDK |
| 事件 | Replit(2025-07)、PocketOS(2026-04)、OpenAI–Hugging Face(2026-07) |
| 基准 | SWE-bench Verified、Terminal-Bench 2.1 / 3.0 / 4.0、τ-bench |
两个开源 harness 都在快速迭代(DeepSeek Harness 明确写着”会有破坏兼容的变更”),文中的模块与包名以上述快照为准,读者读到时可能已变;机制层面的结论比路径稳定。
章节目录
- 最小 agent 循环的解剖:从 40 行到生产级
- 工具调用与 MCP:协议、tool search 与程序化工具调用
- agent 运行时:会话、持久化与 durable execution
- 长任务的上下文管理与子 agent
- 权限、沙箱与安全边界
- 源码级对照:Codex、DeepSeek Harness、Claude Code 与 OpenHarness
- 多 agent:编排、handoff 与 A2A
- memory 与 human-in-the-loop
- 可靠性、评测与运营 agent
- 系列总结与通关自测
最终目标
读完本系列,面对一个要让模型”做事”的场景,读者应该能够:
| 追问 | 答案来自 |
|---|---|
| 这个任务需要循环吗,还是固定工作流就够?循环的卫士设在哪? | 第一篇 |
| 工具用 MCP 还是自定义?几十个工具时怎么办?中间结果怎么不进上下文? | 第二篇 |
| 任务中断后怎么续?会话存什么?托管还是自托管运行时? | 第三篇 |
| 跑到第 40 步上下文满了怎么办?什么该交给子 agent? | 第四篇 |
| 这个工具调用该自动执行、问人还是禁止?沙箱用什么?PocketOS 的五环我防住了几环? | 第五篇 |
| Codex、DeepSeek Harness、Claude Code 各怎么解这些问题,我该学谁? | 第六篇 |
| 需要多个 agent 吗?用哪种模式?代价多少? | 第七篇 |
| 记忆存什么、忘什么?人站在哪一级?业务动作没有测试怎么验证? | 第八篇 |
| 这个 agent 可靠吗?轨迹怎么评?上生产前还缺什么? | 第九篇 |
这就是 L4 要建立的能力:把 agent 当作一个有运行时、有权限、有沙箱、有会话、有预算、有人在合适位置的系统来设计,而不是一个会调工具的 prompt。
-
九篇各答一问。最小循环 40 行:组装上下文 → 调模型 → 有工具调用则执行并写回 → 否则结束,加步数 / token / 重复调用 / 超时四个卫士;成熟 harness 在其上加的是分层循环、工具编排器、事件溯源的会话日志、压缩与卸载、权限与沙箱、子 agent(第一篇)。MCP 2026-07-28 版:无状态核心、多轮往返请求、扩展框架(Tasks、Apps、Skills over MCP)、授权加固;tool search 与程序化工具调用出现是因为工具定义撑爆上下文、多工具串联浪费轮次(第二篇)。agent 运行时是新形态:一次调用分钟到小时、每步持久化、控制流由模型决定、可挂起等人,核心是 append-only 的会话日志与 durable execution(第三篇)。上下文管理的实现与子 agent 三形态(第四篇)。权限档、审批策略、执行策略、沙箱四层让 PocketOS 的五环逐环被防住(第五篇)。Codex / DeepSeek Harness / Claude Code / OpenHarness 十二维度对照(第六篇)。多 agent 只为上下文隔离、并行、专业化三件事,代价约 15 倍 token(第七篇)。人从环内到环上到环外靠按风险分级的审批与可验证性(第八篇);失败分类、幂等工具、预算、轨迹评测(第九篇)。 ↩
-
最小形态 40 行:组装上下文 → 调模型 → 有工具调用就执行并把结果写回 → 否则结束。失控的地方:无终止(模型一直调工具)、重复调用同一工具、单次工具卡死、token 与成本无上限——对应四个卫士:步数上限、token 预算、重复调用检测、单次工具超时。Codex 三层:
submission_loop(会话生命周期,接收Op)→ turn loop(一次用户输入:组装 prompt、调 Responses API、处理输出项)→ 工具编排器(tools/orchestrator.rs:审批 → 选沙箱 → 首次尝试 → 失败时的升级路径),客户端与会话之间是 app-server JSON-RPC 之上的操作 / 事件队列。DeepSeek Harness 的agent-loop:领取排队的 prompt → 在会话日志上开一个 turn → 经system-prompt组装前缀、从日志派生历史 → 流式调模型 → 经工具注册表分发 → 把每个模型可见的事实追加回日志再派生下一步;guard包组提供重复工具调用提醒与单次工具超时两个卫士。 ↩ -
改了四处:无状态核心——取消
initialize握手,版本与能力协商放进每个请求的_meta与MCP-Protocol-Version头,Streamable HTTP 去掉会话 id,为的是能在普通 HTTP 基础设施上横向扩展;多轮往返请求替代服务端发起的请求;扩展框架——反向 DNS 标识、独立版本:Tasks(长任务轮询与持久句柄)、MCP Apps(对话内渲染的 UI)、Skills over MCP、企业托管授权;授权加固——RFC 9207 的iss校验、RFC 8707 的resource参数绑定受众、动态客户端注册弃用改为客户端元数据文档(CIMD);Sampling / Roots / Logging 进入十二个月弃用窗口。工具描述怎么写:说清何时用 / 何时不用、参数的含义与格式、返回什么、副作用与幂等性、失败时的表现,用模型能核对的措辞而不是营销语;并用评测集测模型是否选对工具。tool search 解决工具定义撑爆上下文(几百个工具的 schema 占几万 token)——定义按需加载、模型先搜再用;程序化工具调用(Anthropic PTC、OpenAI Responses PTC、Cloudflare Code Mode)解决多工具串联浪费轮次与上下文——模型写一段程序一次调用多个工具、只把结果回到上下文,中间数据不进模型。 ↩ -
新在五点:一次调用分钟到小时、几十次模型调用与工具执行交替;每一步要持久化,崩溃 / 重启 / 等人之后从断点续跑;控制流由模型决定、运行时只给边界;可能挂起几小时等审批;并发单位是会话而不是请求——传统服务与模型 serving 都没有这些。事件溯源的会话日志解决「唯一事实来源」:append-only 的
SessionEvent日志,任何进入模型请求的东西都能从日志重建、每个新的模型可见输入对应一个事件(DeepSeek Harness 的不变量),resume / fork / search / replay 都在同一事件流上操作;Codex 的rollout与thread-store是同一思想的 Rust 实现。durable execution:把 agent 建成带 checkpoint 的状态图或工作流(LangGraph、Temporal 一类),每步持久化、崩溃后从 checkpoint 继续——是 agent 运行时最接近的老概念。托管运行时(Agents API)换掉了会话持久化、沙箱、扩缩容与部分权限模型的运维,代价是状态与轨迹在供应商侧、权限与沙箱策略受限、迁移成本高;自托管 harness 保留全部控制与数据,代价是自己做持久化、沙箱、恢复与安全边界。 ↩ -
实现:Codex 的
core/src/compact*.rs(本地压缩、远程压缩 v2、token 预算、图片预算、模型回退);DeepSeek Harness 的compaction包组(自动压缩、/compact命令、工具结果修剪器先修剪再压缩、图片卸载为占位符)与spill包组(把全文存到上下文之外、返回带取回指引的定位符——这就是「卸载」)。plan / todo / goal 是复述的实现:Codex 的plan工具与get_context_remaining,DeepSeek Harness 的plan(记录式规划)、todo(todo_write 工具)、goal(会话目标)三个包——把目标与进度反复写回上下文末尾,对抗长任务的目标漂移(Manus 的 todo.md 在这里是一等功能)。三种子 agent:subagent(自己的上下文窗口、结果只回主 agent、token 较低——Claude Code 的 subagent、Codex 的multi_agents、DeepSeek Harness 的subagent)用于隔离大段读取或独立子任务;agent teams(各自独立实例、互相直接通信、共享任务列表、token 较高、Claude Code 实验特性)用于需要协作与并行的多部分工作;外部 agent 作为后端(DeepSeek Harness 的七种后端含 Claude Code / Codex)用于把专长不同的 harness 当工具调用。 ↩ -
四层:权限档管能碰什么——Codex 的
:read_only/:workspace(只写工作区根目录、.git与.codex只读、网络可选受限)/:danger_full_access,DeepSeek Harness 的 read-only / workspace-write / danger-full-access,Claude Code 的 allow / deny / ask 作用域规则;审批策略管什么时候问人——Codex 的AskForApproval,Claude Code 的模式(bypassPermissions/acceptEdits/plan/dontAsk);执行策略管哪些命令自动放行 / 必问 / 禁止——Codex 的execpolicy(Starlark 前缀规则prefix_rule(pattern, decision=allow|prompt|forbidden, justification, match, not_match),match/not_match是加载时校验的单元测试)与 Guardian(一个模型审另一个模型的高风险调用);沙箱管越界后能造成什么后果——Codex 三平台原生沙箱(Seatbelt / Landlock+seccomp / Windows),DeepSeek Harness 的sandbox包组,Claude Code 的工作目录与命令限制 + 云沙箱。判定顺序以 Claude Code 为例六步:hooks 先跑(可直接拒绝)→ deny 规则(即使bypassPermissions也生效)→ ask 规则 → 当前模式 → allow 规则 →canUseTool回调;Codex 是审批策略 × 执行策略 × 沙箱升级路径;DeepSeek Harness 是审批策略插件 + 守卫执行管线。PocketOS 五环逐环被防:读取生产凭据被:workspace权限档挡住(环一)、rm -rf/ 删库命令被执行策略判 forbidden 或 prompt(环二)、即使放行也被沙箱限制在工作区(环三)、不可逆动作触发二次确认(环四)、没有审批记录与事件日志的动作不执行(环五)。 ↩ -
十二个维度的选法:语言与架构——Codex 是 Rust 工作区几十个 crate、
core为重心(性能与沙箱原生);DeepSeek Harness 是 TypeScript 单体仓库、几十个@deepseek-ai/dsh-*包、Cordis 插件树、profile / bundle / patch 三层配置(一切皆插件);Claude Code 是 TypeScript、产品闭源、Agent SDK 与文件系统约定开放;OpenHarness 是 Python 开源、轻量、oh一条命令。循环:三层 vs 日志驱动 vs SDK 封装;工具注册:tools/registry.rs+ 路由 + 并行 vs 作用域注册表 + 守卫执行管线 vs 内置 + MCP + hooks;上下文:compact*vscompaction+spillvs auto-compact 83.5%;权限与审批:execpolicyStarlark + Guardian vs 审批策略插件 vs 六步判定;沙箱:三平台原生 vssandbox包组 vs 工作目录与命令限制 + 云沙箱;会话:rollout/thread-storevs 事件溯源 JSONL + 检查点 vs 会话文件;子 agent:multi_agentsvs 七种后端 vs subagent / agent teams;扩展模型:plugins / hooks / skills / MCP vs 一切皆插件 vs hooks / skills / MCP;其余是模型接入、记忆、交付形态。为什么:各自的产品位置——Codex 要跨平台原生沙箱与性能、DeepSeek Harness 要可组合与可替换、Claude Code 要产品体验与生态、OpenHarness 要可读可改。三种交付形态:Agents API(托管,最省运维、最少控制)适合快速上线且数据可出域;Agents SDK(库,循环与工具在自己进程、持久化与沙箱自己接)适合要控制流程但不想从零写 harness;自托管 harness 适合要全部数据、权限与沙箱控制、或要把 agent 嵌进自己的运行时。 ↩ -
只在三件事上需要:上下文隔离(子任务读的东西不污染主上下文)、并行(独立子任务同时跑)、专业化(不同工具集与指令);多数任务一个 agent 加更好的工具就够,先用一个 agent 是纪律。三种模式:orchestrator-workers(主 agent 分解、子 agent 并行、主 agent 综合——Anthropic 的多 agent 研究系统)适合可分解、可并行的研究 / 搜索型任务;handoff(OpenAI Agents SDK:控制权在 agent 间移交、各有工具与指令)适合按阶段或领域切换的流程(分诊 → 专家);层级(GPT-5.6 的 ultra 模式、Responses 的 multi-agent beta:一次请求内并发子 agent 并综合)适合供应商托管、不想自己编排。Claude Code 的 agent teams(互相直接通信、共享任务列表)vs subagent(只回主 agent)按是否需要协作选。A2A(Agent2Agent,Google 2025 年 6 月捐给 Linux 基金会)是跨厂商 agent 之间的任务协议——agent card、任务生命周期;与 MCP 的分工:MCP 是 agent 到工具、A2A 是 agent 到 agent。代价:token 约为单次对话的 15 倍,调试要看多条轨迹的 trace,失败会在 agent 之间传播。 ↩
-
记忆是一种特殊的检索:会话内记忆就是上下文,跨会话记忆要存、要取、要忘。写:模型自己驱动的文件式记忆(Anthropic 的 memory tool
/memories)、运行时自动提取(Claude Code 的自动记忆,上限 200 行 / 25 KB,压缩后重注入)、Codex 的memoriescrate、DeepSeek Harness 的goal/schedule;写入策略是「什么值得记」——稳定的偏好、项目事实、纠正过的错误,不记一次性细节。忘:过期(时间 / 版本)、冲突(新事实覆盖旧的并记录来源)、用户要求删除;记忆也要有权限(谁能读)。人从环内 → 环上 → 环外(六级:单步问答 → 短循环 → 长循环 → 策略化授权 → 后台异步 → 无人在环),每升一级要把一类验证从人手里交给系统——测试、校验、沙箱、预算、审计;环上需要事件流可看与可中断,环外需要事后审计与回滚。审批粒度按风险分级:只读自动、写入确认、不可逆二次确认;agent 主动问人用request_user_input(Codex 的处理器、MCP 2026 的 elicitation)。本体驱动的业务 agent(Palantir AIP 一类)把验证前移:agent 只能对本体里有类型、有校验、有权限的动作下手,错误在动作定义处就被拒绝,而不是执行后再查。 ↩ -
失败分类:幻觉的动作、死循环、预算耗尽、工具半成功、权限拒绝、上下文腐化、注入、中断未恢复——每类有各自的检测(卫士、trace 事件)与应对。幂等工具:同一调用重复执行结果不变(带幂等键、先查后写、可撤销的动作),这样重试与中断恢复才安全;预算按步数、token、美元、时间四个维度设,循环检测(DeepSeek Harness 的 guard)与部分结果交付让耗尽时不是全丢。轨迹评测:结果(任务完成率)之外看过程——步数、成本、是否越权、是否走弯路;公开基准(SWE-bench Verified、Terminal-Bench 2.1 → 4.0 分数从 90 掉到 31 的饱和 - 加难循环、τ-bench 的多轮工具使用)只能参考,脚手架不同不可横比;自己的轨迹评测集从 trace 里采,trace 按会话 → 任务 → 步骤三级、每步完整输入输出与决策点日志。从 demo 到生产的清单:权限档与审批策略、沙箱、会话持久化、压缩与卸载、预算与卫士、幂等工具、trace、轨迹评测集、fallback、人在哪一级——加每任务成本的 p50 / p95。 ↩
地图 《AI 应用工程师学习地图》 第 4 / 7 个系列
- 模型作为组件
- Prompt 与上下文工程
- 检索与知识接入
- 工具、Agent 与 harness
- 评测、可观测与可追溯即将发布
- 生产化与运营即将发布
- 产品与体验即将发布
上一个系列:检索与知识接入下一个系列:评测、可观测与可追溯即将发布
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/tools-agents-and-harness.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。