Vibium 是专为 AI 代理设计的浏览器自动化基础设施,采用单一 Go 二进制文件管理浏览器生命周期、WebDriver BiDi 协议及 MCP 服务器。它支持零配置的 Chrome 控制,提供同步与异步 API,并通过 MCP 协议无缝集成 Claude Code 等工具。
在当前的软件开发领域,浏览器自动化工具往往伴随着令人头疼的配置问题。无论是 WebDriver 的版本兼容性,还是复杂的环境搭建,开发者常常需要花费大量时间在”非核心”工作上。Vibium 的出现正是为了解决这一痛点——它是一个构建于 AI 代理之上的浏览器自动化基础设施,旨在消除自动化过程中的”戏剧性”冲突,提供一种”开箱即用”的极致体验。
那么,Vibium 到底是如何工作的?它与传统工具有何不同?未来又将如何演进?让我们基于其核心架构与开发路线图,进行一次全面的技术拆解。
核心架构:从 LLM 到浏览器的数据流
要理解 Vibium 的强大之处,首先需要剖析其独特的架构设计。Vibium 并不是一个简单的脚本工具,而是一个精心编排的系统,它将大语言模型(LLM)或 AI 代理与浏览器连接起来。
整个系统由两个主要组件构成:Clicker(后端核心)和 JS Client(前端接口)。这种分离式设计使得底层复杂性对开发者完全透明。
架构图解:数据如何在系统中流动
Vibium 的架构可以被想象成一个多层处理管道:
-
顶层:LLM / AI 代理
这包括 Claude Code、Codex、Gemini 或本地模型。它们是发出指令的”大脑”。 -
通信层:MCP 协议
AI 代理通过标准输入/输出与 Vibium 通信。这里使用了 MCP(Model Context Protocol)标准,确保了与 Claude Code 等工具的无缝集成。 -
中间层:Vibium Clicker
这是系统的核心,一个约 10MB 的 Go 二进制文件。它内部包含三个关键子模块:-
MCP Server:负责解析来自 AI 代理的 JSON-RPC 请求。 -
BiDi Proxy:一个 WebSocket 服务器,负责在客户端和浏览器之间路由 WebDriver BiDi 协议消息。 -
Browser Management:负责检测、启动和管理 Chrome 浏览器进程。
-
-
底层:Chrome Browser
实际执行渲染和页面操作的浏览器实例。
对于开发者而言,还有一个独立的路径:JS/TS Client。它直接通过 WebSocket(默认端口 9515)与 Clicker 通信,既支持异步 API(await vibe.go()),也支持同步 API(vibe.go()),满足不同开发场景的需求。
组件一:Clicker —— 隐形的基础设施
Clicker 是 Vibium 的心脏。设计团队为其设定了一个雄心勃勃的目标:”让二进制文件隐形”。这意味着开发者只需通过 npm 安装,而不需要关心底层发生了什么。
Clicker 的四大核心能力
作为一个单一的二进制文件,Clicker 实际上承担了繁重的任务:
-
浏览器管理
Clicker 能够智能检测并启动启用了 BiDi 功能的 Chrome 浏览器。它优先使用缓存中的 Chrome for Testing,如果找不到,才会回退到系统安装的 Chrome。 -
BiDi 代理服务器
它在本地运行一个 WebSocket 服务器(默认端口 9515),充当客户端与浏览器之间的中介。所有的 WebDriver BiDi 命令都通过这个代理进行路由。 -
MCP 服务器
通过标准输入输出接口,Clicker 暴露了一个符合 MCP 标准的服务器。这使得 Claude Code 或任何支持 MCP 的客户端都能直接驱动浏览器,无需任何中间适配层。 -
自动等待与截图
为了提高自动化的稳定性,Clicker 内置了轮询机制,在元素交互前自动等待元素就绪。同时,它支持将视口捕获为 PNG 图片,方便调试和记录。
技术细节:二进制大小与性能
Clicker 被编译为一个静态链接的二进制文件,大小约为 10MB。使用 Go 语言编写不仅保证了跨平台编译的便利性(Linux, macOS, Windows),还提供了原生的并发性能,能够高效处理 WebSocket 消息的路由和浏览器进程的管理。
组件二:JS/TS 客户端 —— 面向开发者的 API
虽然 Clicker 处理了所有底层工作,但开发者主要通过 JavaScript 或 TypeScript 客户端与 Vibium 交互。该客户端被设计为一个 npm 包(vibium),提供了极大的灵活性。
三种导入方式
为了适应不同的运行环境,Vibium 提供了三种导入方式:
-
CommonJS (REPL 友好):使用 require,适合传统的 Node.js 脚本。 -
动态导入:使用 await import(),适合支持顶层 await 的 REPL 环境。 -
静态导入:使用 import,适合现代 .mjs 或 TypeScript 项目。
同步 vs 异步 API
这是 Vibium 区别于 Playwright 或 Puppeteer 的一个显著特点。它同时提供了同步和异步两套 API。
同步 API (browserSync):
对于自动化测试脚本或简单的任务,同步 API 让代码看起来更像传统的顺序执行,无需处理 Promise 链。这通常是通过 Worker threads 或 Atomics.wait 等机制实现的,虽然在 Node 单线程模型中实现同步阻塞有技术挑战,但 Vibium 通过底层 Go 进程的配合实现了这一目标。
const { browserSync } = require('vibium')
const vibe = browserSync.launch()
vibe.go('https://example.com')
const png = vibe.screenshot()
// ... 同步执行后续操作
vibe.quit()
异步 API (browser):
对于 I/O 密集型或需要高并发的应用,标准的异步 API 更为合适。
const { browser } = await import('vibium')
const vibe = await browser.launch()
await vibe.go('https://example.com')
const png = await vibe.screenshot()
// ... 异步执行
await vibe.quit()
为 AI 代理赋能:MCP 集成
Vibium 最具前瞻性的功能之一是其对 AI 代理的原生支持。通过 MCP 协议,Claude Code 可以直接控制浏览器。
零配置集成
添加浏览器控制功能到 Claude Code 只需要一条命令:
claude mcp add vibium -- npx -y vibium
这一命令背后的流程是全自动的:
-
下载并安装 Clicker 二进制文件。 -
自动下载 Chrome for Testing 和 chromedriver 到缓存目录。 -
启动 MCP 服务器,建立与 Claude Code 的通信通道。
可用的 MCP 工具集
一旦集成完成,AI 代理就可以调用以下工具来操作浏览器:
| 工具名称 | 描述 |
|---|---|
browser_launch |
启动浏览器会话(默认为可见模式) |
browser_navigate |
导航到指定的 URL |
browser_find |
通过 CSS 选择器查找元素 |
browser_click |
点击指定元素 |
browser_type |
向元素输入文本 |
browser_screenshot |
捕获视口截图(返回 base64 或保存文件) |
browser_quit |
关闭浏览器并结束会话 |
| 这意味着你可以直接告诉 Claude:”去 example.com 点击第一个链接”,它将通过 Vibium 自动执行这些步骤。 |
安装与环境配置
对于人类开发者来说,Vibium 的安装过程设计得极其简化。它利用 npm 的生命周期钩子,自动处理了所有复杂的依赖下载。
自动化安装流程
执行 npm install vibium 时,后台会发生以下操作:
-
二进制安装:npm 包会根据当前平台自动安装对应的 Clicker 二进制文件。 -
浏览器下载:脚本会从 Google Chrome Labs 的官方仓库获取最新的 Chrome for Testing 版本信息,并下载匹配当前平台的二进制文件及 chromedriver。 -
缓存管理:下载的资源会被解压到平台特定的缓存目录中: -
Linux: ~/.cache/vibium/ -
macOS: ~/Library/Caches/vibium/ -
Windows: %LOCALAPPDATA%\vibium\
-
环境变量控制
如果你希望使用系统中已安装的 Chrome,或者在某些受限环境中无法下载浏览器,可以通过设置环境变量 VIBIUM_SKIP_BROWSER_DOWNLOAD=1 来跳过自动下载步骤。
深度解析:可操作性
在浏览器自动化中,最常见的问题之一是”元素找到了,但点不了”(例如,元素被遮挡、未渲染完成或不可见)。Vibium 借鉴了 Playwright 的设计哲学,引入了严格的可操作性检查机制。
这不仅仅是一个简单的等待元素存在,而是一套多维度的验证系统。在进行任何交互(点击、输入)之前,系统会自动轮询验证以下条件:
五大检查维度
-
可见性
元素必须具有非空的边界框,且不能被 CSS 设置为visibility: hidden或display: none。这是通过getBoundingClientRect()和getComputedStyle()来验证的。 -
稳定性
元素的位置必须在两次连续检查中保持一致。通常系统会比较间隔 50毫秒的两个时间点的边界框,以确保元素没有在动画或布局抖动中。 -
接收事件
这一点至关重要。系统会使用elementFromPoint()在元素的中心点进行点击测试,以确保该元素确实是点击的目标,而不是被其他图层或元素遮挡。 -
启用状态
元素不能处于禁用状态。系统会检查[disabled]或[aria-disabled=true]属性。 -
可编辑状态
专门针对文本输入的检查。除了必须是可用的(Enabled),元素还不能是只读的([readonly]或[aria-readonly=true])。
检查策略与超时
不同的操作对应不同的检查组合:
-
Click 操作:需要通过 可见 + 稳定 + 接收事件 + 启用 的检查。 -
Type 操作:需要通过 可见 + 稳定 + 接收事件 + 启用 + 可编辑 的检查。 -
Find 操作:仅检查元素是否存在,不进行可操作性验证。
系统默认的超时时间为 30 秒,轮询间隔为 100毫秒。这意味着如果元素在 30 秒内未能满足所有条件,操作将抛出超时错误,而不是像传统工具那样可能会无休止地等待或导致不可预测的行为。
V1 开发路线图:两周构建 MVP
Vibium 的 V1 版本展示了高效的工程实践,目标是在两周内完成最小可行性产品(MVP)。让我们回顾一下这 14 天的开发历程,这不仅展示了产品的功能,也体现了工程规划的严谨性。
第一周:基础与连接
Day 1: 项目搭建
建立了 Monorepo 结构,包含 Go 的 Clicker 模块和 TypeScript 的客户端模块。完成了基础的 CLI 命令行框架搭建。
Day 2: 浏览器检测与安装
解决了跨平台的路径问题,实现了 Chrome for Testing 的自动安装器。这是确保”零配置”体验的关键一步,能够自动获取最新稳定版浏览器并解压到缓存目录。
Day 3: WebSocket 与 BiDi 基础
建立了与 Chrome 的 WebSocket 连接,实现了 BiDi 协议的基础类型定义和会话管理。这是 Clicker 能够与浏览器对话的基石。
Day 4: 导航与截图
实现了浏览上下文的管理,包括页面导航、加载等待以及视口截图功能。这意味着系统已经可以”看”到网页内容了。
Day 5: 元素查找与输入
通过脚本注入的方式实现了基于 CSS 选择器的元素查找,并封装了鼠标点击和键盘输入的底层动作。
第二周:代理、客户端与 AI 集成
Day 6: BiDi 代理服务器
构建了 WebSocket 代理服务器,实现了客户端与浏览器之间的双向消息路由。这使得 Clicker 不仅仅是一个命令行工具,而变成了一个服务。
Day 7-8: JS 客户端开发
开发了 TypeScript 客户端,包括异步 API 和同步 API。实现了元素类(Element)及其相关方法(click, type, text 等),完善了前端开发体验。
Day 9: 可操作性检查
引入了上述的 Actionability 机制,显著提升了自动化的可靠性。这是区分”能跑”和”稳定”的关键分水岭。
Day 10: MCP 服务器
实现了 MCP 协议处理器,将 Clicker 的功能暴露为一组标准的工具。这打开了通往 AI 代理世界的大门。
Day 11: 抛光与错误处理
完善了错误类型定义(连接错误、超时错误、元素未找到错误等),优化了日志输出,并实现了优雅关闭机制,确保进程退出时不会留下僵尸 Chrome 进程。
Day 12-13: 打包与发布
实现了跨平台编译,构建了针对不同操作系统和架构的二进制文件。配置了 npm 的发布流程,利用 optionalDependencies 机制实现平台包的自动匹配。
Day 14: 文档
完成了 README、教程示例的编写,确保用户能够快速上手。
V2 愿景:感知、思考与行动
虽然 V1 已经实现了核心的”行动”(Act)能力,但 Vibium 的宏大愿景远不止于此。V2 路线图规划了一个完整的感知 → 思考 → 行动控制闭环。
Cortex —— 思考层
什么是 Cortex?
Cortex 是一个基于 SQLite 的数据存储层,旨在构建应用程序的”应用地图”。它会记录页面、操作和会话数据,形成一个导航图。
为什么需要它?
目前的 AI 代理(如 Claude Code)拥有对话上下文,但缺乏持久的记忆。当代理需要跨会话规划复杂的多步骤导航时,可能会重复探索相同的路径。Cortex 通过图算法(如 Dijkstra 寻路)帮助代理规划最优路径。
技术实现:
-
使用 SQLite 存储结构化数据。 -
集成向量数据库(如 sqlite-vec)处理嵌入(embeddings)。 -
提供 REST API 和 MCP 工具接口,支持查询页面信息、查找路径和搜索历史。
Retina —— 感知层
什么是 Retina?
Retina 是一个 Chrome 扩展程序,用于被动地记录浏览器中的所有活动,无论是由谁(人类或 AI)驱动的。
为什么需要它?
MCP 的截图工具提供了基本的可见性,但 Retina 提供了更全面的感知能力。它可以记录 DOM 快照、捕获屏幕事件,并将数据以 JSONL 格式发送给 Cortex。
应用场景:
-
记录人类会话以供回放。 -
调试代理运行期间发生了什么。 -
为模型训练收集交互数据。
其他规划功能
V2 还包括了对 Python 和 Java 客户端的支持、视频录制功能(通过 FFmpeg)、以及最具挑战性的AI 定位器——允许使用自然语言(如”点击蓝色按钮”)来查找元素,这需要集成视觉模型并处理其固有的延迟和不确定性。
平台支持与兼容性
Vibium 作为一个跨平台工具,目前的支持矩阵如下:
| 平台 | 架构 | 状态 |
|---|---|---|
| Linux | x64 | ✅ 已支持 |
| macOS | x64 (Intel) | ✅ 已支持 |
| macOS | arm64 (Apple Silicon) | ✅ 已支持 |
| Windows | x64 | ✅ 已支持 |
| 这覆盖了绝大多数开发者的工作环境。通过 Go 语言的交叉编译能力,Vibium 能够轻松为这些平台生成静态链接的二进制文件,无需用户安装额外的运行时依赖。 |
总结:浏览器自动化的新范式
Vibium 代表了浏览器自动化工具的一种新范式。它不再仅仅是一个测试框架,而是面向 AI 时代的基础设施。通过将复杂的 WebDriver BiDi 协议、浏览器生命周期管理和 AI 通信协议(MCP)封装在一个约 10MB 的二进制文件中,Vibium 极大地降低了自动化开发和 AI 代理集成的门槛。
对于开发者而言,它提供了同步和异步两套直观的 API;对于 AI 代理而言,它提供了标准化的工具接口。随着 V2 版本 Cortex(思考层)和 Retina(感知层)的加入,Vibium 有望成为连接 AI 智能与 Web 世界的桥梁,真正实现”无戏剧化”的浏览器自动化体验。
