什么是 agent harness?

agent harness(智能体运行框架)是包在语言模型外面的那一层,它把一次次单独的模型调用变成一个 agent:负责运行循环、执行模型要求调用的工具、管理上下文窗口,并决定模型被允许做什么。

边界在哪里

这个词最容易用排除法来界定。一个正在运行的编程 agent 有四层,其中只有两层属于 harness。下面是一个不是你训练的模型,和一个不归你控制的 HTTP API;上面是负责把输出画到屏幕上的东西。harness 就是中间的全部,换句话说:所有需要做决定的地方。

层归属它决定什么
模型权重与推理模型厂商Anthropic、OpenAI、Google,或者你自己机器上的运行时。
传输格式模型厂商每家厂商各自定义的消息、工具和流式输出的 HTTP 格式。
agent 循环harness调用模型、读取响应、执行它要求的操作、再次调用,完成后停止。
工具执行harness校验参数、运行工具,并决定哪些操作可以并行。
外部工具(MCP)harness发现服务器、给它们的工具加命名空间、用 JSON-RPC 与它们通信。
上下文harness哪些内容留在窗口里、哪些被压缩、哪些从之前的内容中召回。
权限harnessagent 不问你就能做什么,以及哪些事必须先问你。
渲染前端终端、浏览器、桌面窗口,或者根本没有界面。

从上往下读这张表,这个词为什么存在就一目了然了:最上面两行每隔几个月就会变,最下面一行是个人口味问题,而中间五行才是 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 客户端。文档就写在它所描述的代码旁边,下载页面提供桌面版安装包和命令行。