前言¶
在 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。
部署完成后,插件按顺序检测:
openjevUrl(默认http://127.0.0.1:8080)上是否已有决策服务;- 本地工件(
config.modelDir、$OPENJEV_ARTIFACT、$OPENJEV_MODEL、~/.openjev/models/OpenJev-4B、~/.dsh/openjev/models/OpenJev-4B),按manifest.json与COMPLETE校验; - 装有
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 版一致。常见流程可以是:
browser_open打开目标 URL;- 用自然语言目标调用
browser_pick或带goal的browser_click/browser_type; - 需要确认页面文字时用
browser_text,需要视觉证据时用browser_screenshot; - 不确定环境是否就绪时先调
browser_status; - 结束时
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 推给对话模型。