dsh-openjev-browser:用 OpenJev 做模型驱动浏览器操控,agent 不碰 DOM

前言

在 DSH 里让 agent 操作网页,常见做法是整页 DOM、可访问性树或大块 HTML 塞进上下文。页面一复杂,token 开销和噪声都会上来,模型还容易在无关节点里迷路。openjev-browser 的 MCP stdio 版已经用本地决策模型把「该点哪个元素」收成单条结构化结果;dsh-openjev-browser 是其原生 DSH(cordis)插件移植,工具名与参数 schema 与 Python MCP server 一致,迁移时只需去掉 mcp__openjev-browser__ 前缀。维护者为 belowthetree,分类属于模型推理,当前 GitHub 星标为 0。

这是什么

一句话:dsh-openjev-browser 是以极小上下文开销实现模型驱动浏览器操控的 DSH 插件。本地 OpenJev-4B 决策模型读取页面后只返回完成自然语言目标所需的那一个元素,agent 全程不接触 DOM。浏览器侧基于 playwright-core,插件版本 0.1.0,许可证 MIT。

核心功能

插件向 DSH 注册一组浏览器工具,用途如下。

工具 用途
browser_open 打开 URL(auto / chrome / msedge / chromium,可复用已有浏览器配置)
browser_pick 让 OpenJev 判断哪个元素能完成自然语言目标
browser_click 按目标或 CSS 选择器点击
browser_type 向按目标或选择器选中的元素输入文本
browser_text 读取页面或单个元素的有界文本片段
browser_scroll 滚动页面,或将某元素滚入视口
browser_screenshot 返回页面截图(可选目标元素高亮框)
browser_status 报告模型/服务检测状态与部署指引
browser_close 关闭浏览器会话

没有可用模型时,目标驱动类工具(browser_pick,以及 click/type/text/scroll/screenshot 的 goal 路径)会软失败并返回结构化部署指引;纯 CSS 选择器调用不依赖模型,始终可用。

当当前模型路由接受图像输入时(经 llm.resolveModelInfo 检查),browser_screenshot 会内联返回图片;否则降级为元数据文本并附 [image unavailable: ...],可改用 path 参数把文件存盘。

客户端注册「OpenJev 浏览器」设置分区,由仅监听回环地址的 API /dsh-openjev-browser/api 支撑;面板保存的值写入 $DSH_HOME/dsh-openjev-browser.settings.json 并立即生效,无需重启 DSH。

安装与启用

下面介绍从源码构建并注册到 DSH 的步骤。资料未给出 dsh plugin add github:... 一类一键安装命令,请以 README 为准。

1、克隆或取得插件源码后,在插件目录安装依赖并构建(沙箱内若脚本受限,可加 --ignore-scripts):

pnpm install   # 沙箱内可用: pnpm install --ignore-scripts
pnpm build     # tsc(宿主侧) + esbuild(客户端) -> lib/

2、把构建产物目录注册到 DSH,在 cordis.patch.yml 中增加:

- insert:
  - id: dsh-openjev-browser
    name: dsh-openjev-browser

可选配置项(示例值为默认值)可写在同一 insert 下的 config 中,例如:

- insert:
  - id: dsh-openjev-browser
    name: dsh-openjev-browser
    config:
      openjevUrl: http://127.0.0.1:8080
      modelDir: null
      pythonPath: null
      autoStartServer: true
      serverPort: 8080
      serverStartupTimeoutMs: 240000
      browser: auto
      headed: false
      userDataDir: null
      maxCandidates: 80
      includeOffscreen: true
      maxNameLength: 90
      viewport: [1280, 900]
      timeoutMs: 30000
      debugDir: null

配置优先级为:内置默认值 < loader patch 配置 < 设置文件;删掉设置文件即回退到 patch 配置。

模型部署

