用 dsh-plugin 让 DeepSeek Harness 驱动本机 Tabbit 浏览器

前言

DeepSeek Harness(dsh)默认更像一台编码智能体:改文件、跑 shell、偶尔做一次联网搜索。任务一旦变成「打开这个站点、点按钮、填表、把登录态留下来」,只靠 curl 或无头浏览器就不够用了——需要的是本机正在跑的图形浏览器,以及一套能把页面操作交回给模型的接口。

Tabbit 是一款 AI 原生桌面浏览器,国内站是 tabbit.com,国际站是 tabbit.ai,目前提供 macOS 与 Windows 安装包。它自带一套由浏览器持有、按任务隔离的 Playwright CLI(tabbit-cli)和 Runtime。Tabbit-Browser 组织把这条链路打成了 DeepSeek Harness 插件:仓库名是 dsh-plugin,安装进 DSH 之后,智能体就可以驱动 Tabbit 完成浏览任务。

本文按插件目录页、GitHub 仓库 README、package.json、内置 Skill 原文和 DeepSeek Harness 官方仓库核对后整理:它是什么、装完能做什么、怎么装、以及哪些边界不要指望它补上。DeepSeek Harness 目前仍是开发者预览,官方口号是「一切皆插件」;deepseek-harness-plugin.com 是独立社区目录,与 DeepSeek / 幻方无官方从属关系,下面的安装命令以目录页和仓库原文为准。

这是什么

dsh-plugin 是 Tabbit-Browser 维护的社区插件,GitHub 仓库为 Tabbit-Browser/dsh-plugin。目录页把它归在「界面增强」;仓库里的 npm 包名其实是 tabbit-browser,当前版本 0.1.0package.json 声明许可证为 MIT(仓库根目录目前没有单独的 LICENSE 文件,安装前仍应对照源码自行确认)。截至 2026-08-17,GitHub API 显示 76 星;目录页仍显示 16 星,以后者为收录快照、以仓库页面为准。

它解决的问题很具体:让 DSH 里的智能体控制已经安装在本机上的 Tabbit,而不是再去拉起 Chrome、Ego,或改走 curl / 裸 CDP。插件本身做两件事:

  1. 随 bundle 自动注册名为 tabbit-browser 的 Skill,模型可用 skill({ name: "tabbit-browser" })/tabbit-browser 加载说明,不必再单独装一份 Skill。
  2. 注册工具 tabbit_browser_install:检测正式版、核对最低版本 1.9.0、检查 tabbit-cli 与 Runtime;环境不够时在后台下载对应地区的安装包。

真正的页面操作不走插件里的「原生浏览器工具」。README 写得很清楚:它不提供 tabbit_browser_evaluate 这类接口。模型是通过宿主机上的 Shell 调用 tabbit-cli,把一段 Playwright 风格的 JavaScript 交进浏览器持有的 Runtime。

核心功能

环境预检,而不是直接开浏览器

智能体在一次 DSH agent session 里第一次做浏览操作前,应先调用 tabbit_browser_install。工具返回三种状态:

  • ready:本机已有不低于 1.9.0 的正式版,且 tabbit-cli 与 Runtime 进程都在。接着还要用平台文档里的 tabbit-cli tasks 做一次连接探测,探测成功才算环境通过。
  • restart-required:版本够了,但 Runtime 没在跑。Skill 要求只提示用户重启一次 Tabbit,插件不会代为启动或重启 Runtime。
  • background:没装正式版,或所有已装正式版都低于 1.9.0。插件会用 ctx.jobs 开一个后台下载任务,进度写到 job 输出,完成后通知安装包的绝对路径。

同一次 agent session 里,成功的检测结果会缓存。Runtime / launcher 失败、浏览器刚装过或刚重启之后,再带 refresh: true 作废缓存。不要为后续每一个小步骤重复跑预检。

只认两个正式版

