每天一个开源项目#103 BrowserSkill:4.7K星,Agent接管真实浏览器

Trending 排名:#4|快照日期:2026-09-18|Stars:4,683|Forks:331|主语言:TypeScript|License:MIT

AI Agent 做网页任务时,最别扭的地方往往不是点击按钮,而是登录状态。让它重新开一个无痕浏览器?很多网站要验证码、短信、企业 SSO。把自己的浏览器直接交出去?又会打断当前工作,权限边界也说不清。

BrowserSkill 解决的是这个夹缝问题:Agent 通过一个本地 bsk CLI 发指令,真实浏览器里的扩展负责执行;任务跑在单独的 Agent Window,只有在明确借用用户已有标签页时才触碰你的普通窗口。这个设计没有把浏览器自动化包装成一个黑盒云服务,而是把 CLI、守护进程、浏览器扩展和技能说明拆成了几层可以审计的边界。

我更关心它的工程价值,而不是"Agent 能打开网页"这件事本身。源码里最有意思的部分,是它把浏览器自动化拆成了协议兼容、会话所有权、用户中断、借用标签页、长截图、文件传输、人工接管这些细粒度问题。换句话说,它不是一个简单的 Playwright 外壳,而是在给任意 shell-capable Agent 补一条真实浏览器通道。

📋 项目概览

项目 内容
项目名 Tencent/BrowserSkill
一句话 让 AI Agent 在不打断用户工作的前提下,操作用户已登录的 Chromium 浏览器
GitHub github.com/Tencent/Bro...
Stars / Forks 4,683 / 331
主要语言 TypeScript 65.1%、Rust 31.5%、JavaScript 2.3%
License MIT
最新版本 CLI / Extension / DSH Plugin 均为 v0.3.0(2026-09-16/17 发布)
代码规模 753 个 Git 跟踪文件;约 9.0 万行 TS、4.8 万行 Rust
核心组件 Rust CLI/daemon、Chromium MV3 扩展、共享协议 crate、DSH 插件、浏览器评测集

🔥 为什么值得关注

浏览器自动化这条路已经很拥挤。Playwright、Puppeteer、Chrome DevTools Protocol 都能点按钮、填表、截图。但 Agent 场景多了几个传统自动化不太关心的问题:它需要复用真实登录态,需要在模型做错时被用户中断,需要把"读页面"和"改页面"分清楚,还要能把任务窗口和用户正在用的窗口隔离开。

BrowserSkill 的处理方式比较务实。它没有要求 Agent 嵌进某个特定框架,只要 Agent 能执行 shell,就可以调用 bsk。Claude Code、Cursor、Codex、Hermes Agent 这类工具都能通过同一层 CLI 接入;DeepSeek Harness 则有单独的插件,把浏览器能力暴露成 browser_* 工具。

这类项目最容易写成"给 Agent 一个浏览器"的口号。看源码后我觉得它真正有价值的地方在两个字:边界。Agent 只能操作自己的 Agent Window;用户标签页要走 borrow/return;扩展保存的自动化偏好优先于旧版命令行绕过参数;协议版本不一致时能继续工作或明确拒绝;长截图这种看似小功能,也做了分块、取消、恢复和清理。这些东西不花哨,但决定了它能不能在真实桌面环境里长期使用。