插件不附带模型权重,也不附带 Python 运行时,需自行部署。设置面板「部署指引」卡片内有可复制的 agent 提示词:粘贴到任意 DSH 会话后,agent 可完成 Python 环境、模型与冒烟自检,并回报需填入的两个路径。详细规范见仓库内 docs/DEPLOYMENT.md。

部署完成后,插件按顺序检测:

  1. openjevUrl(默认 http://127.0.0.1:8080)上是否已有决策服务;
  2. 本地工件(config.modelDir、$OPENJEV_ARTIFACT、$OPENJEV_MODEL、~/.openjev/models/OpenJev-4B、~/.dsh/openjev/models/OpenJev-4B),按 manifest.json 与 COMPLETE 校验;
  3. 装有 openjev 包的 Python 解释器(顺序:config.pythonPath → $OPENJEV_PYTHON → PATH 上的 python)。满足 2+3 时,首次使用可自动拉起 python -m openjev.runtime.server。

资料记载的 agent 辅助部署流程大致为:在 DSH 会话工作区之外创建 Python 3.12 环境(默认 %USERPROFILE%\.dsh\openjev\runtime);用 uv pip install 安装 torch 与 openjev[serve] @ git+https://github.com/ejhshen/OpenJev.git(PyPI 上 openjev 包名被占用,必须走 git);下载 Hugging Face 仓库 shenjunhao/OpenJev-4B(约 8 GB)并校验工件;冒烟 python -m openjev.runtime.server --artifact <dir> 直至 /health 为 ready;将 Python 路径与模型目录填入设置面板。

事后可用 CLI 探测:

node lib/setup.js detect          # 探测服务 / 工件 / python
node lib/setup.js print-config    # 输出 cordis.patch.yml 配置片段

Windows 沙箱下,插件为 Python 子进程重定向 TMP/TEMP/TMPDIR/TORCHINDUCTOR_CACHE_DIR 到 $DSH_HOME/openjev/tmp,避免 torch inductor 报临时目录不可用;若 pythonPath 指向工作区内解释器且不可写,会回退到解释器旁的 .openjev-tmp/。

典型用法

在 DSH 会话中,agent 通过上述工具名调用即可,语义与 MCP 版一致。常见流程可以是:

  1. browser_open 打开目标 URL;
  2. 用自然语言目标调用 browser_pick 或带 goal 的 browser_click / browser_type;
  3. 需要确认页面文字时用 browser_text,需要视觉证据时用 browser_screenshot;
  4. 不确定环境是否就绪时先调 browser_status;
  5. 结束时 browser_close。

若已从 MCP 迁移,把原 mcp__openjev-browser__browser_* 改为 browser_* 并保持参数不变即可。

开发侧冒烟(mock 上下文,注册工具并打开 about:blank):

pnpm typecheck
node scripts/smoke.mjs

适用场景与注意

适合需要在 DSH 内做网页自动化、又希望控制上下文体积、让「选元素」交给本地 OpenJev 而非整页 DOM 的开发者。纯选择器驱动的点击、输入不依赖模型,适合已知稳定 DOM 的脚本化步骤;自然语言目标依赖已部署的 OpenJev 服务或本地工件与 Python 环境。

安装前请自行阅读 GitHub 源码与 MIT 许可证。DSH 插件以当前 dsh 进程权限运行,浏览器可配置 userDataDir 复用登录态,涉及账号与隐私页面时需评估风险。首次拉起决策服务时,serverStartupTimeoutMs 默认 240000 ms,资料提到首次 Triton JIT 可能需数分钟。社区目录站点与 DeepSeek / 幻方无官方从属关系,本插件为社区维护的 cordis 插件。

链接

  • 社区目录页:https://www.skillhub.cn/plugins/belowthetree/dsh-openjev-browser
  • GitHub:https://github.com/belowthetree/dsh-openjev-browser

经过上面的步骤,你可以在 DSH 里用与 MCP 对齐的工具面做模型驱动浏览,并把页面理解留在本地 OpenJev,而不是把 DOM 推给对话模型。

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

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

小夜