前言¶
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