🏗️ 核心特性

  1. 真实登录态复用,但不默认接管用户窗口

    BrowserSkill 让 Agent 使用同一个浏览器 profile,因此企业 SSO、站点登录状态、Cookie 都可以复用。它默认创建独立 Agent Window,普通用户窗口不被直接控制。需要操作已有标签页时,流程是先列出用户标签页,再借用,再归还。

    bash 复制代码
    bsk session start --no-focus --json
    bsk tab list --scope user --session <id>
    bsk tab borrow <tab-id> --session <id>
    bsk tab return <tab-id> --session <id>
    bsk session stop <id>

    上面这些命令名和参数已用当前源码构建出的 bsk --helpbsk session start --help 和 parser 测试核对。--no-focus 是真实存在的 session start 参数;tab borrow --timeout 只改变等待确认的时间,不会绕过确认。

  2. CLI → daemon → extension 的本地桥接架构

    README 的架构图和源码是一致的:Agent 调 shell,CLI 走本地 IPC 找 daemon,daemon 用 WebSocket 连接扩展,扩展再操作浏览器页面。Agent 不直接拿到浏览器内部对象。

    text 复制代码
    Agent Harness
        |
        | shell: bsk navigate / observe / click
        v
    bsk CLI  --local IPC-->  bsk daemon  --WS 127.0.0.1-->  BrowserSkill extension
                                                               |
                                                               v
                                                 Agent Window / borrowed user tab

    这层拆分的好处是可替换。CLI 负责命令行体验,daemon 负责会话、队列、取消和文件中转,extension 负责 CDP 与页面操作。坏处也很直接:CLI、daemon、extension 版本必须保持兼容,真实浏览器链路也比纯 headless 脚本更难部署。

  3. 协议兼容和用户中断是源码里的硬逻辑

    crates/bsk-protocol/src/method.rs 给每个 RPC 方法分了效果类型:只读、临时输入、浏览器变更、控制面。这个 match 没有兜底分支,新增方法时必须显式分类。observe 被归为 transient input,因为它的 hover probe 会触发真实页面事件;session.stop 属于控制面,不能被中断门拦住,否则用户点击停止后反而没法收尾。

    方法类型 例子 中断/权限含义
    PassiveRead snapshotget-html、普通 screenshot 读取状态,不驱动页面输入
    TransientInput observehoverscreenshot --full-page 会触发临时输入,需要被用户中断门约束
    BrowserMutation clickfillnavigatetab borrow 改变页面或浏览器状态
    ControlPlane session start/stopcancel 会话控制,不能被普通页面中断逻辑卡死

    这种分类比"把所有浏览器命令都当危险操作"更细,也比"截图观察一定无害"更诚实。

  4. 长截图做成了流式管线,而不是拼一个超大 Canvas

    v0.3.0 增加了 full-page screenshot。文档显示扩展把截图切成 512px 高的 PNG tiles,存在 OPFS,导出时由 worker 顺序读取、用 PNG Up filter 和原生 zlib 写出。Agent 侧通过 tool.screenshot_full_page 开始,再用 tool.screenshot_read 分块读取,最后 release。

    bash 复制代码
    bsk screenshot --session <id> --full-page --out page.png
    bsk screenshot --session <id> --full-page --scope current --timeout 5m --out loaded.png --json

    项目文档给过一个渲染测试样本:3,170 × 100,062 像素的长图,工作 Canvas 和 ImageBitmap RGBA buffer 峰值约 41.7 MiB;整张 RGBA 图如果一次性展开需要约 1.27 GiB。这个数字只覆盖截图管线自身的像素缓冲,不代表网页 DOM、Chrome 进程或编码器的总内存。

  5. 远程浏览器连接把认证问题放进协议层

    v0.3.0 的 remote browser connections 支持 Agent 跑在服务器上,浏览器扩展从用户电脑主动连出去。配对链接一次性使用,设备凭证会轮换,可撤销;WebSocket 使用 Sec-WebSocket-Protocol: bsk-auth.DEVICE_TOKEN,而不是靠浏览器形状的 Origin 当身份。

    这对团队内的 Agent runner 有现实意义:模型和 CLI 可以在服务器,浏览器仍然在用户桌面。但它也不是完整远程桌面。远程 upload/download 在这个版本里明确不支持,远程任务仍然只能操作任务创建或借用过的标签页。

🔬 技术架构深度解析

BrowserSkill 的代码分层很清楚,GitHub 语言统计里 TypeScript 占 65.1%,Rust 占 31.5%。这不是"前端项目顺便写了个 CLI"。Rust 部分承担了 CLI、daemon、IPC、WebSocket、授权、更新、文件传输和协议 schema;TypeScript 部分主要是 MV3 扩展、VOM 观察模型、DSH 插件和 UI。

text 复制代码
Repository
├── crates/
│   ├── bsk-cli          # Rust CLI + local daemon
│   └── bsk-protocol     # RPC frame、method、tool payload、schema
├── apps/extension       # Chromium MV3 extension,React + WXT
├── packages/
│   ├── vom              # semantic observation model
│   ├── ui / i18n        # 扩展 UI 与多语言
│   └── dsh-plugin-browserskill
├── skill/SKILL.md       # 给 Agent 的操作规范
└── evals/browser        # 本地确定性浏览器能力评测集

请求生命周期

一次普通页面读取大致是这样走的:

text 复制代码
bsk observe --session S
        |
        v
CLI 解析参数并构造 RPC
        |
        v
