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
羽毛球分组比赛记分
小程序二维码

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

小夜