前言¶
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. 優先級規則¶
路由匹配按以下順序進行:
- provider-pinned 精確模型
- 精確模型(不限定 provider)
- provider-pinned 前綴模型(帶
*) - 前綴模型(不限定 provider)
- provider host 規則
- 默認路由(
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 配置簡潔的同時,滿足多樣化的網絡策略需求。