Daemon 校验 session、browser、队列和中断状态
        |
        v
WebSocket 发给对应浏览器扩展
        |
        v
Extension 在 Agent Window 里抓取 VOM / refs / hover hints
        |
        v
结果回到 CLI,输出给 Agent

关键点是 daemon 维护会话所有权和队列。源码里的 per-session queue 测试覆盖了同一 session 并发调度、不同 session 不互相阻塞、超时后保持 session busy 直到扩展清理完成等情况。这个设计看起来有点啰嗦,但对浏览器自动化很重要:点击、滚动、截图这些动作有真实副作用,不能像普通函数调用一样超时就立刻忘掉。

协议兼容

system.handshake 不用应用版本号做硬判断,而是比较 protocol_versionmin_compatible_protocol。同一 major、minor 有漂移时允许连接但标记 skew;major 不匹配或低于协议地板时拒绝。Rust 侧还把 protocol major 的解析上限对齐到 JavaScript 的 Number.MAX_SAFE_INTEGER,避免 daemon 接受而 extension 拒绝的非对称情况。

text 复制代码
peer/local protocol major 不一致        -> reject
peer protocol < local min compatible     -> reject
local protocol < peer min compatible      -> reject
同 major 但 minor 不同                   -> warn but allow
完全匹配                                 -> connected

这不是 README 层面的兼容声明,而是 crates/bsk-protocol/src/system.rs 和扩展 connection-controller.ts 两侧都有实现和测试。

安全边界

它的安全边界主要有四层:

边界 源码/文档证据 含义
Agent Window README 和 session lifecycle 默认任务窗口与用户普通窗口隔离
Borrow/return tab borrowtab return、skill 说明 用户标签页需要显式借用并归还
自动化偏好 README v0.3.0、interaction preferences 测试 旧版 --unattended 不能覆盖扩展保存的确认/求助开关
远程授权 remote docs、server tests 设备凭证绑定身份,撤销会关闭连接并阻止新连接

但它不是浏览器沙箱。配对的服务器或本地 Agent 仍然能创建任务窗口、读取任务页、使用已登录状态做被授权的操作。项目文档也把这一点说得很直:pair 只是在授权某台服务器操作浏览器,不是给网站级别的最小权限账号。

验证结果

我在浅克隆的 fa0439d 提交上做了几组确定性检查:

检查 结果
cargo run --locked -p bsk -- --help 及关键子命令 help 通过,确认本文 CLI 示例参数存在
env -u HERMES_HOME cargo test --workspace --locked 通过
pnpm eval:browser:check 通过,验证 9 个 case、18 条 fixture route、15 个 Node 测试
pnpm --filter @browser-skill/extension compile 通过
pnpm --filter @browser-skill/extension test 118 个测试文件通过、10 个跳过;1741 个测试通过、97 个跳过
pnpm --filter @browser-skill/vom test 55 个测试通过
pnpm --filter @browser-skill/i18n test 52 个测试通过
pnpm ext:build 通过,Chrome MV3 产物约 1.59 MB
pnpm lint 通过,含 Biome、stylelint、DSH 插件 typecheck 和 240 个插件测试

有一个小插曲:直接运行 Rust workspace tests 时,宿主环境里的 HERMES_HOME 会影响两个 Hermes skill 安装路径测试;清掉这个环境变量后全部通过。这更像测试环境污染暴露出的假失败,不影响 CLI/daemon 的运行路径,但也说明这类多 harness 安装逻辑很容易被宿主环境牵动。

📖 README 核心内容摘要

README 把 BrowserSkill 定位成"让 AI agents 使用你的真实浏览器,同时不打断你工作"的本地桥接工具。它支持 macOS、Linux、Windows,浏览器以 Chrome 和 Edge 为主,其他 Chromium 浏览器在支持 unpacked extension 时通常可用,Firefox 仍是计划项。

安装路径有两种。推荐路径是让 Agent 读取 AGENT_INSTALL.md 自动处理 CLI 和 skill 安装;手动路径则是安装 bsk CLI、安装浏览器扩展、执行 bsk install-skill,然后用 bsk doctor 检查连接。

bash 复制代码
curl -fsSL https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.sh | sh
export PATH="${BSK_INSTALL_DIR:-$HOME/.local/bin}:$PATH"
bsk --version
bsk install-skill
bsk doctor

