编程 592行代码统治浏览器:Browser Harness如何让AI智能体获得完全自由

2026-05-01 04:44:44 +0800 CST views 6

Browser Use团队的反叛:推倒自己数万行框架

2026年4月,浏览器自动化领域最活跃的开源团队之一 Browser Use 做了一个出人意料的决定:他们把数万行的框架全部推倒重来,发布了一个只有592行代码的新项目——Browser Harness。

8天,6700+ Star。

没有元素提取器,没有DOM索引器,没有点击包装器。只有一条直连Chrome的WebSocket,和四个Python文件。

这个决策背后的逻辑,将彻底颠覆你对"AI工具设计"的认知。

核心理念:不要包装LLM,也不要包装它的工具

从"苦涩教训"到"更苦的教训"

几个月前,Browser Use 团队写了一篇文章《Agent框架的苦涩教训》,核心论点:不要用抽象层包裹LLM,给模型最大的行动空间,然后按需限制。

但他们发现自己只对了一半——他们没有包裹LLM,却包裹了LLM的工具。

每一个 click()type()scroll() 辅助函数,都是开发者替模型决定"它需要什么"。每一个这样的函数,都是经过RL训练的模型需要绕过的约束。

为什么是原始CDP

Browser Use 第一版包含了数千行代码:元素提取器、DOM索引器、点击封装器……

但他们发现:LLM本来就懂CDP。

Page.navigateDOM.querySelectorRuntime.evaluate——这些Chrome DevTools Protocol的原生命令,LLM在训练数据中见过无数次。模型不需要你替它封装,它自己会写。

CDP是Chrome暴露的最低层接口。直接给模型:

  • 跨域iframe:直接attach到target,不用和frame抽象层搏斗
  • Shadow DOM:像模型见过一万次的那样调用 shadowRoot.querySelectorAll
  • 反机器人注入:就是Chrome自己在跟自己说话

他们之前搞错的一件事

团队曾写过一篇文章《离开Playwright,拥抱CDP》,结论是:"我们的Agent不应该需要了解CDP Target的细节才能完成任务。"

他们错了。

那篇文章列出了Chrome标签页崩溃的10种方式。他们为每一种都写了看门狗服务——标签崩溃、target分离、渲染器OOM、zygote死亡、GPU进程崩溃……每个都有处理器,每个都需要跟Chrome内部保持同步。

但给LLM直接CDP访问权+编辑自己代码的能力后,模型自己就能处理所有这些情况。页面死了、target错位了、Chrome卡住了——Agent读错误信息,重新attach到新target,重试。不需要看门狗。它读过成千上万个Chrome崩溃的帖子,它知道该怎么办。

"我们试图隐藏的'CDP复杂性',不是该隐藏的东西。那是应该让模型看到的东西。"

四个文件,592行

这就是Browser Harness的全部:

文件行数职责
run.py13行运行Python,预加载helpers
helpers.py192行CDP薄封装,Agent可编辑
daemon.py220行保持CDP WebSocket连接存活
SKILL.md-告诉Agent怎么用以上三个文件

架构极简:Agent写Python → run.py执行 → helpers.py调用CDP → daemon.py维持WebSocket → Chrome执行命令。 Chrome以上的每一层都可重写。

自愈循环:缺失的工具?Agent自己写

这是Browser Harness最颠覆的设计:

  1. Agent执行任务,发现缺少某个helper函数
  2. Agent自动搜索 helpers.py,发现确实没有
  3. Agent自己写这个函数,添加到helpers.py
  4. 重新执行,任务完成

团队没有告诉Agent要这样做。他们只是给了它Claude Code的Read/Edit/Write能力加上CDP访问权。编程Agent本来就知道怎么修复缺失的import。

关键洞察:Agent不是从零开始写代码,而是补写缺失的那一个函数——就像在任何代码库里修复一个缺失的import一样。

魔法时刻

文件上传。 团队忘了加 upload_file()。任务中途,Agent碰到文件输入框,搜索helpers.py,什么也没找到,直接用原始的 DOM.setFileInputFiles 写了上传函数,上传了文件。团队是在看git diff时才发现的。

