dsh-browser-harness:让 DSH Agent 用 Python 驱动真实 Chrome

前言

在 DSH(DeepSeek Harness)里做联网或表单类任务时,常见做法是再套一层「浏览器 Agent」:多一个 LLM、多一套 API key,步骤还往往藏在黑盒里。若你希望 DSH 自己的 agent 就是大脑——写出的 Python 留在会话历史里、可读可审计——就需要把浏览器控制面直接注册成会话工具。

dsh-browser-harness(维护者 chaserchan)做的是这件事:把 browser-use 的 Browser Harness 接到 DSH,让 agent 通过 browser_run 执行 Python,在本地驱动真实 Chrome(导航、点击、填表、无障碍树、JS/CDP、截图)。不需要额外的 LLM,也不需要 API key(Autopilot 除外,见后文)。插件在 SkillHub 分类为「联网工具」,仓库 chaserchan/dsh-browser-harness,许可 MIT。

这是什么

Browser Harness 不是「又一个 LLM agent」,而是给 coding agent 用的浏览器控制面。DSH agent 写每一行 Python,Harness 在 Chrome 上执行;状态主要落在 daemon 附着的那块标签页上,而不是跨次调用的 Python 进程变量里。

插件当前版本 0.4.4(以 package.json 为准),面向 web profile 的 DSH(engines.dsh 要求 >=0.1.0-rc.6 <0.2.0,Node >=22.13)。

核心功能

会话工具

工具 作用
browser_run({ code, timeoutMs?, lane? }) 把一段 Python 交给 Harness 执行;print() 输出即返回值;返回 {ok, exitCode, stdout, stderr, hint}。ok=false 时先读 hint。
browser_status({}) 体检:命令解析来源、模式、BU_NAME/CDP、doctor、autopilot 状态;browser_run 报错时先调它。
browser_autopilot({ url, goal, lane? }) 目标式自动化;仅配置了 TypeSafe API Key 时可用(未配置时工具拒绝,且系统提示词不注入该工具)。

插件还会把 函数速查表与操作纪律 注入系统提示词,agent 知道 Harness 侧有哪些函数、哪些不存在。

人机协同(0.2.0 起)

典型场景:开发者账号申请、平台注册、复杂表单——agent 能填的自动填,登录/验证码/扫码等交还用户。

流程概括:

agent:打开页面 → show_tab() 让你看到 → form_fields() 摸清表单 → 普通字段自动填
agent:遇到登录/验证码/扫码/支付 → show_tab() + 说明「这步你来」
你:  在浏览器里完成
agent:wait_url_change() 检测跳转 → 继续 → page_brief() 汇报

每个 browser_run 会自动注入 helper(零 import 直调),例如:

ax_list()            # 可交互元素 [{role,name,cx,cy}]
ax_click(role=None, text=None)
form_fields()
fill_field(字段名, 值)
show_tab()
wait_url_change(旧url)
page_brief()         # {url,title,elements,text}

人机协同需要 看得到 Chrome:默认 dedicated(有头专用浏览器)即可,agent 与你在同一标签页交替操作。

多会话并发:lane 车道(0.3.0 起)

多个 DSH 会话共用一个 harness daemon 会抢「当前 tab」。0.3.0 起可为 browser_run 指定 lane:每个 lane = 独立具名 daemon(BU_NAME=<buPrefix>-<lane>)+ 持久专属标签页,跨 lane 可真并行,同一 lane 内调用串行。

browser_run({ code, lane: "apple" })   # 任务 A
browser_run({ code, lane: "router" })  # 任务 B,与 A 并行

单任务可不传 lane(按会话隔离);多任务并行时为每个并行任务固定 lane 名,同一任务始终带同一 lane。调试可用 browser_status({}) 的 lanes.active,或 browser_run({ code: 'print(list_tabs())', lane: 'apple' }) 查看某车道 tab。

Autopilot(0.4.0,条件启用)

配置 TypeSafe API Key 后,可用 Jev(TypeSafe 开源的 System One 浏览器模型,非 LLM)做目标式自动化:

browser_autopilot({ url: "https://...", goal: "完成开发者账号注册并进入控制台" })

