Agent = LLM + Harness:拆开这个新品类,你就看懂了所有 Agent 的骨架

你同事用 DeepSeek Harness,一条命令让 AI 自己改了 20 个文件的 bug。你问他这工具到底怎么做到的,他憋了半天,只说了一句:“就是个 harness 呗。”
这个月,你几乎每天都能在首页刷到"harness"这个词——DeepSeek Harness 开源 6 天 16 万 star、OpenAI 把 Codex 的 harness 也开源了、browser-use 号称"最薄的桌面 harness"。但 99% 的讨论,都在说"谁家 star 多、谁家 UI 好看",没人能说清:harness 到底是个什么东西?
今天不评任何具体框架。我们把"Agent Harness"当一个品类拆开——它由哪几个模块组成、每个模块解决什么问题、主流实现各自怎么选型。看完这张骨架,以后任何 Agent 框架到你手里,第一眼就知道该看哪几个地方。
一句话:LLM 是大脑,harness 是神经系统和手脚
社区有句很准的公式:Agent = LLM + harness。
LLM 只负责"想"——它输出文本,最多输出一个"我要调用工具"的请求。它碰不到你的文件、开不了你的终端、发不了网络请求。中间必须有一层东西,替它理解环境、执行动作、把结果喂回去。 这一层,就是 harness。
形象点说:LLM 是大脑,harness 是神经系统和手脚。大脑决定"我要删这个文件",但真正执行 rm、并且拦在 rm 前面问你"确定吗"的,是 harness。
2026 年 4 月,一篇题为《Architectural Design Decisions in AI Agent Harnesses》的论文(arXiv:2604.18071)统计了 70 个开源 Agent 系统,结论很直接:约 60% 的系统核心都是一个"Agent Loop"(执行循环),真正的差异,全都长在循环外面那几层基础设施上。
也就是说:骨架几乎一样,拼的是周围那几层谁做得好。 下面我们把这几层逐个拆开。
五个模块,是每个 harness 的通用骨架
研究那 70 个系统,你会发现无论开源闭源、无论做代码还是做浏览器,harness 的骨架高度一致,都是这五块:
1. 模型适配层:把各家 LLM 的差异抹平
模型适配层解决的是最实际的问题:不同家的 LLM,API 长得完全不一样——OpenAI 的 tool call 字段、Anthropic 的 tool_use 块、DeepSeek 的格式,各说各话。
harness 要在模型和上层之间插一层适配器,把这些差异翻译成统一格式。谁家模型适配做得深,谁就真的"模型无关";只把切换当个配置项的,换模型立刻掉链子。 这往往是区分"真通用"和"假通用"的第一道分水岭。
2. 工具注册与调用:给模型发一张"说明书"
模型怎么知道有哪些工具能用?harness 通过 **schema(说明书)**告诉它——每个工具的名字、描述、参数类型,注入到模型上下文里。
这块有个反直觉的教训。Vercel 做过一个著名实验:把 Text-to-SQL Agent 的 15-18 个专用工具砍到只剩 2 个(bash + SQL 执行),成功率从 80% 直接跳到 100%,速度快了 3.5 倍,token 消耗少了 37%。
为什么工具越少反而越好?因为工具越多,模型在每个决策点上的选择分支越多,它在"选哪个工具"上烧掉的算力,挤占了"怎么解决问题"的算力。给模型发一张堆满工具的说明书,未必是帮忙。
工具不是越多越好。让模型把注意力花在"解决问题"而不是"翻说明书"上,成功率反而更高。
3. 执行循环(agent loop):整个骨架的心脏
这是 harness 最核心的部分,也叫 ReAct 循环(出自 2022 年 Yao 等人的论文 arXiv:2210.03629)——想(Thought)→ 动(Action)→ 看(Observation)→ 重复,直到任务完成或达到上限。

