|
| 1 | +# OpenBrowser |
| 2 | + |
| 3 | +[](https://deepwiki.com/softpudding/OpenBrowser) |
| 4 | + |
| 5 | +[English README](README.md) |
| 6 | + |
| 7 | +OpenBrowser 是一个面向真实网页任务的多模态浏览器 Agent。 |
| 8 | + |
| 9 | +它把浏览器自动化视为一个视觉与交互系统问题,而不只是 DOM 解析问题。浏览器是大多数人每天都会使用的最复杂的软件环境之一。读取 DOM 当然有帮助,但理解 DOM 并不等于真正能把网页操作好。我们相信更长期的方向是多模态控制,或者至少是强混合式控制。 |
| 10 | + |
| 11 | +OpenBrowser 围绕这个判断来构建: |
| 12 | + |
| 13 | +- 通过截图和直接浏览器操作,以视觉方式理解和控制页面 |
| 14 | +- 将浏览器执行路径与控制窗口隔离 |
| 15 | +- 在 mock 网站和真实工作流上持续评测 |
| 16 | +- 把模型成本当作一等工程约束 |
| 17 | + |
| 18 | +> 注意:OpenBrowser 目前仅通过 Chrome 扩展支持 Chrome 浏览器。开发和评测主要基于 `dashscope/qwen3.5-plus` 和 `dashscope/qwen3.5-flash`。 |
| 19 | +
|
| 20 | +## Demo |
| 21 | + |
| 22 | +### 小红书租房 Demo |
| 23 | + |
| 24 | +这个 demo 更接近 OpenBrowser 想解决的真实网页任务:它会在小红书上搜索西溪湿地附近的一居室整租房源,浏览多条帖子,基于采光、整洁度、装修状态和空间实用性做视觉判断,并筛出更合适的候选。 |
| 25 | + |
| 26 | +任务 prompt: |
| 27 | + |
| 28 | +> 帮我在小红书上找 3 个西溪湿地附近的整租一居室。它们最好靠近地铁,不要太老、太暗、太乱或者过度装修;厨房、卫生间和卧室看起来要干净,并且有不错的自然采光。浏览多条帖子,选出最好的 3 个;给最好的 2 个点赞和收藏,并评论询问价格、最早入住时间、能否短租、以及是否允许养猫;最后总结你为什么选它们。 |
| 29 | +
|
| 30 | + |
| 31 | + |
| 32 | +[完整视频:recording_xiaohongshu.webm](demo/recording_xiaohongshu.webm) |
| 33 | + |
| 34 | +这个 demo 展示了: |
| 35 | + |
| 36 | +- 在真实中文内容平台里搜索、开帖、翻图和比较房源 |
| 37 | +- 基于图片里的采光、整洁度、布局和装修状态做视觉判断 |
| 38 | +- 在长流程里穿插点赞、收藏、评论等站内交互 |
| 39 | +- 最终输出候选 shortlist,而不是停在单步按钮操作 |
| 40 | + |
| 41 | +## 为什么是 OpenBrowser |
| 42 | + |
| 43 | +### 浏览器很难 |
| 44 | + |
| 45 | +浏览器本身已经是工业界最复杂的软件环境之一:动态布局、异步状态、弹窗、标签页切换、可滚动容器、局部渲染,以及充满噪声的视觉上下文,都会在日常任务里同时出现。 |
| 46 | + |
| 47 | +### 最原生的界面是视觉 |
| 48 | + |
| 49 | +人类操作浏览器,本来就是靠看页面,再配合鼠标和键盘。当前模型想稳定做到这一点仍然需要大量工程辅助,但最自然的控制闭环仍然是视觉的。这也是 OpenBrowser 把截图和交互原语放在核心位置的原因。 |
| 50 | + |
| 51 | +### DOM 有帮助,但 DOM-only 不是终局 |
| 52 | + |
| 53 | +像 PinchTab 或 OpenClaw Browser Relay 这样的重 DOM 系统在今天可以工作得很好,而且在某些任务上可能比多模态流水线更快、更准。但理解 DOM 并不等于能稳定操作真实页面。我们的判断是,长期最好的浏览器 Agent 会是多模态的,或者至少是强混合式的。 |
| 54 | + |
| 55 | +### 评测是开发的一部分 |
| 56 | + |
| 57 | +OpenBrowser 不是靠“感觉不错”来迭代的。仓库里包含带事件跟踪的 mock 网站,放在 [`eval/`](eval/) 下;有意义的改动都会在这套评测上验证。真实世界里失败过的行为,也会反过来变成新的评测用例。 |
| 58 | + |
| 59 | +### 成本同样重要 |
| 60 | + |
| 61 | +模型能力重要,但价格也同样重要。我们不假设 token 成本会一直便宜下去。OpenBrowser 从一开始就把这个约束纳入设计,包括对更强模型和更便宜模型的分层处理。 |
| 62 | + |
| 63 | +## 评测 |
| 64 | + |
| 65 | +OpenBrowser 目前用两种互补方式做评测: |
| 66 | + |
| 67 | +- 真实浏览器工作流,以及和现有方案的并排对比 |
| 68 | +- 带事件跟踪的自定义 mock 网站回归套件,位于 [`eval/`](eval/) |
| 69 | + |
| 70 | +仓库里当前主要归档对比,保持相同控制设置,对比的是 `OpenClaw Browser Relay` 和 `OpenClaw + OpenBrowser skill`: |
| 71 | + |
| 72 | +- [`eval/archived/2026-03-16/browser_agent_evaluation_2026-03-16_openclaw_vs_openbrowser.md`](eval/archived/2026-03-16/browser_agent_evaluation_2026-03-16_openclaw_vs_openbrowser.md) |
| 73 | +- [`eval/evaluation_report.json`](eval/evaluation_report.json) |
| 74 | + |
| 75 | +我们重点跟踪: |
| 76 | + |
| 77 | +- 通过率 |
| 78 | +- 执行时间 |
| 79 | +- 成本 |
| 80 | +- 控制窗口剩余上下文空间 |
| 81 | + |
| 82 | +`2026-03-16` 的代表性归档结果: |
| 83 | + |
| 84 | +| 方案 | 通过率 | 平均时间 | 控制窗口上下文 | |
| 85 | +|------|--------|----------|----------------| |
| 86 | +| OpenClaw Browser Relay | 6/7 | 211s | 640% | |
| 87 | +| OpenClaw + OpenBrowser (`qwen3.5-plus`) | 7/7 | 274s | 21% | |
| 88 | +| OpenClaw + OpenBrowser (`qwen3.5-flash`) | 首轮 5/7,重试后 7/7 | 317s | 12% | |
| 89 | + |
| 90 | +这个对比不是为了宣称 OpenBrowser 在所有任务、所有指标上都更优,而是为了把真实权衡说清楚:重 DOM relay 系统在今天可能依然很强,而 OpenBrowser 的设计目标,是保留控制窗口上下文空间,支持多模态执行路径,并通过可重复评测持续改进。 |
| 91 | + |
| 92 | +### 自己运行评测 |
| 93 | + |
| 94 | +```bash |
| 95 | +# 列出可用测试 |
| 96 | +python eval/evaluate_browser_agent.py --list |
| 97 | + |
| 98 | +# 一次性设置浏览器 capability token |
| 99 | +export OPENBROWSER_CHROME_UUID=YOUR_BROWSER_UUID |
| 100 | + |
| 101 | +# 用两个模型跑全部测试 |
| 102 | +python eval/evaluate_browser_agent.py --model dashscope/qwen3.5-plus --model dashscope/qwen3.5-flash |
| 103 | + |
| 104 | +# 或者在单次运行里显式传 browser UUID |
| 105 | +python eval/evaluate_browser_agent.py --test techforum --chrome-uuid YOUR_BROWSER_UUID |
| 106 | +``` |
| 107 | + |
| 108 | +评测框架说明见 [AGENTS.md](AGENTS.md#evaluation-system)。 |
| 109 | + |
| 110 | +## 快速开始 |
| 111 | + |
| 112 | +### 用你的浏览器体验 OpenBrowser |
| 113 | + |
| 114 | +#### 1. 安装 Python 依赖 |
| 115 | + |
| 116 | +```bash |
| 117 | +# 使用 uv(推荐) |
| 118 | +uv sync |
| 119 | + |
| 120 | +# 或者使用 pip |
| 121 | +pip install -e . |
| 122 | + |
| 123 | +# 开发环境(包含 pytest、black、ruff 等开发依赖) |
| 124 | +uv sync --group dev |
| 125 | +# 或者用 pip |
| 126 | +pip install -e ".[dev]" |
| 127 | +``` |
| 128 | + |
| 129 | +#### 2. 启动服务端 |
| 130 | + |
| 131 | +```bash |
| 132 | +uv run local-chrome-server serve |
| 133 | +``` |
| 134 | + |
| 135 | +服务会启动在 `http://127.0.0.1:8765`(HTTP)和 `ws://127.0.0.1:8766`(WebSocket)。 |
| 136 | + |
| 137 | +#### 3. 配置 LLM 设置 |
| 138 | + |
| 139 | +第一次访问时,网页界面会提示你配置 LLM: |
| 140 | + |
| 141 | +1. 在浏览器中打开 `http://localhost:8765` |
| 142 | +2. 你会看到 **Configuration Page** |
| 143 | +3. 填写 API 配置: |
| 144 | + - **Model**:默认是 `dashscope/qwen3.5-plus`(也支持更便宜的 `dashscope/qwen3.5-flash`) |
| 145 | + - **Base URL**:默认是 `https://dashscope.aliyuncs.com/compatible-mode/v1` |
| 146 | + - **API Key**:你的 API key(必填) |
| 147 | +4. 可以按需配置 **Default Working Directory**(CWD) |
| 148 | +5. 点击 **Save**,再点击 **Continue to Main Interface** |
| 149 | + |
| 150 | +> **注意**: |
| 151 | +> - 配置会保存在 `~/.openbrowser/llm_config.json` |
| 152 | +> - 你可以随时通过状态栏里的 **⚙️ Settings** 按钮修改设置 |
| 153 | +> - 环境变量(LLM_API_KEY、LLM_MODEL、LLM_BASE_URL)**不再支持**,请使用 Web UI 配置 |
| 154 | +
|
| 155 | +#### 4. 构建 Chrome 扩展 |
| 156 | + |
| 157 | +```bash |
| 158 | +cd extension |
| 159 | +npm install |
| 160 | +npm run build |
| 161 | +``` |
| 162 | + |
| 163 | +#### 5. 在 Chrome 里安装扩展 |
| 164 | + |
| 165 | +1. 打开 Chrome,进入 `chrome://extensions/` |
| 166 | +2. 开启 **Developer mode**(右上角开关) |
| 167 | +3. 点击 **Load unpacked** |
| 168 | +4. 选择 `extension/dist` 目录 |
| 169 | + |
| 170 | +安装完成后,OpenBrowser 会打开一个浏览器内部页面,显示当前浏览器实例的 UUID。 |
| 171 | +这个 UUID 就是控制该浏览器实例的权限 key。 |
| 172 | + |
| 173 | +重要: |
| 174 | + |
| 175 | +- 任何拿到这个 UUID 的人,都可以通过 OpenBrowser 操作该浏览器 |
| 176 | +- 不要随意分享 |
| 177 | +- 之后点击扩展图标,也可以重新打开 UUID 页面 |
| 178 | + |
| 179 | +#### 6. 配置 Chrome 弹窗设置(重要) |
| 180 | + |
| 181 | +Chrome 默认会拦截弹出窗口,这可能导致 OpenBrowser 点击链接时无法打开新标签页。你需要允许弹窗: |
| 182 | + |
| 183 | +**方案 A:对特定网站放行(推荐)** |
| 184 | + |
| 185 | +1. 当弹窗被拦截时,地址栏会显示一个被拦截图标(🚫) |
| 186 | +2. 点击图标,选择 “Always allow pop-ups and redirects from [site]” |
| 187 | +3. 点击 **Done** |
| 188 | + |
| 189 | +**方案 B:全局允许弹窗** |
| 190 | + |
| 191 | +1. 打开 Chrome 设置:`chrome://settings/content/popups` |
| 192 | +2. 在 “Default behavior” 下选择 **Sites can send pop-ups and use redirects** |
| 193 | +3. 或者把特定网站加到 “Allowed to send pop-ups” 列表里 |
| 194 | + |
| 195 | +> **注意**:如果 OpenBrowser 点击了链接却没有打开新标签页,先检查地址栏是否有弹窗拦截图标。这是新用户最常见的问题之一。 |
| 196 | +
|
| 197 | +#### 7. 打开 Web 前端 |
| 198 | + |
| 199 | +在浏览器中访问: |
| 200 | + |
| 201 | +```text |
| 202 | +http://localhost:8765 |
| 203 | +``` |
| 204 | + |
| 205 | +现在你就可以通过 Web 界面和 Agent 交互了。 |
| 206 | + |
| 207 | +在发送指令前: |
| 208 | + |
| 209 | +1. 从扩展页面复制浏览器 UUID |
| 210 | +2. 粘贴到前端的 `BROWSER UUID` 输入框 |
| 211 | +3. 开始聊天 |
| 212 | + |
| 213 | +权限流转过程如下: |
| 214 | + |
| 215 | +1. Chrome 扩展通过 WebSocket 连接到服务端 |
| 216 | +2. 服务端为该浏览器保存一条 `uuid -> websocket` 映射 |
| 217 | +3. 前端会话向用户索要这个 UUID |
| 218 | +4. 用户发送消息时,前端会把这个 UUID 一起带上 |
| 219 | +5. 服务端据此把浏览器命令路由到对应扩展连接 |
| 220 | + |
| 221 | +这意味着:只要持有这个 UUID capability token,就拥有控制该浏览器的权限。 |
| 222 | + |
| 223 | +--- |
| 224 | + |
| 225 | +### 也可以通过 SKILL 使用 OpenBrowser |
| 226 | + |
| 227 | +直接告诉你的 agent 安装 `skill/codex/open-browser` |
| 228 | + |
| 229 | +## 为什么当前主要使用 Qwen3.5 系列? |
| 230 | + |
| 231 | +OpenBrowser 目前主要围绕 Qwen3.5 系列开发,因为它在多模态浏览器任务上,给出了一个比较实用的能力/成本平衡点。 |
| 232 | + |
| 233 | +在实际使用里: |
| 234 | + |
| 235 | +- `qwen3.5-plus` 主要用于更难的视觉推理和更复杂的多步执行 |
| 236 | +- `qwen3.5-flash` 更适合追求更快迭代速度和更低成本的场景 |
| 237 | +- 这个项目把模型选择视为工程权衡,而不是产品本身 |
| 238 | + |
| 239 | +进一步了解 Qwen3.5: |
| 240 | + |
| 241 | +- [Qwen3.5: Towards Native Multimodal Agents(官方博客)](https://qwen.ai/blog/qwen3.5) |
| 242 | +- [Qwen3.5: Towards Native Multimodal Agents(阿里云)](https://www.alibabacloud.com/blog/qwen3.5-towards-native-multimodal-agents) |
| 243 | +- [Alibaba unveils Qwen3.5 as China's chatbot race shifts to AI agents (CNBC)](https://www.cnbc.com/2026/02/17/china-alibaba-qwen3.5-ai-agent.html) |
| 244 | +- [Alibaba unveils new Qwen3.5 model for 'agentic AI era' (Reuters)](https://www.reuters.com/technology/alibaba-unveils-qwen3.5-agentic-ai) |
| 245 | +- [QwenLM/Qwen3.5 (GitHub)](https://github.com/QwenLM/Qwen3.5) |
| 246 | + |
| 247 | +## 设计原则 |
| 248 | + |
| 249 | +### 1. 多模态优先,必要时混合 |
| 250 | + |
| 251 | +OpenBrowser 以视觉页面理解和直接交互为核心。像 DOM 这样的结构化信号依然可能有帮助,但不会被假设为完整答案。 |
| 252 | + |
| 253 | +### 2. 保持执行路径隔离 |
| 254 | + |
| 255 | +浏览器 worker 不应该把全部状态都灌进控制窗口。OpenBrowser 使用独立执行路径,让控制模型不必背负完整的浏览器会话历史。 |
| 256 | + |
| 257 | +### 3. 持续评测 |
| 258 | + |
| 259 | +仓库里包含 mock 网站、事件跟踪和归档对比结果。目标不是只把 demo 做好一次,而是在回归压力下持续变强。 |
| 260 | + |
| 261 | +### 4. 尊重成本约束 |
| 262 | + |
| 263 | +浏览器 Agent 只有在实际可运行时才有价值。因此 OpenBrowser 把价格和上下文使用量都视为核心设计约束,而不是事后补充。 |
| 264 | + |
| 265 | +## 核心特性 |
| 266 | + |
| 267 | +- **视觉 AI 自动化**:通过 AI 驱动的视觉识别来“看见”并操作网页 |
| 268 | +- **浏览器控制**:基于视觉理解和 JavaScript 执行完成点击、输入、滚动和导航 |
| 269 | +- **标签页管理**:支持打开、关闭、切换和管理标签页,并保持会话隔离 |
| 270 | +- **数据提取**:利用 AI 对页面结构的理解抓取和收集网站数据 |
| 271 | +- **表单填写与提交**:自动填写表单、提交数据,并处理多步工作流 |
| 272 | +- **会话持久化**:在自动化任务之间保留浏览器会话、Cookie 和登录状态 |
| 273 | +- **多接口访问**:提供 REST API、WebSocket 和 CLI,方便程序化控制 |
| 274 | + |
| 275 | +## 架构 |
| 276 | + |
| 277 | +``` |
| 278 | +┌─────────────────────────────────────────────────────────────┐ |
| 279 | +│ Qwen3.5 Family (Multimodal LLM) │ |
| 280 | +│ Qwen3.5-Plus (primary) / Qwen3.5-Flash (cost-effective) |
| 281 | +│ Visual Perception │ Decision Making │ Browser Control │ |
| 282 | +└─────────────────────────────────────────────────────────────┘ |
| 283 | + │ |
| 284 | + ▼ |
| 285 | +┌─────────────────────────────────────────────────────────────┐ |
| 286 | +│ OpenBrowser Agent Server (FastAPI) │ |
| 287 | +│ REST API │ WebSocket │ Session Management │ Tool Orchestration |
| 288 | +└─────────────────────────────────────────────────────────────┘ |
| 289 | + │ |
| 290 | + ▼ |
| 291 | +┌─────────────────────────────────────────────────────────────┐ |
| 292 | +│ Chrome Extension (Chrome DevTools) │ |
| 293 | +│ Screenshots │ JavaScript Execution │ Tab Management │ |
| 294 | +└─────────────────────────────────────────────────────────────┘ |
| 295 | +``` |
| 296 | + |
| 297 | +## 开发 |
| 298 | + |
| 299 | +### 构建命令 |
| 300 | + |
| 301 | +```bash |
| 302 | +# 扩展开发模式构建(watch) |
| 303 | +cd extension |
| 304 | +npm run dev |
| 305 | + |
| 306 | +# TypeScript 类型检查 |
| 307 | +npm run typecheck |
| 308 | +``` |
| 309 | + |
| 310 | +### 项目结构 |
| 311 | + |
| 312 | +```text |
| 313 | +. |
| 314 | +├── server/ # FastAPI 服务端与 agent 逻辑 |
| 315 | +│ ├── agent/ # Agent 编排 |
| 316 | +│ ├── api/ # REST 接口 |
| 317 | +│ ├── core/ # 核心处理逻辑 |
| 318 | +│ └── websocket/ # WebSocket 服务 |
| 319 | +├── extension/ # Chrome 扩展(TypeScript) |
| 320 | +│ ├── src/ |
| 321 | +│ │ ├── background/ # 带 CDP 的后台脚本 |
| 322 | +│ │ ├── commands/ # 浏览器自动化命令 |
| 323 | +│ │ └── content/ # 提供视觉反馈的内容脚本 |
| 324 | +│ └── dist/ # 构建后的扩展 |
| 325 | +└── frontend/ # Web UI |
| 326 | +``` |
| 327 | + |
| 328 | +## 许可证 |
| 329 | + |
| 330 | +LGPL-3.0 |
| 331 | + |
| 332 | +## 致谢 |
| 333 | + |
| 334 | +本项目构建在 [OpenHands SDK](https://github.com/OpenHands/software-agent-sdk) 之上,它为我们的 agent 架构和工具集成提供了基础。感谢 OpenHands 团队对开源社区的贡献。 |
| 335 | + |
| 336 | +特别感谢: |
| 337 | + |
| 338 | +- **OpenHands Team**:提供了优秀的 SDK,支撑了整个 agent 系统 |
| 339 | +- **Qwen Team (Alibaba)**:提供了强大的 Qwen3.5-Plus 多模态模型 |
0 commit comments