前言¶
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、配置示例與限制說明後再安裝。