循环本身简单得像个 while 语句,真正的复杂性全在"管理这个循环"上:最大步数设多少、什么时候该停、token 预算烧完了怎么办、模型陷入死循环怎么拉出来。Anthropic 把他们自己的运行时形容为"一个笨循环"——所有智能都住在模型里,harness 只管轮次。
4. 会话/轨迹日志:可回放、可调试、可复现
Agent 一旦跑起来,每一步"想了什么、调了哪个工具、拿到了什么结果"都必须被记录下来。这份轨迹日志是 Agent 工程的命脉——出了错靠它回放定位,改了代码靠它对比前后行为,做评测靠它量化好坏。
做得极致的(比如 DeepSeek Harness)会做成 append-only(只追加)的会话日志,并且断言模型看到的所有输入都被记录——这意味着整个执行轨迹可以完整回放,这在"让 Agent 自己改自己"的实验里是前提条件。
5. 安全与权限边界:决定 Agent 能碰什么
最后也是最容易被跳过的一层:权限边界。决定 Agent 能读哪些文件、能不能删、能不能联网、需不需要人工审批。
那篇 70 个系统的论文里有个扎心的发现:基础隔离很常见,但高保证度的审计机制很稀有——这恰恰是大多数 harness 最薄弱的地方。DeepSeek Harness 社区插件误删 400G 数据的事件,根因不在模型,而在权限边界的默认值设得太松:插件是第三方代码,跑在用户机器上、用用户的权限,而工具审批并不会沙箱化插件代码。
安全边界从不体现在 benchmark 分数里,所以团队总想跳过它。但一个管不住自己动作的 Agent,轻则重做,重则删库。
四个主流实现,各自怎么选型
骨架一样,但每个模块选型的天平不同,就做出了四种完全不同的产品。我们逐个看:
DeepSeek Harness:一切皆插件,把骨架本身做成可替换的
DeepSeek Harness 的架构宣言就一句:Everything is a Plugin。它跑在自研的 Cordis 内核上,模型适配器、工具注册表、会话日志、沙箱、甚至 agent loop 本身,全部是插件,没有不可替换的核心。官方原生适配约 40 家模型厂商,多模型切换是从架构层面的一等公民。
它把前一个产品级框架的"黑盒"全部打开:你想改模型接入、改沙箱策略、改 agent 行为,都在配置文件层面完成,不用 fork 源码。代价是安全边界靠社区自觉——正因为什么都能装,所以 400G 事故才可能发生。DSH 的设计哲学,更像是给"让 Agent 自己改自己"的研究者准备的土壤,而不是给普通用户的开箱工具。
拆开看这套设计,细节比"都是插件"四个字多得多。三个核心子系统挂在 Cordis 上:session 子系统维护一条 append-only 的会话事件日志,它是模型历史的唯一来源——模型每次请求要看的上下文,都是从这条日志实时投影出来的;system-prompt 子系统负责把各插件注册的 prompt 段落和工具 schema 装配成一次请求;llm 适配层是一个缝(seam),约 40 家厂商的适配器都插在这里。工具执行不是一次直呼,而是一段三段管道:pre-execute(守卫和权限审批)→ execute(沙箱执行)→ post-execute(结果回灌模型)。还有一个贯穿始终的不变式:Model-visible means logged——任何模型能看到的东西,必须能从日志里重建出来,这是 DSH 敢做"让 Agent 自己改自己"实验的底气。

browser-use:最薄的桌面 harness,只做浏览器一件事
browser-use 是另一个极端——边界最小、最安全。它不管代码、不管终端,只管浏览器自动化这一件事(GitHub 约 85k star)。它把 DOM 智能提取压缩(100KB 压缩到 40KB),用 17 个 watchdog 组件防死循环、防超时、控资源。
它的取舍是:牺牲通用性,换来极致的可靠与安全。 因为只碰浏览器一个动作空间,权限边界天然清晰,几乎不可能"误删 400G 数据"——它根本没权限删你的文件。这是"最薄 harness"的价值:不做的事情越多,越安全。

