前言¶
在 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)。
- 在工具栏点 Take control 接管浏览器。
- 完成后点 Done — hand back 交回 Agent。
- 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
典型用法¶
- 启动带 web profile 的 DSH 后,打开右侧边栏,选择 Browser,输入地址访问页面。
- 或在对话中让 Agent 操作,例如:
open example.com and tell me what the page says(README 原文示例)。 - 需要登录或验证码时,自己接管完成输入,再交回 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 里解决,而不是在模型上下文里重演网页。