本文永久链接 – https://tonybai.com/2026/10/24/what-is-a-harness

大家好,我是Tony Bai。

随着以 Claude Code、Cursor 为代表的各类 AI 编程助手与 Agent(智能体)工具的爆发式普及,一个名为“Harness” 的概念在海外技术圈引发了广泛的讨论与争议。很多人好奇:大模型本身、我们使用的客户端界面,以及背后真正驱动工具执行的 Harness,到底各自承担了什么角色?

知名开发者、T3 创始人 Theo(@theo)撰写了这篇通俗易懂的长文,用极其生动的大厨、厨房与餐馆的比喻,层层剖析了 Interface、Harness、MCP 与 Agent 之间的边界与关系。无论你是正在开发 AI 应用的工程师,还是想理清现代 AI Agent 底层运作逻辑的技术爱好者,相信本文都会为你带来清晰透彻的启发。

以下为译文全文:


什么是“Harness”?

说老实话:我之所以写这篇文章,是因为我实在厌倦了一遍又一遍地去解释它,而且目前似乎没有哪个单一“资源”能够把 Harness 到底是什么解释得明明白白。

读完这篇文章后,你应该就能掌握关于什么是 Harness 以及它们是如何工作的一切必要知识。

人类使用界面(Interface)

通常来说,人类并不是通过直接编写代码来使用计算机的。他们使用的是某种形式的界面,无论是一个终端(terminal)、一个网站,还是一个 App。

理论上讲,人类完全可以针对想要完成的每一项任务去写专属的 Python 或 JS 代码。但我们并没有让他们这么做,而是通过按钮、快捷键、命令行等方式,赋予他们访问这些底层代码的能力。

界面的例子包括:Chrome、Claude Code、ChatGPT App(之前叫 Codex)。

同样值得注意的是,人类通常是看不到底层的代码的……在绝大多数情况下,人类只能看到界面。

大语言模型(LLM)使用 Harness

在默认情况下,LLM 唯一能做的事情就是生成文本。为了让语言模型能做更多的事情,它需要工具。现在大多数 LLM 都经过了专门训练,懂得如何配合工具工作,例如用于访问你电脑上文件的“read_file”、用于修改这些文件的“edit_file”、用于运行命令的“bash”,以及用于在线检索数据的“search”。

然而,LLM 依然仅仅是在发送文本而已!它无法像人类那样去点击某个按钮。正因如此,我们需要一种供 LLM 使用的自定义文本格式,以此向外部示意“你应该去运行某些代码了”。假设我们给 LLM 提供了一种调用工具的格式,比如:

<read_file name="README.md">

现在,LLM 知道自己可以用这种格式来做出响应了。但它依然只是文本,它本身什么也做不了!这就好比电脑还没开机,你就在那敲键盘、移动鼠标一样毫无作用。

必须有某种东西来解释这些响应,然后根据 LLM 回复的内容去运行相应的正确代码。

为了让 LLM 真正能够“把事情办成”,它需要:

  • 能够执行具体操作的工具(如 read_file、edit_file、bash、search 等)
  • 一套用于通过文本调用这些工具的专用语法
  • 一个负责解析消息、识别该语法并执行对应代码的系统
  • 一种将工具返回的结果重新提供给 LLM 的方法
  • 一份附带使用说明的可用工具清单

这就是 Harness。

“Claude Code 难道不是一个 Harness 吗?”

算是一半吧。

Claude Code 包含两部分:界面(interface)和 Harness。

当你在终端中运行 claude 时,打开的是 Claude TUI(终端用户界面)。当你进入 Claude 桌面客户端的“code”标签页时,打开的是 Claude Code GUI(图形用户界面)。这两个都不是 Harness。

在底层,Claude Code 使用 Anthropic Agent SDK 来与 Agent 进行交互。ChatGPT 也是如此,通过 ChatGPT/Codex App 与 Codex App Server(内置于 CLI 中)进行交互。

我理解大家为什么会感到困惑:因为 Claude Code 和 Codex 都把 Harness 直接打包(内置)进了它们自己的 App 里。

但你完全可以把同样的 Harness 内置到其他 App 中!比如以下几个例子:

  • Cursor 的 Harness 被 Grok Bot 所采用
  • Anthropic Agents SDK 和 Codex App Server 被 T3 Code 所采用
  • Pi 被 OpenClaw 所采用

Harness 是一个独立的组成部分,几乎从未直接暴露给使用这些 App 的人类用户。

工具归谁所有?

我们可以把 Harness 想象成一个厨房。

厨房里有许多各不相同的工具:锅、平底锅、刀具、刮刀、搅拌机等等。

但没有哪个厨房能够囊括每位大厨所需要的一切工具。

