dsh-proxy:按域名選路的 DSH 網絡代理插件

前言

在 DeepSeek Harness(DSH)裏跑智能體,模型 API 往往要跨公網訪問。常見做法是整機設 HTTP_PROXY,或指望 DSH 自帶的環境變量代理——請求要麼全走代理,要麼全直連,首字延遲裏還常常夾着每次新建的 CONNECT 隧道與 TLS 握手。下面介紹的 dsh-proxy(維護者 ycm50)是社區插件,目標不是「把流量塞進代理」,而是按域名決定每條請求走代理還是直連,並在會話內定格通道、複用連接,且不修改 DSH 官方源碼。插件目錄頁:skillhub.cn/plugins/ycm50/dsh-proxy;源碼與說明:github.com/ycm50/dsh-proxy(當前版本 0.7.0,MIT 許可證)。

這是什麼

dsh-proxy 在 DSH host 進程裏安裝進程級 undici dispatcher,並包裝 globalThis.fetch,用兩條自建通道(代理與直連)接管模型相關出站請求。卸載時會還原 dispatcher 與 fetch,並優雅關閉連接池。設置入口在 DSH 客戶端:設置面板 → 左側「HTTP 代理」,保存後下一次請求生效,一般無需重啓(「記錄嘗試日誌到文件」等同理)。

核心功能

強制名單 + 先直連、1 秒探測、通就定格

除內置豁免外,所有域名共用一套規則(0.7.0;早期「逐次輪換」已廢棄):

  1. 強制走代理的域名(及子域名):永遠走代理,不探測、不換道。
  2. 迴環 / 內網 / LAN(如 localhost、127.0.0.0/8、10/8、172.16/12、192.168/16、.local 等):永遠直連,任何配置改不動。
  3. 其它域名:第一次請求先直連,在 1000 ms(PROBE_TIMEOUT_MS)內拿到響應頭則本會話定格直連;超時則試代理(同樣 1 秒預算);代理仍不通則直連兜底一次;哪條通道先答上,該域名在本會話就定格在哪條通道。已定格通道之後若失敗,纔給另一條通道一次機會;慢不算失敗,不會因慢而輪換。

每個新會話(session/created)會清空按域名的記憶,因此每個會話的第一條外網請求仍會先走直連(強制名單除外)。

連接複用與超時

連接池空閒窗口爲 120 秒(POOLED_IDLE_WINDOW_MS),同一會話多輪對話可複用同一條(代理)隧道,減輕首字前的握手成本。README 中記錄的本機實測:新建代理隧道約 1.3–1.9 s,複用約 0.2–0.3 s。

設置裏可調建連超時(默認 60000 ms,不建議低於 30000)、響應頭超時、流空閒超時、連接重試次數與退避等;代理地址留空則插件不生效。

系統代理與子進程

可勾選「使用系統代理」,從 Windows / macOS / Linux 讀取本機代理並填入地址。開啓「插件安裝/更新也走代理」時,會把代理寫入子進程環境,讓 pnpm / git 等在安裝插件時也走代理;僅當代理地址爲 http/https 時生效。

診斷

  • 環境變量 DSH_PROXY_DEBUG=1:每次請求記錄通道、新建/複用連接、響應頭與首個 SSE 分片耗時。
  • 設置中打開「記錄嘗試日誌到文件」:嘗試與掛載/卸載事件追加到 <DSH_HOME>/dsh-proxy.log。

也可僅用環境變量指定代理地址(選路仍由名單與規則決定):

$env:DSH_HTTP_PROXY = 'socks5://127.0.0.1:7890'

變量名保持 DSH_HTTP_PROXY,與 DSH 自帶的 HTTP_PROXY / HTTPS_PROXY 互不影響。

兼容性

插件版本 需要的 DSH
0.7.0 ≥ 0.2.0-rc.1

更早版本策略與字段有差異;從 0.2.x(包名 dsh-http-proxy)升級需裝 dsh-proxy 並移除舊包,profile bundles 中的 id 改爲 dsh-proxy,設置需重新填寫。

安裝與啓用

官方安裝命令(lib/ 已提交,無需構建;裝完重啓一次 DSH):

dsh plugin --profile <profile名> add dsh-proxy@github:ycm50/dsh-proxy

本地 tarball 示例:

dsh plugin --profile <profile名> add dsh-proxy@file:/絕對路徑/dsh-proxy-0.3.0.tgz

README 註明尚未發佈到 npm;發佈後可用 dsh-proxy@<版本號> 形式安裝。

典型用法

  1. 在「HTTP 代理 → 連接」填寫 http / https / socks4 / socks4a / socks5 / socks5h 代理地址,或勾選「使用系統代理」。
  2. 若某站點直連極慢但代理正常,把域名寫入「強制走代理的域名」(逗號分隔,支持域名、端口、URL、.後綴)。
  3. 需要排查選路時,臨時打開日誌或 DSH_PROXY_DEBUG=1,對照 dsh-proxy.log 或控制台中的 attempt N via direct/proxy 行。

延遲對比可用倉庫內腳本(需網絡與代理,不參與默認測試):

node test/latency-bench.mjs --url https://api.opencode.ai/v1/models --proxy http://127.0.0.1:10808 --runs 3 --gap 15000

適用場景與注意

適合:需要在 DSH 內按域名分流、減少會話內重複握手、且希望不改官方代碼的開發者。

注意:

  • 插件以當前 dsh 進程權限運行,安裝前請自行審閱 源碼與許可證。
  • 1 秒探測以「拿到響應頭」爲準,超時 abort 後可能已在服務端產生請求;對可能重複計費的接口宜寫入強制名單,或關閉「可能已送達也重試」。
  • 請求體不可重放時不會設 1 秒預算也不會換道重發。
  • SkillHub 等爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-proxy 用「強制名單 + 直連/代理探測 + 會話定格 + 120 秒連接複用」把出站網絡從「全站一種走法」拆成可觀測、可配置的 per-host 策略,並保留完整卸載還原。進一步瞭解請查看 GitHub README 與 SkillHub 目錄頁。

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

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

小夜