没配 key:工具直接拒绝,模型甚至看不到该工具。配了 key:settings 热加载即可用。执行还需本机安装 jev-ultrafast,并在插件 config 中设置 autopilotCommand(例如 'uvx jev-ultrafast')。Key 也可通过环境变量 TYPESAFE_API_KEY / TEXT_MODEL_API_KEY(设置面板优先)。

安装与启用

1. 安装 Harness CLI(前置)

uv tool install browser-use      # 完整版(含 agent 库,依赖较多)
# 或更轻的等价物(推荐):
uv tool install browser-harness  # 同一份 harness,依赖只有 4~5 个纯 Python 包

装完建议立刻关闭 Harness 默认遥测(stdout 尾部最多 20KB 会上报):

browser-use telemetry disable

2. 安装 DSH 插件

dsh plugin --profile web add dsh-browser-harness

或从本地路径:

dsh plugin --profile web add file:/path/to/dsh-browser-harness

装完后 dsh --profile web --dump-config 中应出现:

- id: browser-harness
  name: dsh-browser-harness

配置要点

在 profile 的 cordis.patch.yml 里用 id 定向覆盖(不要 - insert:):

- id: browser-harness
  config:
    mode: dedicated            # dedicated(默认)| system
    command: browser-use       # 或 browser-harness,或绝对路径
    timeoutMs: 120000
    cdpPort: 9334
    chromeArgs: ['--proxy-server=http://127.0.0.1:7890']   # 需要代理时
键 默认 说明
mode dedicated 自起专用 Chrome,与日常浏览器隔离;system 附着正在用的 Chrome
command 自动解析 Harness 可执行文件;建议显式配置(见「已知陷阱」)
buName dsh-browser 具名 daemon 的后台 tab
cdpUrl / cdpPort 空 / 9334 自带 CDP 时填 cdpUrl
userDataDir ~/.dsh-browser-profile dedicated 独立配置目录
chromeArgs [] 代理、窗口大小等
timeoutMs 120000 单次执行预算,上限 600000
restoreTab true 是否用 BU_NAME 独立后台 tab
autopilotCommand 空 jev 运行体命令

同配置也可用环境变量:DSH_BROWSER_USE_MODE / DSH_BROWSER_USE_BIN / DSH_BROWSER_USE_PORT / DSH_BROWSER_USE_PROFILE。

TypeSafe / Text Model Key 在 DSH 设置页 → 通用设置 → 浏览器自动化(本插件注册的配置区)。

典型用法

最小验证思路

  1. browser_status({}) 确认 command、commandSource、模式与 CDP。
  2. browser_run({ code: '...' }) 里写 Harness Python(如打开 URL、print 标题);输出在 stdout。
  3. 需要与用户交替操作时,在代码里调用 show_tab()、wait_url_change() 等 helper。
  4. 多会话并行时为各任务固定 lane 字符串。

具体 Harness API 以插件注入的速查表为准;README 中的 e2e 思路是「真机打开网页并把 title 打回来」(见仓库 node test/e2e.mjs)。

适用场景与注意

适合:需要在 DSH 会话里可复现地操作真实页面——抓信息、填表、半自动注册、与用户在同一 Chrome 标签上协同——且接受「agent 写 Python、Harness 执行」的架构。

权限与安全:browser_run 允许 agent 执行 任意 Python,是代码执行式设计的固有属性;插件不额外提权、不提供沙箱。只在你信任的环境使用;安装前请自行查看源码与 MIT 许可证。插件以当前 dsh 进程权限运行。

已知陷阱(README 原文要点):

  • PATH 上的 browser-use 可能是旧版原子 CLI(如 v0.12.3),不认 stdin Python 协议;报错时看 browser_status.command 与 commandSource,并建议显式设 config.command。
  • 插件已在用户代码前前置 ensure_daemon(),缓解冷启动超时。
  • 每次 browser_run 是新 Python 进程,变量不跨调用;持久状态在 tab。
  • 同一 daemon 只有一个当前 tab;无 lane 时插件内部串行排队。
  • dedicated 模式 Chrome 不继承系统代理;外网需 chromeArgs 配代理。

结尾

dsh-browser-harness 把 Browser Harness 注册为 DSH 工具,本地、无额外 LLM/API key 即可用 Python 驱动 Chrome;可选 TypeSafe key 启用 browser_autopilot。社区目录页:SkillHub - dsh-browser-harness;源码与完整说明:GitHub - chaserchan/dsh-browser-harness。

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

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

小夜