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 模式 + 沙箱(严) 托管容器

共性是骨架:五个模块谁都在,一个都少不了。分叉点是三个天平

  1. 插件化 vs 内置——DeepSeek 把一切开放成插件,Claude Code 把核心做死、外面挂扩展。
  2. 本地执行 vs 托管 API——browser-use、DeepSeek、Claude Code 都跑在你机器上,OpenAI 收进云端。
  3. 权限默认值——从"默认拒绝并升级给人"(Claude Code)到"默认放行靠社区自觉"(DeepSeek 插件)。

明天就能用的那件事:用这张骨架,五分钟看懂任何 Agent

下次再看到一个"xx Agent"项目,别再看它 star 数和 README 吹的牛。打开它的代码或文档,按这张骨架问五个问题

  1. 它接哪些模型?模型适配层是深做还是只当配置项?
  2. 它暴露了哪些工具?工具声明是 schema 还是硬编码?
  3. 它有没有 agent loop?最大步数、终止条件怎么定的?
  4. 它记录轨迹日志吗?能不能回放、能不能调试?
  5. 它的权限默认值是什么?是默认拒绝还是默认放行?

五个问题问完,你就能在十分钟内判断这个 Agent 是"认真做的手脚"还是"套了个循环的玩具"——这正是看懂 Agent 这个新品类,最重要的一步。

0%