分块上传。 写完 upload_file 后,Agent尝试上传12MB文件。CDP WebSocket载荷限制约10MB。Agent碰到了限制,读了错误信息,自动切换到分块上传模式。

Gusto到日历。 任务:把每个员工的生日放进共享日历。需要导航Gusto的员工页面、从DOM提取日期、然后创建Google Calendar事件。Agent一路搞定。

Azure管理门户。 Azure管理门户是iframe里面套blade的一坨。原始CDP通过坐标级别的 Input.dispatchMouseEvent,在合成器层面穿透一切。

技能系统:探索一次,永久复用

Browser Harness 还有一个关键设计——技能(Skills)系统

问题:每个Agent都从零开始

你第一次用Google Flights,输入城市名,回车——没反应。你得等下拉菜单出现,再点建议。人类犯一次错就永远记住了。但Web Agent每次都犯同样的错。

解决:Agent自己生成技能

任务完成后,第二个Agent审查完整执行轨迹,问自己:"下次做这个任务,你需要知道什么才能在1-3步内完成?" 然后提取一个技能——URL模式、操作配方、未来Agent可以跳过的步骤数。

社会化技能网络

一个Agent创建了技能,其他Agent使用并留下反馈——不只是点赞/踩,而是带理由的书面反馈。理由让反馈有用:-1分附带理由不只是降低分数,技能Agent会根据理由编辑技能本身

Duo 2FA技能经历了3个版本,随着Agent发现边界情况不断迭代。分数跌到-3以下,技能自动退役。近似重复的技能自动合并。

不需要RL,不需要微调。Agent创建内容,Agent审查内容,好的浮上来。

隐私保护

每个技能保存前经过PII网关——专门的LLM拒绝任何包含邮箱、token、用户特定数据的内容。

安装与使用

一键安装

在Claude Code或Codex中粘贴:

Set up https://github.com/browser-use/browser-harness for me.

Agent会自动读取 install.md 安装并连接浏览器,然后读取 SKILL.md 学习日常用法。

自定义技能

agent-workspace/domain-skills/ 目录下存放站点特定技能——LinkedIn外联、Amazon下单、报销填写等。每个技能教Agent那些它否则需要重新发现的CSS选择器、操作流程和边界情况。

重点:技能是harness自己写的,不是你手写的。 只要用Agent跑你的任务——当它发现非显而易见的操作时,它会自动归档为技能文件。

云端支持

Browser Use还提供免费层:3个并发浏览器、代理、验证码解决等,无需信用卡。

范式转变:从"按手册干活"到"拥有Root权限"

Browser Harness 代表的不仅是一个工具,而是AI Agent设计范式的根本转变:

旧范式新范式
开发者预定义所有操作Agent按需编写操作
框架包裹一切薄封装,Agent可编辑
错误需要看门狗处理Agent读错误自己修复
每次任务从零探索技能系统永久积累经验
框架限制=模型天花板Chrome能力=模型天花板

苦涩教训的终极版本:你的辅助函数也是抽象。删掉它们。让Agent自己写它需要的。

团队作者 Gregor Zunic 的挑战:"第一个找到它完不成的任务(验证码/2FA除外)的人,我送一台Mac Mini。我试了一周,破不了。"

小结

  • 592行Python代码,8天6700+ Star
  • 四个文件:run.py + helpers.py + daemon.py + SKILL.md
  • 一条WebSocket直连Chrome CDP,零中间抽象
  • 自愈循环:缺少工具?Agent自己写
  • 技能系统:探索一次,永久复用,社会化反馈迭代
  • 比数万行框架更强大,因为它不限制模型

GitHub: github.com/browser-use/browser-harness

复制全文 生成海报 AI智能体 浏览器自动化 CDP 开源 Python

推荐文章

java MySQL如何获取唯一订单编号?
2024-11-18 18:51:44 +0800 CST
使用Rust进行跨平台GUI开发
2024-11-18 20:51:20 +0800 CST
ElasticSearch简介与安装指南
2024-11-19 02:17:38 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
程序员茄子在线接单