install-skill 的 README 示例里提到交互选择和非交互安装。当前 help 确认它支持 --list--harness--json--source--force--yes。如果要给 Cursor 安装,可以这样写:

bash 复制代码
bsk install-skill --list --json
bsk install-skill --harness cursor --json

README 还强调了几个升级注意点:v0.3.0 后,CLI、扩展、DSH 插件共享版本号;--unattendedtab borrow --no-confirmBSK_REQUEST_HELP=off 保留兼容但不能绕过扩展侧的自动化设置;长截图、远程连接、operation audit、scroll-to、wheel、focus/blur 等能力需要 CLI、daemon、extension 版本匹配。

对开发者来说,最值得读的不是首页,而是这些文档:

文档 价值
skill/SKILL.md Agent 实际该怎么启动 session、观察、点击、借用标签页、请求人工帮助
docs/remote-extension-connection.md 远程连接的 pairing、credential renewal、撤销和代理边界
docs/long-screenshot.md 分块长截图、OPFS、PNG 流式导出和错误边界
evals/browser/README.md 浏览器能力评测集的 case、fixture、oracle 和 adapter 设计
CHANGELOG.md v0.3.0 能力边界与升级破坏点

🚀 快速上手

下面是一个最小的本地使用流程。真实执行前,你需要先在 Chrome 或 Edge 里装好 BrowserSkill 扩展,并让扩展连接到本地 daemon。

bash 复制代码
# 1. 安装 CLI
curl -fsSL https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.sh | sh
export PATH="${BSK_INSTALL_DIR:-$HOME/.local/bin}:$PATH"

# 2. 安装 Agent skill
bsk install-skill --harness cursor --json

# 3. 检查连接
bsk doctor

# 4. 开一个不会抢焦点的 Agent Window
bsk session start --no-focus --json

# 5. 假设上一步返回 session_id = abc123
bsk navigate https://example.com --session abc123
bsk observe --session abc123
bsk screenshot --session abc123 --out example.png
bsk session stop abc123

如果你的 Agent 运行在会清理后台子进程的沙箱里,不要让每个命令都偷偷重启 daemon。README 建议把 daemon 放在持久宿主环境里管理,然后在 Agent 命令里设置:

bash 复制代码
export BSK_AUTO_START=0
export BSK_HOME=/path/to/shared/bsk-home
bsk status --json

远程模式则需要先在服务器上启动 server 模式 daemon,再生成 pairing link,让用户电脑上的扩展主动连入。这个模式适合 Agent 跑在远程机器、浏览器留在用户桌面的场景,但要把 BSK_HOME 当成敏感本地状态保存,因为里面有设备授权与 IPC 元数据。

📊 增长速度与社区热度

BrowserSkill 创建于 2026-06-22,快照日为 2026-09-18,约 87.7 天内累积 4,683 Stars。粗略的生命周期均值约 53.4 Stars/天。这个数字只能当作长期基线,不能替代 GitHub Trending 当日新增 Stars,因为脚本快照没有保留每个仓库的当日新增值。

社区活跃度上,它的维护节奏很密。最近一次 GitHub Release 是 cli-v0.3.0(2026-09-17),扩展 ext-v0.3.0 是 2026-09-16;默认分支最新提交为 2026-09-18。贡献者 API 里前 10 名分别是 TencentXiaowei、Ljy-0827、iuyo5678、BB-fat、shnpd、NianJiuZst、iAstro、hobostay、dayi、hZsFN,提交分布不是单人玩具项目。

指标 数值
Stars 4,683
Forks 331
Open Issues 51
Watchers/Subscribers 13
最新提交 2026-09-18,fa0439d
最新 Release CLI v0.3.0 / Extension v0.3.0
代码文件 753 个 Git 跟踪文件
测试覆盖观察 Rust、extension、VOM、i18n、DSH 插件、浏览器 eval harness 都有确定性测试

完整 Trending 榜单如下,Stars/语言为同日 API 补充校验值;当日新增 Stars 未在快照中保留。