检测逻辑写在 installer.js 里,只认稳定渠道:

  • 国际正式版:应用名 Tabbit(macOS bundle id com.tabbit-ai.Tabbit
  • 国内正式版:应用名 Tabbit Browser(macOS bundle id com.tab-browser.Tabbit

装任意一个、版本 >= 1.9.0 即可。开发版不会被识别。Windows 先查卸载项里的固定键名 Tabbit / Tabbit Browser,找不到再扫卸载表;macOS 查 /Applications 和用户 Applications。Linux 不在检测与下载名单里。

tabbit-cli 的路径也是写死的:

  • macOS:~/.local/bin/tabbit-cli
  • Windows:%LOCALAPPDATA%\Tabbit\LocalAgent\bin\tabbit-cli.exe

Skill 要求启动器必须是命令行的第一个 token,不要用 envtimesh -lc 包一层。

缺浏览器时按地区下载,但不代装

未安装或版本过低时,插件读取系统地区:macOS 用 defaults read -g AppleLocale,Windows 用系统地区 API。地区码为 CN 时走国内源 https://www.tabbit.com,其他地区或识别失败走国际源 https://www.tabbit.ai。安装包按平台分成 Windows x64、macOS Apple Silicon、macOS Intel,落到用户的 Downloads 目录。

它会校验 HTTPS 跳转主机(www / pkg / releases 的 tabbit.com 与 tabbit.ai)、限制体积不超过 1 GiB,并检查 .exe 的 MZ 头或 .dmgkoly 尾。不会自动打开 .dmg / .exe。job 完成后出现 TABBIT_INSTALLER_READY 时,把路径告诉用户,由用户自己跑完系统安装向导,再启动一次 Tabbit。

用任务空间驱动页面,而不是每次新开一个浏览器

Skill 把一次用户请求映射到一个 task space(任务空间)。第一次 tabbit-cli nodejs --task '...' 会在当前浏览器世代固定的非隐身 Profile 里建隔离的 Playwright runtime;之后同名、同世代的调用会复用页面、globalThis、receipt 和登录态。Runtime 重启会换世代,旧的具名任务不会复活。

评估代码跑在持久的 Node 环境里,拿到的是真正的 Playwright 对象:browsercontextpagepages()usePage(),以及 assert / expect。DOM 相关逻辑要放进 page.evaluate()。页面上还有冻结的 tabbit 全局,提供 observe()safeClick()pasteText() 这类有界辅助,并不替代原生 Playwright API。

Skill 把日常操作分成三条工作流,可以组合使用:

  • 语义工作流(默认):普通 DOM 页面,用 locator 和断言
  • 视觉工作流:canvas、地图、富文本等 DOM 对不上可见编辑目标时,先截图再键鼠,写入前做一次小探针
  • 页面求值工作流:一次 page.evaluate() 做紧凑的 DOM 遍历或聚合,不要把一次计算拆成很多次求值

多开 Tabbit 时,预检仍判 Runtime 可用,不会误报「没在跑」。模型要根据 CLI 的选择错误设置 TABBIT_PLAYWRIGHT_INSTANCE

安装与启用

先确认本机有 DSH。仓库 README 的检查方式:

dsh --version

没有这条命令时,需要 Node.js 20 或更高版本(插件 engines 也要求 >=20),再安装 CLI:

npm install -g @deepseek-ai/dsh

DeepSeek 官方仓库的快速启动是 npx @deepseek-ai/dsh web,Web UI 默认在 http://127.0.0.1:3080

社区目录页上的安装命令原文是:

dsh plugin add github:Tabbit-Browser/dsh-plugin

仓库 README 写的是装进 web profile,然后再启动 Web UI:

dsh plugin --profile web add github:Tabbit-Browser/dsh-plugin
dsh web

目录页提示:插件以当前 dsh 进程的权限运行,安装时可能执行代码;如需可复现安装,请固定 commit。2026-08-17 仓库 main 最新提交是 1aa3157e3ed01641b86d7ee80da059b7140a317e,可以写成:

dsh plugin --profile web add github:Tabbit-Browser/dsh-plugin#1aa3157e3ed01641b86d7ee80da059b7140a317e

插件声明的 peer 依赖包括 @deepseek-ai/cordis@deepseek-ai/dsh-jobs@deepseek-ai/dsh-skill@deepseek-ai/dsh-tools。README 还要求当前 profile 提供 ctx.skillsctx.toolsctx.jobs,以及跑在 Tabbit 所在宿主机上的 Bash/Shell,并且这个 Shell 能访问浏览器持有的 Runtime Service。dsh-tool-jobs 需要能给当前 Agent 做后台任务控制和完成通知。

典型用法

装好并启动 dsh web 之后,先让模型加载 Skill,再做预检,最后才发 tabbit-cli

加载 Skill:

skill({ name: "tabbit-browser" })

或在对话里使用 /tabbit-browser

预检(只在 session 内第一次浏览前调用;环境变了再带 refresh):

tabbit_browser_install
tabbit_browser_install({ refresh: true })

下面这段来自内置 SKILL.md,在一个名为 inspect extensions 的任务空间里打开扩展页并读标题:

tabbit-cli nodejs --task 'inspect extensions' <<'EOF'
await page.goto('chrome://extensions', {waitUntil: 'domcontentloaded'});
return {title: await page.title(), url: page.url()};
EOF

命令会打印一个 JSON,终端成功结果在 receipt.result.value。同一任务空间里赋给 globalThis 的值后续还能用。只读探测可以加 --read-only

tabbit-cli nodejs --task 'inspect extensions' --read-only <<'EOF'
globalThis.extensionCount = await page.locator('extensions-item').count();
return {extensionCount};
EOF

--foreground 只有用户在对话里明确要求把任务页带到前台时才加。--claim-tab 只用于用户亲手选中的标签。重要的写操作建议带稳定的 --request-id;receipt 处于 queuedrunning 时不要重交同一段代码,用 tabbit-cli receipt 查询,中断后用 tabbit-cli checkpoint 看检查点。

做完后结束任务空间:

tabbit-cli finish --task 'inspect extensions'

默认会关掉任务自己创建的页面,不会关用户认领的标签。研究、搜索、中间页、空白页和错误页默认不保留;只有交付物或后续交接页才 --keep

适用场景与注意事项

适合已经在本机使用 Tabbit、希望 DSH 智能体去做站点交互、信息抽取、回归或基准测试的人。Skill 描述里写的范围是:Tabbit 浏览器自动化、网页交互、抽取、QA 和 benchmarks,并且不要静默切到别的浏览器后端

不适合这些情况:

  • DSH 的 Bash 跑在 E2B、远程容器,或任何碰不到本机 GUI 浏览器的沙箱里。README 写明:这种环境下本 Skill 不会让 Tabbit 自动化变得可用。
  • 只想控制 Chrome 当前标签、或需要插件直接暴露 evaluate 类工具。本包明确不提供 tabbit_browser_evaluate,也不检测开发版。
  • Linux。检测与下载列表只有 Windows x64 与 macOS。

Windows 上还有一条权限边界。DSH 的 read-only / workspace-write 限制令牌写不了 Runtime 的命名管道。Skill 和源码的策略是:先按默认沙箱正常跑 tabbit-cli tasks 探测,成功就不问权限;只有 Browser、launcher、Runtime 都已检测到、但连接返回 BROWSER_RUNTIME_UNAVAILABLE 时,才请用户把当前会话改成 Full Permission,然后立刻停任务,不重试、不继续点页面。同一次提交里的单元测试断言 Windows 的 cliSandboxModedefault;README「范围」一节仍写 Windows 返回 danger-full-access,与 index.js 不一致,以源码和 Skill 为准。

安装安全方面,目录页的警告需要当真:插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前检查 源码仓库 和许可证;生产或要复现的环境请固定 commit。社区目录不是官方应用商店,收录不等于背书。

小结

dsh-plugin 并没有在 DSH 里再实现一套浏览器,而是把 Tabbit 自己的 CLI 和 Runtime 接进 Harness:预检正式版、必要时下载安装包、用任务空间复用登录态,页面操作交给 Playwright 风格的 tabbit-cli。目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin/ ;源码:https://github.com/Tabbit-Browser/dsh-plugin 。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