dsh-provider-proxy:按模型和提供商路由代理

前言

DeepSeek Harness(DSH)在啓動一個進程時只能應用一條代理策略(通過 HTTP_PROXY / HTTPS_PROXY / NO_PROXY / ALL_PROXY 環境變量)。當同一個進程需要針對不同模型、不同提供商使用不同代理,或者需要將部分流量直連時,原有機制無法滿足需求。dsh-provider-proxy 在此之上增加兩層路由軸,支持按提供商和模型分別配置代理出口。

插件定位

  • 插件名稱:apolenkov/dsh-provider-proxy
  • 維護者:apolenkov
  • 分類:模型推理
  • 核心能力:在 DSH 進程代理策略之上,疊加按提供商和模型粒度的路由,並通過 UI 可視化配置

核心功能

1. 兩層路由軸

插件在 DSH 的 undici fetch 層之上插入 RoutingDispatcher,根據請求上下文匹配兩條路由軸:

  • Host 軸(providers):匹配請求 URL 的主機(支持精確匹配、子域名、可選 host:port)。該規則影響所有 fetch() 調用,包括 LLM 推理、網頁搜索、MCP 等。
  • Model 軸(models):匹配發起請求的 provider/model 對。支持精確 ID 和帶 * 的前綴匹配,並可顯式綁定到某個 provider。

2. 優先級規則

路由匹配按以下順序進行:

  1. provider-pinned 精確模型
  2. 精確模型(不限定 provider)
  3. provider-pinned 前綴模型(帶 *)
  4. 前綴模型(不限定 provider)
  5. provider host 規則
  6. 默認路由(inherit 或 direct)

3. 代理值說明

值 含義
inherit 繼承進程的代理策略(環境變量 + NO_PROXY)
direct 直連目標,忽略進程的代理策略
http(s)://… 通過指定代理(使用 ProxyAgent)

UI 會拒絕包含憑證的代理 URL,建議使用無憑證的代理端點。

安裝與啓用

安裝前需確保 DSH profile 已啓用插件管理器(桌面應用和 dsh web 均可)。

從 npm 安裝(推薦):

dsh plugin --profile <profile> add @apolenkov/dsh-provider-proxy

從 git 安裝(使用 release 標籤):

dsh plugin --profile <profile> add git+https://github.com/apolenkov/dsh-provider-proxy.git#v0.1.0

從本地目錄安裝:

dsh plugin --profile <profile> add /absolute/path/to/dsh-provider-proxy

安裝後重啓 DSH。插件會在插件列表中插入 provider-proxy 行,路由配置位於該行的“配置”頁面。

典型用法

在 UI 中配置

打開側邊欄 Plugins → 打開 dsh-provider-proxy bundle → Configure。頁面包含:

  • Default route:默認路由(inherit 或 direct)
  • Provider rules:label、hosts(逗號或換行分隔)、代理值
  • Model rules:模型 ID(精確或帶 *)、可選 provider 綁定、代理值

編輯後點擊 Save,支持版本衝突檢測:如果配置在保存時被他人修改,保存會被拒絕而不是靜默覆蓋。清除表單不會寫入任何內容,離開頁面則放棄已暫存的編輯。

在 YAML 中配置

在 profile 的 cordis.patch.yml 中添加或修改行:

- id: provider-proxy
  name: "dsh-provider-proxy"
  config:
    default: inherit
    providers:
      corp:
        hosts: ["llm.internal.example"]
        proxy: direct
      opencode-go:
        hosts: ["opencode.ai"]
        proxy: "http://127.0.0.1:1301"
    models:
      "muse-spark-1.3-contributor":
        provider: opencode-go
        proxy: "http://127.0.0.1:1301"
      "longcat-*": inherit

YAML 中的無效條目會導致整個配置拒絕(fail-closed),插件會記錄原因並保留之前的路由。

驗證路由生效

插件將最近一次應用結果寫入 $DSH_HOME/provider-proxy/state.json:

{
  "appliedAt": "2026-10-22T07:59:22Z",
  "pid": 42120,
  "status": "active",
  "routes": "muse-spark-1.3-contributor→http://127.0.0.1:1301, llm.internal.example→direct, default→inherit"
}

可以將規則指向一個不存在的代理(如 http://127.0.0.1:9),觀察請求失敗並返回 ECONNREFUSED,隨後恢復真實代理即可驗證。

限制與注意事項

  • WebSocket 傳輸不一定保證經過 undici dispatcher,嚴格路由建議使用 http/https 傳輸。
  • web_fetch 可能會通過 launcher 的策略繞過這些路由,插件主要覆蓋模型流量。
  • Model 規則僅作用於 llm/stream 內部;網頁搜索和 MCP 使用 host 軸。
  • Model 規則不會對非模型流量觸發;host 規則不會覆蓋 localhost / loopback。
  • 代理 URL 中包含憑證時,transport 層可能接受,但 UI 會拒絕,建議使用無憑證端點。

適用場景

  • 需要爲不同模型走不同代理的 DSH 場景。
  • 需要將部分內部 host 直連、外部 host 通過代理的場景。
  • 在多模型、多 provider 的複雜配置中,希望避免爲每個模型單獨設置環境變量的場景。

安裝前建議檢查源碼與許可證(MIT)。

總結

dsh-provider-proxy 在 DSH 進程級代理策略之上提供了更細粒度的路由控制,支持按 provider 和 model 兩軸配置,並通過 UI 與 YAML 兩種方式管理。適合需要精細控制模型代理出口的場景,便於在保持 DSH 配置簡潔的同時,滿足多樣化的網絡策略需求。

插件目錄頁 | GitHub

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

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

小夜