Claude Code:闭源但主流,工程化最成熟
Claude Code 是目前生态最厚的主流 coding agent,但它是闭源的(源码还因为 npm 包的 .map 文件泄露过一次,约 1900 个文件、51 万行,反而成了行业研究工业级 harness 的绝佳样本)。
它的工程化是四个里最成熟的:权限系统有七种模式加一个 ML 分类器做自动判断,默认拒绝并升级给人;上下文管理有五层压缩管道;每次工具调用要过七道安全闸。它的取舍是:把安全做进产品核心,而不是事后补丁——代价是绑定 Anthropic 生态,内部对开发者是个黑盒。
泄露源码还揭示了几个没公开的设计:它跑的是 coordinator + swarms 的多 agent 编排——主 agent 分配任务,多个子 agent(swarms)并行执行,危险操作通过 mailbox 队列向主 agent 请示、原子认领防抢活;工具系统约 40 个内置工具 + 50 个斜杠命令,bash 安全检查有 23 层;上下文是三层结构(常载的 MEMORY.md 索引 + 按需拉取的 topic 文件 + grep 定位的原始 transcript),还专门追踪 14 个会破坏 prompt 缓存的注入点;另有 44 个未发布的 feature flags(含 KAIROS 常驻自主模式)。

OpenAI Responses API:把整个 harness 收进 API
OpenAI 的选择最激进——直接把 harness 从你的代码里拿走,变成托管 API。Responses API 内置了执行循环、shell 工具、托管的容器工作区、上下文压缩,连沙箱环境都帮你搭好了。
它的取舍是:把"调 orchestration 层"这份所有 Agent 开发者都要重复的活,变成了平台服务。 你不再需要自己维护 agent loop,但也就意味着——执行环境、工具边界、数据,全都托管在 OpenAI 手里。这是从"模型提供商"到"Agent 基础设施提供商"的转身,代价是自由度换给了平台。
一张对照表,看懂任何 harness 的共性 + 分叉点
把四个实现放在一张表里,选型的分叉点一目了然:
| 分叉点 | DeepSeek Harness | browser-use | Claude Code | OpenAI Responses |
|---|---|---|---|---|
| 模型适配 | 插件化,约 40 家 | 走 LangChain | 绑定 Anthropic | 自家模型为主 |
| 工具边界 | 一切皆插件(最开放) | 只浏览器(最窄) | 内置 + MCP 扩展 | 内置 + 托管容器 |
| 执行循环 | 可替换的插件 | 5 步循环 + 17 watchdog | 笨循环 + 5 层压缩 | 内置在 API 里 |
| 轨迹日志 | append-only 可回放 | 事件驱动 | 内置 | 托管 |
| 安全边界 | 靠社区自觉(松) | 天然最小(最安全) | 7 模式 + 沙箱(严) | 托管容器 |
共性是骨架:五个模块谁都在,一个都少不了。分叉点是三个天平:
- 插件化 vs 内置——DeepSeek 把一切开放成插件,Claude Code 把核心做死、外面挂扩展。
- 本地执行 vs 托管 API——browser-use、DeepSeek、Claude Code 都跑在你机器上,OpenAI 收进云端。
- 权限默认值——从"默认拒绝并升级给人"(Claude Code)到"默认放行靠社区自觉"(DeepSeek 插件)。
明天就能用的那件事:用这张骨架,五分钟看懂任何 Agent
下次再看到一个"xx Agent"项目,别再看它 star 数和 README 吹的牛。打开它的代码或文档,按这张骨架问五个问题:
- 它接哪些模型?模型适配层是深做还是只当配置项?
- 它暴露了哪些工具?工具声明是 schema 还是硬编码?
- 它有没有 agent loop?最大步数、终止条件怎么定的?
- 它记录轨迹日志吗?能不能回放、能不能调试?
- 它的权限默认值是什么?是默认拒绝还是默认放行?
五个问题问完,你就能在十分钟内判断这个 Agent 是"认真做的手脚"还是"套了个循环的玩具"——这正是看懂 Agent 这个新品类,最重要的一步。