Browser Harness:自愈合 CDP 线束,重写 AI 代理与浏览器交互的规则
LLM 与浏览器交互工具的格局正在快速演变。过去一年里,我们从把 Playwright 脚本包在 agent.run() 里,走到了原生 CDP 协议的命令行工具。但 Browser Harness——Browser Use 团队最新开源的 CDP 线束——不是又一个工具堆叠。它代表的是一种根本不同的理念:关于代理与浏览器应该如何交互。
让我们来看看 Browser Harness 究竟是什么,它跟我们已经在使用的工具(agent-browser、Browser Use 的 Python 库、Hermes 的内置浏览器工具)有何异同,以及它的设计决策为何值得关注。
Browser Harness 是什么?
Browser Harness 是一个极薄的 Python 线束(src/browser_harness/ 中约 592 行核心代码 + 约 391 行辅助函数),通过单条 CDP websocket 将 LLM 直接连接到用户真实运行中的 Chrome 浏览器。其架构简到极致:
Chrome / Browser Use cloud -> CDP WS -> browser_harness.daemon -> Unix socket -> browser-harness
没有 Playwright。没有 Puppeteer。没有抽象层。每次请求一行 JSON。Daemon 负责会话管理、Chrome 发现和远程浏览器配置——其余一切以纯 Python 运行,你(或你的代理)可以直接阅读和修改。
使用方式非常简单:
browser-harness -c '
new_tab("https://docs.browser-use.com")
wait_for_load()
print(page_info())
'
但这个工具真正的创新不在于语法,而在于哲学。
自愈合线束:会自己写工具的代理
这是 Browser Harness 最醒目的特性,也是它区别于我使用过的所有其他浏览器自动化工具的地方。
当使用 Browser Harness 的代理遇到无法用现有辅助函数完成的任务时,它不会失败也不会向人类求助。它会把缺失的代码写到 agent-workspace/agent_helpers.py 中,下一次 browser-harness 调用立即生效。每一次运行,线束都在自我改进。
● 代理:需要上传一个文件
│
● agent-workspace/agent_helpers.py → 辅助函数缺失
│
● 代理当场编写 agent_helpers.py
│ + 自定义辅助函数
✓ 文件上传成功
这是一种递归引导的过程。代理从自己的失败中学习。想象一下大规模场景:一千个代理访问一千个网站,各自将发现的模式贡献回共享仓库。集体智慧不断累积。
这也是**领域技能(Domain Skills)**的意义。仓库中的 agent-workspace/domain-skills/ 目录是一个不断增长的站点专用知识库——URL 模式、稳定选择器、私有 API 端点、框架怪癖、需要避开的陷阱。README 明确写道:"技能由线束编写,不是你。"代理生成它们,人类通过 PR 审核和合并。
这就将浏览器自动化从一个静态工具变成了活的知识库。每一个访问过某个网站的代理,都为下一个代理留下了更好的文档。
坐标点击理念
另一个引人注目的设计决策:Browser Harness 默认使用坐标点击而不是选择器交互。
工作流程是:
- 截图(
capture_screenshot()) - 从图像中读取像素坐标
- 在坐标处点击(
click_at_xy(x, y)) - 再次截图验证
理由是 Input.dispatchMouseEvent 会在合成器层面穿透 iframe、Shadow DOM 和跨域边界——基于选择器的方式做不到。只有当目标没有可见几何形状时才下降到 DOM 操作。
这是正确的做法吗?取决于你的场景。对于页面结构未知的一次性探索任务,像素交互比选择器狩猎更快更可靠。对于重复的生产级自动化,选择器通常更好——但 Browser Harness 代理可以随时间学习稳定选择器,并将其归档为领域技能。
工具对比
现在把 Browser Harness 和我们大多数人已经在用的工具做一个横向对比。
Browser Harness vs. agent-browser
| 维度 | Browser Harness | agent-browser |
|---|---|---|
| 语言 | Python(约 592+391 行) | Rust(原生 CLI) |
| 安装 | git clone + uv tool install -e . |
npm i -g agent-browser && agent-browser install |
| 浏览器模型 | 连接到用户正在运行的 Chrome | 生成/管理自己的 Chrome,或通过 CDP 连接 |
| 交互模型 | 坐标点击优先;Python 单行代码 | 无障碍树快照 + @eN 元素引用 |
| 自愈合 | 是——代理运行时编写缺失的辅助函数 | 否 |
| 领域技能 | 是——不断增长的站点专用知识库 | 否 |
| Electron 应用 | 否 | 是——专用支持 VS Code、Slack、Discord |
| 认证保险库 | 否 | 是——持久化认证状态 |
| 视频录制 | 否 | 是 |
判断:agent-browser 是一个精致的、生产级别的代理浏览器交互 CLI。它快速(Rust)、经过大量测试,且有对 Electron 应用的专用支持。Browser Harness 更像一个实验平台——它押注于不同的交互哲学(坐标点击 + 自愈合),并被设计为通过代理贡献来演进。
Browser Harness vs. Browser Use(Python 库)
这个对比很有意思,因为两者来自同一个组织。
| 维度 | Browser Harness | Browser Use(Python 库) |
|---|---|---|
| 层级 | 薄 CDP 线束 | 全栈 AI 代理框架 |
| 浏览器模型 | 用户真实 Chrome(或云端) | Playwright 管理的 Chromium |
| LLM 集成 | 无——代理像调其他 CLI 一样调 browser-harness |
内置 LLM 编排(Agent, ChatOpenAI, ChatOllama) |
| 抽象程度 | 极低——必要时直调原始 CDP | BrowserProfile, max_steps, 结构化输出 |
| 安装复杂度 | Chrome remote-debugging 开关 + uv tool install |
Playwright Chromium + 代理配置 + LLM provider |
| 代理陷阱 | 少(没有 Playwright 内部的 CDP 路由问题) | 多(CDP 走代理、ALL_PROXY 干扰等) |
| 用例 | 代理控制的真实浏览器探索 | 自主 AI 驱动的任务完成 |
判断:Browser Use 库是为"我想让 AI 在 headless 浏览器中自主完成这个任务"准备的。Browser Harness 是为"我想让我的代理控制我的真实浏览器,并且我想让它边用边学"准备的。它们是互补关系,而不是竞争关系。
Browser Harness vs. Hermes 内置浏览器工具
Hermes Agent 内置了浏览器工具(browser_navigate、browser_snapshot、browser_click、browser_vision 等),通过工具调用接口暴露 CDP 功能。这些工具深度集成——Hermes 模型在上下文中直接看到快照并决定动作。
| 维度 | Browser Harness | Hermes 内置浏览器 |
|---|---|---|
| 集成方式 | 外部 CLI,通过 terminal 调用 | 模型上下文中的一等工具调用 |
| 快照格式 | 截图(主要)+ page_info() | 无障碍树 + @eN 引用 |
| 自愈合 | 是——将辅助函数写入磁盘 | 否 |
| 持久化 | 领域技能仓库 | Memory 工具保存事实,Skills 保存工作流 |
| 模型透明度 | 不透明——模型只能看到输出 | 内联——快照在上下文窗口中可见 |
| 并行 | 多个 daemon 通过 BU_NAME | 单会话 |
判断:Hermes 内置浏览器工具是集成度最高的选项——模型直接在页面结构上进行推理。Browser Harness 更像是代理手持的外部仪器,关键优势在于可以在运行时修改。
代理线束的苦涩教训
Browser Harness 的 README 链接到一篇题为 "The Bitter Lesson of Agent Harnesses" 的博客文章,呼应了 Rich Sutton 著名论文的核心思想:我们为代理构建的硬编码抽象最终会成为它们的约束。能存活下来的线束不是功能最全的那个——而是让代理能重写自己规则的那个。
这是核心洞见。Playwright、Puppeteer,甚至无障碍树快照,都对浏览器应该如何交互做了假设。Browser Harness 几乎不做任何假设。它给代理原始 CDP、一个截图函数和一个可以编辑的 Python 文件。其余一切靠自己发现。
什么时候用哪个
在深入使用这些工具之后,给出个人的决策矩阵:
用 Browser Harness,当:
- 你正在做探索性、一次性的浏览器任务,页面结构未知
- 你希望代理跨会话相互学习
- 你接受坐标点击交互和截图验证
- 你想要一个每次使用都会自我改进的工具
用 agent-browser,当:
- 你需要经过实战检验、快速的 Rust CLI
- 你在操作 Electron 应用(VS Code、Slack、Discord)
- 你需要无障碍树快照和持久化认证状态
- 你喜欢带元素引用的选择器交互
用 Browser Use(Python 库),当:
- 你需要 AI 在 headless Chromium 中自主完成任务
- 你想要结构化输出和步骤限制
- 你愿意管理 Playwright 依赖和代理配置
用 Hermes 内置浏览器工具,当:
- 你已经在 Hermes 中,想要紧密集成
- 你希望模型直接在页面结构上推理
- 你不需要任何外部设置——开箱即用
结语
Browser Harness 不是功能最丰富的工具,不是最稳定的,也不是最好上手的。但它是理念上最有趣的那个。它的赌注是:最好的浏览器线束是那个不挡代理路的——给它原始访问权限、一个安全的扩展空间、以及一种把学到的知识贡献回集体的方式。
这个赌注是否成立取决于围绕它的代理(和人类)社区。但首月就有 9000 颗 GitHub 星标和 239 次提交,说明某些东西正在引起共鸣。
下次你的代理被某个网站卡住时,问问自己:它应该向你求助,还是应该自己写辅助函数?
所有代码示例和架构细节截至 2026 年 5 月。Browser Harness 仓库:github.com/browser-use/browser-harness。