dsh-proxy-switcher:运行中热切换出站代理

前言

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 的路径。

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 仍指向该目录即可。

典型用法

  1. 按上文完成安装并重载 loader,打开 Settings → Proxy。
  2. 若本机已设 http_proxy,可选 System;改 shell 环境变量后点 Re-read env & apply。
  3. 点 Add proxy 填写 HTTP/HTTPS/SOCKS5 代理,Test this proxy 通过后 Save and apply;在列表中单选即可热切换。
  4. 临时直连调试:模式选 Direct,或命令行 /proxy direct;恢复系统代理可用 /proxy system 或 /proxy on。
  5. 查看状态:/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、配置示例与限制说明后再安装。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye