dsh-engine-switch:在 DSH 進程內用統一網關切換本地、桌面與遠程引擎

前言

DeepSeek Harness(DSH)可以在本機、家裏電腦或雲服務器上分別跑一套「引擎」——各自有獨立的配置目錄與會話。移動端或 Web 端若每次切換都要改 APK、改 WebView 指向的 origin,往往會牽動 Host/Origin 校驗、Cookie 與 JS 橋的信任邊界。

dsh-engine-switch 把「本地引擎 / 多臺電腦引擎 / 服務器引擎」的切換做成 DSH 插件:在 DSH 進程內起一個獨立網關,瀏覽器或 App WebView 始終只連同一個 loopback 地址;切引擎只換上游,不改 DSH 自身的安全模型。

這是什麼

維護者 Benson-Cao,倉庫 Benson-Cao/dsh-engine-switch,分類爲客戶端插件。插件在進程內默認監聽 127.0.0.1:3082,同時承擔引擎註冊表、切換頁與反向代理三項職責;HTTP、SSE、WebSocket 全透傳到當前選中的引擎。

典型用法:手機上的 DSH 安裝本插件作爲統一入口;家裏臺式機、公司電腦、雲服務器上跑的 dsh web 登記進列表,在手機側隨時切換,各引擎會話各自留在對應機器上。

核心能力

下面三項能力由同一網關進程提供。

引擎註冊表:三類端點持久化在 $DSH_HOME/engine-switch/engines.json。

切換頁:獨立路由 http://127.0.0.1:3082/__switch/,手機瀏覽器可添加到主屏幕。

反向代理:/ 及其它路徑轉發到當前選中引擎;面板內切換隻改網關上游,不替換當前會話頁面。

DSH 左側欄會出現與「插件」「自動化任務」同排的「引擎」入口,在主區完成登記、刪除、切換與探測,主題跟隨宿主深淺色。桌面端通過宿主掛載的 /engine-switch/api/… 同源訪問;手機瀏覽器或經網關打開的頁面則打當前 origin 的 /api/engines。

網關提供 JSON API(設了 token 時每個請求需帶憑證):

方法 路徑 說明
GET /api/engines 列表 + 當前 id + 當前上游
POST /api/engines 添加 {label, url, kind},kind 爲 pc / server
DELETE /api/engines/:id 刪除(至少保留一個)
POST /api/engines/switch 切換 {id},即時生效
GET /api/engines/probe 逐個探測可達性

登記示例:

  • 本機:默認指向 selfUrl(默認 http://127.0.0.1:3080)
  • 電腦:dsh web --host 192.168.1.10 後登記 http://192.168.1.10:3080
  • 服務器:VPS 上 dsh --profile web 並經 Caddy/Nginx 反代與正式證書後,登記 https://dsh.example.com

插件不遷移會話:每個引擎有獨立 $DSH_HOME 與會話日誌,切換隻換執行者。

環境與依賴

需要 Node.js ^22.19.0 || >=24.0.0,以及已安裝的 DeepSeek Harness。bundle 按 0.2.2-rc.1 規範編寫;README 記載在 0.2.1-rc.5 上已完成端到端實測。當前包版本爲 0.2.2,許可證 MIT。

安裝與啓用

Web profile(最常用)

在 PC 或常規 Web 環境下,用官方文檔中的命令安裝並啓動:

dsh plugin --profile web add github:Benson-Cao/dsh-engine-switch
dsh --profile web

本地源碼調試時:

dsh plugin --profile es-test add ./dsh-engine-switch
dsh --profile es-test --dump-config     # 應能看到 dsh-engine-switch 這一行
dsh --profile es-test

桌面版在「插件」頁安裝後,需完全退出並重開 DSH(bundle 需進程重啓才掛載)。啓動日誌出現 [dsh-engine-switch] ready on http://127.0.0.1:3082/ 即表示網關已就緒。

手機 App(com.dsh.harness)

不要在 App 插件頁直接填 GitHub 倉庫 URL:Termux 運行時無 git,dsh plugin add 經 pnpm 解析 Git URL 會失敗(ERR_PNPM_GIT_RESOLVE_FAILED),App 可能誤報爲權限問題。可行路徑是 PC 側 npm pack 後經 adb push 到設備,再在設備上用本地路徑執行 plugin --profile web add;README 中有完整的環境變量與路徑說明。安裝後同樣需重啓 DSH 服務。

配置

cordis.patch.yml 中 config 爲整行替換,缺省字段走代碼默認值:

- insert:
    - id: dsh-engine-switch
      name: dsh-engine-switch
      config:
        host: 127.0.0.1     # 只綁 loopback;改成 0.0.0.0 必須同時設 token
        port: 3082
        selfUrl: http://127.0.0.1:3080   # 本機 DSH 的地址
        token: ''            # 非空時所有請求需帶 ?token= 或 Authorization: Bearer
        allowSelfSigned: true

host 非 loopback 且未設 token 時插件會拒絕啓動——網關反代的是具備讀寫與執行能力的 Agent,不宜在無認證情況下暴露在局域網。

使用入口與地址

地址 作用
DSH 左側欄「引擎」 應用內切換面板
http://127.0.0.1:3082/__switch/ 獨立切換頁,可加主屏幕
http://127.0.0.1:3082/ 當前引擎 DSH 主界面(反代)

若需改端口或指向其它網關實例,可在頁面設置 window.__DSH_ENGINE_SWITCH__ = 'http://127.0.0.1:<端口>'。

適用場景與注意

適合需要在多臺 DSH 引擎之間頻繁切換、又希望客戶端始終連固定 loopback 入口的開發者。插件以當前 dsh 進程權限運行,安裝前應自行審閱 源碼 與 MIT 許可證。

需注意:

  • 遠程引擎若使用配對型網關(例如私有 CA + token),本插件不代爲完成該層握手;應登記裸 dsh web 或已完成認證的 HTTPS 反代地址。
  • com.dsh.harness 的原生「引擎」切換器改的是 WebView 的 origin;本插件改的是網關上游。README 明確不建議把 WebView 直接指到 127.0.0.1:3082 以免繞過 Android 橋的信任門控;更穩妥的分工是手機用 App 原生切換器,插件裝在電腦或 Web profile。
  • DSH 處於 developer preview,上游 API 可能有破壞性變更。

社區目錄 skillhub.cn 插件頁 與 GitHub 爲獨立信息來源,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-engine-switch 用插件替代改 APK 的多引擎切換:一個 loopback 網關、一份 engines.json、側欄或 __switch/ 頁面即可完成登記與切換。需要安裝命令與手機側細節時,以倉庫 README 爲準。

  • 目錄頁:https://www.skillhub.cn/plugins/Benson-Cao/dsh-engine-switch
  • GitHub:https://github.com/Benson-Cao/dsh-engine-switch
羽毛球分组比赛记分
小程序二维码

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

小夜