前言¶
DeepSeek Harness(dsh)里大量能力依赖出站 HTTP:LLM 对话、网页搜索、web_fetch、模型发现、MCP over HTTP 等,最终都走宿主进程的全局 fetch。在 Node 侧,代理通常由 NODE_USE_ENV_PROXY 与 HTTP(S)_PROXY 决定,且这一选择在进程内往往只在启动时解析一次——启动后再改 process.env.HTTP_PROXY 通常无效。过去若要换代理,常见做法是改环境变量或配置后重启 dsh。下面介绍社区插件 dsh-proxy-switcher(维护者 JinSuperOfficial,分类:联网工具),它把「用哪个代理」从启动时决定改为请求时决定,在 dsh 设置 → Proxy 中切换直连、系统代理或已保存的自定义代理,改完立即生效,无需重启 dsh。
这是什么¶
dsh-proxy-switcher 是一款为 dsh 打造的代理热切换 Cordis 插件。它支持 HTTP、HTTPS、SOCKS5(含 socks5h),可在设置界面或通过命令、API 实时切换出站策略,并覆盖所有走全局 fetch 的路径。
- 目录页:https://www.skillhub.cn/plugins/JinSuperOfficial/dsh-proxy-switcher
- 源码与文档:https://github.com/JinSuperOfficial/dsh-proxy-switcher
- 许可证:MIT(见仓库
package.json) - 对 dsh 版本要求:
>=0.2.0-rc.1(可自动复用@deepseek-ai/dsh-http-proxy;更早版本走插件自建路径)
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装第三方插件前,建议自行阅读源码与许可证,并理解插件与 dsh 同进程运行、权限与宿主一致。
它解决什么问题¶
dsh 出站请求背后的代理若在进程启动后无法通过简单改环境变量生效,换网络环境或调试代理时只能重启。本插件通过替换 Node 内置 fetch 使用的 undici 全局 dispatcher(setGlobalDispatcher 写入的全局槽位),在运行中安装新的传输策略;切换时对旧 dispatcher 调用 close(),在途请求可在旧连接上完成,新请求走新策略。
在 dsh 0.2.x 上,插件优先委托官方 seam @deepseek-ai/dsh-http-proxy 的 installProxyFromEnvironment,使 undici 全局 dispatcher、proxyRouteFor()(影响 dsh-web-fetch-http 是否 pin 地址)与子进程继承的代理环境变量保持一致。SOCKS5 因官方模块按设计不支持,由插件自行安装全局 dispatcher。
核心功能¶
三种模式与多代理配置¶
- Direct:直连。
- System:跟随系统/环境中的
http_proxy等(策略为快照;修改环境变量后需在设置页点 Re-read env & apply,或执行/proxy on,无需重启)。 - Custom:从已保存的多条代理中单选切换;编辑器支持协议、主机、端口、用户名、密码(掩码)、密码来自环境变量
passwordEnv、每条代理独立的no_proxy。
设置页 Settings → Proxy 提供当前生效状态、模式开关、保存的代理列表(Test / Edit / Add)、高级项(全局 no_proxy、探测 URL、超时、代理缺失时拒绝或直连、连续失败自动回退)、近期活动(脱敏),以及 Save and apply、Test current、Re-read env & apply 等操作。列表与模式的一键切换会立即生效并保存;编辑器内改动需 Save and apply。
其它入口¶
/proxy命令:status、on、off、direct、system、use <id>、temp <id>、test [id]等。- 插件 API(供其它 Cordis 插件):
ctx.proxySwitcher.status()、config()、configure(patch)、applyRuntime(patch)、reset()、test(candidate)。 - HTTP(设置页使用,同源校验):
GET/POST于/dsh-proxy-switcher/*(如state、status、apply、reset、reapply、test)。
配置与优先级¶
默认配置文件:$DSH_HOME/proxy-switcher.json,可用环境变量 DSH_PROXY_SWITCHER_CONFIG 覆盖。字段包括 enabled、mode(direct|system|custom)、activeProfile、profiles[]、noProxy、probeUrl、timeoutMs、onMissingProfile(默认 block)、fallback 等;示例见仓库 config.example.json。
优先级(高到低):
运行时设置(设置页 / /proxy / API) > 环境变量 > 配置文件 > 默认值
常用环境变量:DSH_PROXY_SWITCHER_ENABLED、DSH_PROXY_SWITCHER_MODE、DSH_PROXY_SWITCHER_PROFILE、DSH_PROXY_SWITCHER_URL、DSH_PROXY_SWITCHER_NO_PROXY 等(详见 README 表格)。
安全与兼容¶
密码不在 API 中明文回传浏览器;日志与状态经 redactProxyUrl() 脱敏。推荐用 passwordEnv 避免密码落盘。HTTP 接口做同源与 loopback 校验。
- 运行时:Node 22.19+ / 24+(README 记载 Electron 44 ↔ Node 24.18.1 等实测)。
- 代理协议:http、https、socks5 / socks5h。
- 操作系统:实现依赖
node:net/node:tls/undici,无平台专属代码;Windows 有实测记录。
安装与启用¶
仓库提供 PowerShell 安装脚本(备份 profile 的 package.json、在 <profile>/node_modules/ 建立指向插件目录的 junction、写入 dependencies 与 dsh.profile.bundles;不跑 pnpm、不联网、不改 lockfile):
pwsh -File install.ps1 # 默认 desktop profile
pwsh -File install.ps1 -Profile web
也可使用 dsh 官方安装器(需指向本机上的插件目录):
dsh plugin --profile desktop add link:<本目录>
安装后需让 dsh 重新加载 loader,插件才会出现在 设置 → Proxy;在此之前仅为磁盘上的文件,不影响行为。
卸载:
pwsh -File uninstall.ps1 # 删 junction + 撤销 package.json 改动
pwsh -File uninstall.ps1 -RestoreBackup # 另外还原安装前的 package.json
卸载时插件会还原启动时的 dispatcher 与代理环境变量。若要清除已保存代理配置,可删除 $DSH_HOME/proxy-switcher.json。升级可覆盖插件目录后重载 loader;junction 仍指向该目录即可。
典型用法¶
- 按上文完成安装并重载 loader,打开 Settings → Proxy。
- 若本机已设
http_proxy,可选 System;改 shell 环境变量后点 Re-read env & apply。 - 点 Add proxy 填写 HTTP/HTTPS/SOCKS5 代理,Test this proxy 通过后 Save and apply;在列表中单选即可热切换。
- 临时直连调试:模式选 Direct,或命令行
/proxy direct;恢复系统代理可用/proxy system或/proxy on。 - 查看状态:
/proxy status,或(同源)GET /dsh-proxy-switcher/status。
仓库 README 记载:loader 重载后无需整进程重启;POST /apply 带 persist:false 可在当前进程内临时改模式(不写入文件)。
适用场景与已知限制¶
适合:需要在同一 dsh 会话里切换公司网/家庭网/本地 Clash 等代理;调试 LLM、搜索、web_fetch 出站路径;保存多条代理并一键 Test。
务必注意:
- 插件与 dsh 同进程,安装前请审阅源码与 MIT 许可证。
- OTLP 遥测不走代理(可用
DSH_TELEMETRY_MODE=DISABLED关闭遥测)。 - SOCKS5 下
web_fetch可能直连(与dsh-http-proxy/proxyRouteFor()设计有关);LLM、搜索等在 SOCKS5 下仍可按 README 说明走代理。 system模式不是每个请求重读环境变量,需手动 Re-read env & apply。- 模型自编程序 / worker intentionally 拿不到代理(dsh 设计,避免泄露带密码的代理 URL)。
onMissingProfile默认为block,避免误以为已走代理却静默直连。
本地跑测试(不联网、使用假代理):
pwsh -File test/run-tests.ps1
结尾¶
dsh-proxy-switcher 针对 dsh 出站代理「只能重启才生效」的约束,通过 undici 全局 dispatcher 与官方 dsh-http-proxy seam(在可用时)实现运行中切换直连、系统代理与多条自定义代理,设置页与 /proxy、API 均可操作。若你经常在 DSH 里调试联网能力,可在 SkillHub 目录页查看简介,并在 GitHub 阅读完整 README、配置示例与限制说明后再安装。