什么是 agent harness?
agent harness(智能体运行框架)是包在语言模型外面的那一层,它把一次次单独的模型调用变成一个 agent:负责运行循环、执行模型要求调用的工具、管理上下文窗口,并决定模型被允许做什么。
边界在哪里
这个词最容易用排除法来界定。一个正在运行的编程 agent 有四层,其中只有两层属于 harness。下面是一个不是你训练的模型,和一个不归你控制的 HTTP API;上面是负责把输出画到屏幕上的东西。harness 就是中间的全部,换句话说:所有需要做决定的地方。
| 层 | 归属 | 它决定什么 |
|---|---|---|
| 模型权重与推理 | 模型厂商 | Anthropic、OpenAI、Google,或者你自己机器上的运行时。 |
| 传输格式 | 模型厂商 | 每家厂商各自定义的消息、工具和流式输出的 HTTP 格式。 |
| agent 循环 | harness | 调用模型、读取响应、执行它要求的操作、再次调用,完成后停止。 |
| 工具执行 | harness | 校验参数、运行工具,并决定哪些操作可以并行。 |
| 外部工具(MCP) | harness | 发现服务器、给它们的工具加命名空间、用 JSON-RPC 与它们通信。 |
| 上下文 | harness | 哪些内容留在窗口里、哪些被压缩、哪些从之前的内容中召回。 |
| 权限 | harness | agent 不问你就能做什么,以及哪些事必须先问你。 |
| 渲染 | 前端 | 终端、浏览器、桌面窗口,或者根本没有界面。 |
从上往下读这张表,这个词为什么存在就一目了然了:最上面两行每隔几个月就会变,最下面一行是个人口味问题,而中间五行才是 agent 里所有难题真正所在的地方。给这个中间层起个名字,就是这个词的作用。
为什么模型无关才是难点
几乎每个 harness 都是先针对一家厂商写,再去适配其他厂商。问题就出在这个顺序上:第一家厂商的假设会留在对话存储里、工具 schema 里、流式响应的解析方式里——这些地方以后没人会想到去看。于是切换就意味着迁移,而在会话中途做迁移,就意味着你干脆不会切换。
另一种做法是用一种不属于任何厂商的格式存储历史,在请求发出的那一刻再渲染成目标厂商的传输格式。换模型时什么都不用转换,因为从来就没有什么东西是按旧模型的格式存的。这正是 OHarness 围绕构建的那个核心设计决定,架构页面介绍了这种分层是如何被强制执行的,而不仅仅是停留在设计意图上。
harness、框架、SDK
- SDK 把请求发给模型,再把响应拿回来。一次调用、一家厂商,不记得上一次发生了什么。
- 框架 给你一堆零件,让你拼出一个 agent。循环、重试、压缩策略仍然由你决定——之后也归你维护。
- harness 是已经拼好的成品。循环、工具执行、上下文管理和权限都已经定好了;你只需提供工具、模型和策略。
实际的检验方法是看你想换一个模型的那一天会发生什么。用 SDK,你要重写调用代码。用框架,你会发现自己写的零件里有多少默认了旧厂商。用一个为此而设计的 harness,你只需改一项设置。
常见问题
agent harness 和 agent 框架是一回事吗?
两者有重叠,有用的区分在于你最后手里拿着的是什么。框架让你用它提供的零件搭一个 agent——循环、图、重试都由你来写。harness 就是那个已经写好的循环:你给它工具、模型和一组权限,它就能跑起来。大多数框架都可以用来搭一个 harness;harness 就是你原本要自己搭的那个东西。
厂商已经提供了 SDK,我还需要 harness 吗?
厂商 SDK 帮你完成一次模型调用,然后就到此为止。它不管什么时候该再调用一次、拿到工具结果该怎么处理、上下文窗口满了该丢掉什么,也不管一条 shell 命令能不能不问你就执行。这些决定就是 harness 要做的。如果你不用现成的,你最终会自己写一个——通常是无意中写的,散落在整个代码库里,而且只针对一家厂商。
一个 harness 能对接多家模型厂商吗?
能,但前提是它从一开始就是这么设计的。难点不在 HTTP:而在于对话历史、工具定义和流式输出都带着各家厂商自己的格式,一个按某家厂商格式存储历史的 harness,想切换就得先做迁移。用中立格式存储历史,在发出请求的那一刻再渲染成目标厂商的传输格式,切换才不需要任何代价。
有开源的 agent harness 吗?
有几个公开了源码,比如 OpenCode、Cline 和 Gemini CLI。OHarness 可以免费使用,它的 npm 包以 MIT 许可证发布,但源码仓库目前还是私有的。它原生支持 Anthropic、OpenAI 和 Google Gemini,支持任意 OpenAI 兼容端点,以及 Ollama、LM Studio 和 vLLM 等本地运行时——并且可以在终端、浏览器、桌面应用和无头模式下运行,底层都是同一个引擎。
试试它的实现
OHarness 是一层模型无关的 agent harness,免费使用:只有两个运行时依赖,所有厂商都通过普通的 fetch 和 SSE 访问,并自带 MCP 客户端。文档就写在它所描述的代码旁边,下载页面提供桌面版安装包和命令行。