前言¶
在 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 推給對話模型。