Agent Harness 统一接口来了,但先别急着把后端拆了
UHP 想给 Codex、Claude Code、Gemini CLI 这些 harness 做一层统一任务接口,HarnessRouter 是开源实现。它解决的是集成重复,不是让所有 harness 行为一致。
做 agent 产品的人迟早会撞上一个很具体的问题:换一个 harness,后端就要再写一遍。
先把概念说清楚。模型 API 只负责输入输出,真正跑完一个任务的是 harness。它包在模型外面,负责调工具、管文件、跑命令、处理权限和重试,还要判断任务什么时候结束。Codex、Claude Code、Gemini CLI、Hermes 都算这一类。它们可能用相似的模型,行为却不一样。
Akshay 把这个阶段叫 Harness Engineering 2.0。前面已经有工具协议、agent 通信协议、agent 接口协议,现在轮到了 harness。开发者发布了 UHP,也就是 Unified Harness Protocol,想给 harness 定一层统一任务接口。HarnessRouter 是它的开源服务器实现。
下面这段视频把差别画得很直白:左边是直接集成,产品后端分别粘 Codex、Claude、Gemini,沙盒、流式传输、输出格式都要各自处理。右边是 HarnessRouter,一个中心层管住沙盒、文件、恢复、会话和跟踪,Codex、Claude Code、Gemini CLI 这些客户端接到同一个后端。
UHP 的工作方式不复杂。产品后端发一个 task,里面带 harness_id。HarnessRouter 读到这个 ID,在独立 session 里启动选中的 harness。harness 继续跑自己的原生 agent loop,把进度流回来。文件、artifacts、失败信息和最终输出都从同一个接口回来。
没有 UHP 时,每接一个 harness,任务执行、session、流式事件、文件上传下载、取消路径、错误分类、输出格式都要单独处理。接 Claude Code 和接 Codex,看起来是换了个 CLI,实际是又维护一套执行栈。
UHP 把这层 HTTP 契约定下来。它借了 OpenAI Responses API 的形状,用 POST /v1/responses 创建任务。一个 response 记录一次任务,session 把共享对话状态和工作目录的 response 串起来。configured harness 由基础 harness 加上模型、指令、skills、工具、MCP servers 和限制组成。实时任务走 SSE,每个事件带类型和序号,客户端按顺序处理文本输出、工具活动、文件和任务状态。大文件走上传,生成文件变成 artifacts。后续任务用 previous_response_id 续同一个 session。
这里有个容易误解的点。UHP 标准化的是任务生命周期,不是让不同 harness 行为一致。Akshay 在文章里写得很清楚,不同 runtime 仍可能选不同计划、工具、文件和模型。跨 harness 也不能直接续原 session。Codex 起的任务想让 Claude Code 接,得开新 session,把工作摘要、下一步指令和相关文件传过去。像把任务交给另一个开发者,工作能继续,但对方没有接着你的脑内上下文跑。
现实收益在集成侧。Codex、Claude Code、Gemini CLI、Hermes、Pi 这些 harness 可以插到同一个产品后端,同时保留自己的工具、skills、模型和 agent loop。开发者换 harness 不用重做产品集成,同一个任务可以跨 harness 跑,新增 harness 也不用再堆一套执行栈。HarnessRouter 目前支持 30 个 harness bases,Console 里能看到 11 个内置 harness,包括 Codex、Claude Code 和 Hermes。
成本数据也值得看。按官方 benchmark,只换 harness、固定模型,在几项医疗合规任务上成本降了 25% 到 64%。同时换 harness 和模型,最高和最低成本配置之间差了 99.8%。这类数字不能直接套到所有 workload,但足够说明 harness 选择本身会影响成本。官方还给了 Harness Arena,开发者可以拿自己的任务跑不同配置。
本地部署方面,HarnessRouter 是 self-hosted,Docker 镜像里三个服务:Console 是浏览器 UI,Gateway 处理 UHP API 和 harness 配置,Runner 在 session workspace 里启动 harness 进程。数据、安装的 harness CLI、provider 集成、session 文件和 workspace 放在 /data volume。只发布 Console 端口,Gateway 和 Runner 在容器内监听 loopback。Community Edition 需要 Docker、约 4GB 磁盘和支持的模型 provider API key。默认用户名和密码都是 harnessrouter。
安全边界要讲清楚。session 用独立操作系统用户和 workspace 隔离,但不在独立容器里跑。provider 凭证不要放在 agent 工具能读到的环境里。应用 API key 不要进浏览器代码。部署到 loopback 之外,需要 TLS 和 UHP 安全规范里的控制项。UHP 当前版本是 2026-09-12,项目公开了文字规范、OpenAPI 3.1 schema、JSON Schema 和可运行的 conformance checks。
阿里云 Qoder 已经采用 UHP,通过 HarnessRouter API 作为 agent backend。这个信号比仓库 star 数更有意思,说明统一 harness 接口开始进入真实产品链路。
有网友在回复里担心,一个接口统一所有 harness 听着很美,第一次遇到 auth 和 session 对不上时,麻烦才刚开始。这个担心不多余。UHP 能减少重复集成,不能让所有 runtime 突然说同一种方言。HarnessRouter 的价值在于把任务提交、进度、文件、取消和结果查看收进一个契约,团队可以先在本地把多 harness 流程跑通,再决定产品里给用户开放哪些选择。
仓库是 Apache 2.0:http://github.com/HarnessRouter/harnessrouter
Akshay 的原文:https://x.com/i/article/2100874380012056576
发布时间: 2026-11-04 01:36