dsh-browser:在 DSH 侧边栏里跑真实 Chromium,人机可交替操作

前言

在 DeepSeek Harness(DSH)里让智能体「上网」,常见做法要么是抽象 HTTP 抓取,要么用无头浏览器但无法处理登录、验证码和二次验证。许多站点还会在 iframe 里被 X-Frame-Options 挡住,登录态也难在人和 Agent 之间交接。

@noext34/dsh-browser(仓库 Noext/dsh-browser)把一台真实的 Chromium 嵌在 DSH 右侧边栏:Agent 通过工具驱动页面,遇到需要人工的步骤时你可以接管同一浏览器、同一配置与 Cookie,完成后再交回。维护者为 Noext,在 SkillHub 社区目录中归类为联网工具。

这是什么

一句话:dsh-browser 在 Host 上启动 Chromium,用 Chrome DevTools Protocol(CDP)把画面以 JPEG 串流推到侧边栏画布,输入从侧边栏回传到页面;Agent 与人共用同一会话、同一 Profile。

与「只在模型里描述网页」不同,密码直接进 Chromium,不进入模型上下文、Session 日志或截图(README 中明确说明)。

架构要点

Host 侧维护一个 Chromium Session;CDP 使用 Page.startScreencast 输出帧,输入走 Input.*。镜像不是 iframe,而是 WebSocket 上的二进制帧,因此登录页不被帧策略拦住,且站点 HTML 不进入 DSH 的 DOM。

每个活跃 Agent 对应一个 Chromium Session,两个 Session 不共享 Cookie;Session 销毁时关闭浏览器。镜像按侧边栏 CSS 尺寸做 1:1 视口模拟(至少 360×300),点击坐标与页面所见一致。

Agent 可用工具

安装后,Agent 获得一组 browser_* 工具:

工具 作用
browser_open 打开地址并返回页面文本
browser_read 读取当前页可见文本
browser_click 点击 CSS 选择器或坐标点
browser_type 输入文本,可选提交
browser_press 按键(Enter、Tab、方向键等)
browser_screenshot 捕获 PNG 持久图像
browser_navigate 后退、前进、刷新
browser_tabs 列出、切换、新建或关闭标签
browser_request_human 请求人工接管并等待交回

当人类处于接管状态时,上述工具会失败,并提示:a human is controlling the side-panel browser; wait for them to hand it back。

人机交接(handover)

同一租约有三种状态:idle(无人驾驶)、agent(工具可用)、human(拒绝一切 browser_*,侧栏显示 You are driving)。

  1. 在工具栏点 Take control 接管浏览器。
  2. 完成后点 Done — hand back 交回 Agent。
  3. Agent 调用 browser_request_human 时,页签会显示原因横幅,工具调用阻塞直到你交回、超时或取消。

若长时间无操作,接管会在 humanIdleMs 后自动失效,避免 forgotten 标签长期锁住 Agent。

安装与启用

插件面向 web profile,npm 包名为作用域包 @noext34/dsh-browser(npm 上无作用域的 dsh-browser 属于另一位作者的其他插件)。

当前 package.json 版本为 0.2.3,要求 Node >=24.9.0、DSH >=0.2.0,许可证 MIT。

按 README 安装并启动:

dsh plugin --profile web add @noext34/dsh-browser
dsh --profile web

从 npm 安装可在 Plugins 页面使用 Update 按钮;git 安装不提供 DSH 内的就地更新。更新命令:

dsh plugin --profile web update @noext34/dsh-browser

新代码在 Host 重启后加载;运行中版本可通过 GET /api/dsh-browser/status 或 Host 日志中的 dsh-browser <version> starting 核对。

Chromium 可执行文件依次从环境变量 DSH_BROWSER_EXECUTABLE、Playwright 缓存(npx playwright install chromium)、常见系统路径发现;可用配置项 executablePath 固定路径。

配置项

默认值与含义见 README;前六项可在 Plugins → Browser 页面编辑,修改写入 profile 的 cordis.patch.yml,变更项可 Reset to default。

字段 默认 含义
executablePath 自动发现 Chromium 可执行路径
headed true 是否在 Host 显示器上显示窗口;false 为无头,侧边栏镜像仍可用
persistentProfile true Cookie 与登录保存在 $DSH_HOME/browser-profiles
width, height 1280, 800 初始视口
quality 62 镜像 JPEG 质量
maxSessions 2 单 Host 并发浏览器数
humanIdleMs 600000 人工接管空闲多久后失效
idleTimeoutMs 300000 无观众且无活动时关闭浏览器
startUrl about:blank 新浏览器打开的地址
chromiumArgs — 额外 Chromium 启动参数

示例(YAML 片段):

- id: dsh-browser
  config:
    headed: false
    idleTimeoutMs: 120000

典型用法

  1. 启动带 web profile 的 DSH 后,打开右侧边栏,选择 Browser,输入地址访问页面。
  2. 或在对话中让 Agent 操作,例如:open example.com and tell me what the page says(README 原文示例)。
  3. 需要登录或验证码时,自己接管完成输入,再交回 Agent 继续在已认证页面工作。

适用场景与注意

适合谁:需要在 DSH 工作流里做真实网页交互的开发者——查阅需登录的文档、填表、多标签操作,且希望登录态在人与 Agent 之间无缝传递。

安全与权限:浏览器拥有独立于 DSH 沙箱的完整网络能力;README 要求将 browser_* 视作与 shell 同级权限。Profile 目录权限为 0700,可用工具栏 Clear profile 删除;CDP 绑定随机本机回环端口且不对外通告。Host 以 root 运行时 Chromium 使用 --no-sandbox 才能启动,隔离边界主要在 Profile 目录而非渲染器沙箱。

已知限制(README):仅 Chromium;Host 重启后历史与未保存表单不保留(persistentProfile 开启时 Cookie 保留);不支持 Firefox/WebKit;镜像为 JPEG,文本清晰度受 quality 影响;模态对话框会自动接受且无法在镜像中展示。

安装前请自行阅读 GitHub 仓库 源码与 MIT 许可证;插件在 DSH Host 进程权限下运行,社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-browser 用真实 Chromium、CDP 串流与租约式人机交接,把「Agent 能浏览」和「人能登录」放在同一 Profile 里解决,而不是在模型上下文里重演网页。

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

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

小夜