优秀的 Harness 在构建时就充分考虑到了这一点,允许用户自带工具。

必须说明的是:绝大多数重要的工具都是由 Harness 直接提供的。 Codex 和 Claude Code 都内置包含了大量的工具,而像 Pi 这样的其他 Harness 则要极简得多。

事情从这里开始变得复杂起来了,让我再画一张图。

图中的橙色方框代表“Claude Code 所包含的内容”(准确地说是 Agents SDK)。

你可以添加许多自定义工具,例如用于为你的 LLM 提供代码检查能力的 TypeScript 插件,或者允许 Agent 控制你电脑的 CUA 插件。

请注意“工具层(tool plane)”与“人类/LLM 层”之间的那条分割线。无论人类还是 LLM,都无法直接看到或接触到这些工具。我们根本没有办法知道它们是否存在。正是 Harness 将它们暴露出来,既暴露给 LLM,也暴露给界面(这正是我们能看到它们的方式)。

MCP 让事情变得更复杂了一点

MCP(Model Context Protocol,模型上下文协议)是一套标准,旨在让 Harness 能够更容易地访问外部资源。简单来说:工具是“在此处运行代码来做某事”,而 MCP 则是“向别处发起 API 请求来做某事”。

工具直接提供可执行的代码。MCP 则让代码驻留在其他地方,但 LLM 依然可以通过 MCP 发起请求来办事。

MCP 最常见的应用场景是向你的 LLM 暴露数据。想让 ChatGPT 查看你的电子邮件?用 MCP。想让 Claude 分析你网站的数据指标?用 MCP。

Chrome 扩展程序有点类似于工具。它们可以通过在你的电脑(Chrome 内)运行代码来改变网站的运作方式。

而 MCP 则更像是网站。你无需安装任何东西,只需要知道 URL 即可。一旦你拿到了 URL,你就(应该)能获取到使用它所需的一切信息 :)

把所有这些整合在一起,结构大致如下:

……等等,T3 Code 在那里是干什么的?让我解释一下。

T3 Code 向 LLM 暴露了自定义功能,去完成 Harness 做不到的事情。例如,我们允许使用 Claude Code 的线程在 Codex 中派生出子 Agent(subagents)。其他工具也在做类似的事,比如 Herdr、Orca 和 Cursor。

那么,为什么要把这个作为 MCP 暴露出来呢?这难道只是为了逃避自己去造一个 Harness 而搞的廉价小把戏吗?

回想一下前面提到的这句话:

工具直接提供代码。MCP 让代码驻留在其他地方,但 LLM 依然可以使用 MCP 发起请求来做事。

T3 Code 包含大量代码,用以实现诸如多 Harness 子 Agent 之类非常酷的功能。技术上讲,我们本可以把 T3 Code 最酷的功能重构为一组插件,分别适配 Claude Code、Codex、Antigravity、Pi、Cursor、Muse……

但我们也可以选择将所有代码都保留在 T3 Code 自身内部,转而为 LLM 暴露一个简单的 MCP 服务供其使用 :)

回到厨房的比喻,MCP 就像是菜谱。它们是一种做事的方法,但它们本身并不是工具实体。

T3 Code 正在为厨房提供一本烹饪手册。它根本不需要改变厨房的运转方式。如果大厨们决定翻看我们的菜谱,那太棒了!他们也完全可以对其视而不见,什么都不改变。

……那么,到底什么是 Agent?

你知道我有多自豪吗?我居然写了这么长一段内容,一次都没有在未下定义的情况下反复滥用“Agent”这个词!这可一点都不容易,哈哈。

太长不看版(tl;dr):Agent 就是将 Harness 与 LLM 结合在一起的产物。

LLM 只负责生成文本,它们自己什么都干不了。Harness 只是厨房,它们自己也没法烹饪任何东西。只有当 LLM 与 Harness 结合在一起时,才诞生了“Agent”。

不同的“Agent”往往只是不同的 Harness 配置而已,比如包含了自定义工具、提示词指令、MCP 服务等。

T3 Code 是一个 Harness 吗?

不是。如果你不自备 Harness,T3 Code 就无法工作。

再次回到厨房的比喻:

  • 大厨 = LLM
  • 厨房 = Harness
  • T3 Code = 餐馆

T3 Code 是一家允许你自带任何厨房进驻的餐馆。我们拥有自己喜欢的一套独家菜谱,并且我们会把这本烹饪手册提供给每个厨房,但除非你明确告知,否则大厨是不会主动去翻开它的 :)

想进一步深入了解的人……

如果你喜欢这种自顶向下的深度原理解析,可以去看看 T3 Code。它是完全开源的,所以你可以直接让你的 Agent 为你解释它是如何运作的,从而更深入地去理解它。


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。