Rank Repository Language Stars Forks
1 alibaba/open-code-review Go 35,754 2,540
2 cloudflare/security-audit-skill JavaScript 11,358 612
3 addyosmani/agent-skills JavaScript 96,044 10,163
4 Tencent/BrowserSkill TypeScript 4,683 331
5 alphaXiv/OpenResearch Rust 5,151 313
6 anthropics/claude-code TypeScript 145,989 23,662
7 NationalSecurityAgency/ghidra Java 78,709 8,703
8 anthropics/knowledge-work-plugins Python 24,671 2,957
9 Tencent/WeKnora Go 26,630 3,592
10 abue-ammar/tinycast Swift 6,271 290
11 cilium/cilium Go 25,324 4,079
12 jamiepine/voicebox TypeScript 54,993 6,841
13 affaan-m/ECC JavaScript 261,412 39,131
14 roboflow/supervision Python 50,887 4,837
15 JustVugg/colibri C 35,904 3,777
16 TencentCloud/Octop Python 3,685 384
17 ever-co/ever-gauzy TypeScript 7,664 1,137
18 cline/cline TypeScript 68,639 7,420
19 coder/coder Go 14,982 1,491
20 n8n-io/n8n TypeScript 205,158 60,759

🎯 适用场景

场景 为什么适合 需要注意
企业内网页登录流程自动化 复用真实登录态,绕过重复 SSO 登录成本 不适合把账号交给不可信 Agent 或服务器
Agent 辅助运营后台操作 独立 Agent Window 可减少对用户工作流的打断 关键提交、支付、审批仍应人工确认
Web UI 回归检查 observe、截图、console、network、emulate 等能力比较完整 不是 Playwright 替代品,确定性测试仍应保留专门 E2E 套件
长页面资料采集 full-page screenshot 支持自动/当前范围、分块导出 无限滚动和虚拟列表仍可能触发边界条件
远程 Agent + 本地浏览器 扩展主动连服务器,适合远程 runner 使用本地登录态 需要 TLS、凭证管理和清晰的设备授权策略
DeepSeek Harness 浏览器工具 DSH 插件提供 native browser_* 工具和 Web UI 视图 插件升级需要单独处理,不能只更新 CLI

不太适合的场景也要说清楚:如果你需要大规模、完全无人工参与、可重放的浏览器测试,Playwright 仍然更合适;如果你希望给模型一个严格隔离的浏览器沙箱,BrowserSkill 也不是沙箱产品。它的定位更像"把用户真实浏览器安全地接到 Agent 工作流里",而不是"替代所有浏览器自动化工具"。

💡 总结

BrowserSkill 的亮点不在"能控制浏览器",而在它认真处理了真实浏览器接入 Agent 后会冒出来的一堆脏问题:登录态、标签页所有权、用户中断、版本漂移、长截图内存、远程配对、技能安装和确定性评测。

我会把它看成一个 Agent 基础设施项目。它适合那些已经在用 Claude Code、Cursor、Codex、Hermes Agent 或 DeepSeek Harness 做本地工作流的人:当任务必须碰真实网页,又不能每次都卡在登录和验证码上,BrowserSkill 提供了一条工程上比较克制的路。

边界也很明确。它依赖浏览器扩展和本地 daemon,部署比纯 CLI 工具复杂;配对远程浏览器时,服务端获得的是很强的浏览器操作能力;某些能力,比如远程 upload/download、Firefox 支持、真实浏览器 smoke,还不是"装上就全覆盖"。这些限制不减分,反而让这个项目显得更可信:它没有把权限问题说成魔法。

相关推荐
dong_junshuai1 小时前
每天一个开源项目#102 六阶段代码复核流程范式
开源·github·agent
峰向AI2 小时前
别再给 AI 助手单独付费了,腾讯开源 3.6K 星标的全家共享平台
github
阿里云云原生2 小时前
一本 Agent 白皮书,值得连续写两年么?
agent
吴佳浩2 小时前
为什么 Agent 需要 Memory?Memory 和 RAG 到底有什么区别?
人工智能·agent·ai编程
吴佳浩2 小时前
Agent Memory 架构设计:短时记忆、长期记忆与 Memory 生命周期
人工智能·agent·ai编程
菩提小狗2 小时前
每日极客日报 · 2026年09月17日
ai·开源·极客日报·it热点·技术资讯
GlobalInfo2 小时前
上新 | 全球及中国Agent测试用例生成软件行业研究报告(2026版):市场现状、行业前景与占有率分析
人工智能·ai·agent
武子康2 小时前
Expert Parallel 深入解析:专家分得均匀,负载为什么仍不均
人工智能·llm·agent
leeyi3 小时前
Agent 要用 API key,但明文一次都不能进模型——Secret Runtime 落地实录(第110篇)
后端·aigc·agent