dsh-llm-proxy-router:按 Provider 分流 LLM 請求的代理路由

前言

在 DeepSeek Harness(DSH)裏同時配置多家模型 Provider 時,網絡路徑往往不一致:Gemini、OpenRouter 等通常需要代理才能訪問,DeepSeek、Kimi、MiniMax、GLM 等在國內多能直連。若把 HTTPS_PROXY 寫進進程環境,代理會對所有出站 HTTPS 生效,直連 Provider 也會被繞進代理,延遲和失敗點都會增加;不設代理則境外 Provider 完全不可用。

下面介紹社區插件 dsh-llm-proxy-router(維護者 LostAbaddon,分類:聯網工具)。它把「是否走代理」改成按目標主機名逐條判定,規則可在 DSH 設置頁修改,保存後立即生效,無需重啓。

這是什麼

dsh-llm-proxy-router 是 DSH 的 bundle 插件:按 Provider 配置哪些 LLM 請求經 HTTP/HTTPS 代理發出,其餘保持直連。代理地址與規則寫在 $DSH_HOME/llm-proxy-router/config.json,不寫入 profile 的 patch 層,升級 DSH 一般不會沖掉用戶配置。

核心功能

路由判定順序

單次請求按下列順序判定,先命中先算:

  1. 路由總開關關閉 → 直連。
  2. 未填寫代理地址 → 直連。
  3. 目標爲本機(localhost、127.0.0.1、::1、*.local)→ 直連。
  4. 目標主機命中某條主機規則 → 走代理。
  5. 其餘 → 直連。

主機規則來自兩處,按順序拼接:

  • Provider 行:勾選「走代理」的 Provider 自帶一組主機名(例如 Gemini 對應 generativelanguage.googleapis.com,OpenRouter 對應 openrouter.ai 與 *.openrouter.ai)。每行可追加自定義主機名(內網網關、自建反代等)。
  • 額外主機規則:與 Provider 無關的獨立條目,支持 * 通配,可單條停用。

主機名支持精確匹配(如 api.openai.com)、子域通配(如 *.openrouter.ai,不匹配裸域)、全通配 *。

無論界面如何勾選,下列 Provider 永遠不會走代理:deepseek、deepseek-official、ollama、lmstudio。

設置頁

路徑:設置 → 模型 分組下的「LLM 代理路由」。

區域 作用
總開關 關閉後所有請求立即恢復直連,配置保留
代理地址 如 http://127.0.0.1:7890;省略協議時按 http:// 處理;支持 http://用戶:口令@主機:端口
測試代理 向代理發起真實 CONNECT 隧道握手並回報結果與耗時,不經過第三方探測服務
Provider 列表 逐行勾選是否走代理;顯示覆蓋的主機名,可追加自定義主機名
額外主機規則 獨立主機名條目
狀態行 當前生效的代理地址與規則條數

保存即落盤、立即生效。

實現要點(便於排查)

Host 側在進程的 globalThis.fetch 上安裝路由補丁,覆蓋 profile 內各模型適配器共用的出站路徑。命中代理規則時使用 undici 的 ProxyAgent 走 CONNECT 隧道;未命中則交回原始 fetch。插件卸載時補丁完整還原。

瀏覽器側爲自包含客戶端模塊,在 settings.section 槽位註冊設置頁,通過 /api/dsh-llm-proxy-router/* 讀寫配置。Host 暴露的接口包括:GET /state、POST /config、POST /test、POST /reset、POST /selftest、GET /diagnostics。

安裝與啓用

官方 README 給出的安裝方式:打包目錄本身即爲可安裝 bundle,使用 plugin_manager 安裝(將 <包目錄絕對路徑> 換爲插件目錄在本機的絕對路徑):

plugin_manager install_bundle <包目錄絕對路徑>

安裝後若 DSH 報告 restart-required,重啓一次 DSH 即可。bundle 的 patch 僅插入一行 Host 條目,不修改 profile 裏其它配置。

典型用法

在界面中配置

  1. 打開 設置 → 模型 → LLM 代理路由。
  2. 填寫代理地址(例如本地 Clash 的 http://127.0.0.1:7890)。
  3. 對需要翻牆的 Provider(如 Gemini、OpenRouter)勾選「走代理」;國內直連 Provider 保持不勾選(且 deepseek 等內置排除項本身不會走代理)。
  4. 若有自建反代或內網網關,在對應 Provider 行或「額外主機規則」中追加主機名。
  5. 使用「測試代理」確認隧道可用,保存配置。

配置文件示例

首次保存後,以 $DSH_HOME/llm-proxy-router/config.json 爲準。結構示例:

{
  "enabled": true,
  "proxyUrl": "http://127.0.0.1:7890",
  "providers": {
    "gemini": { "enabled": true, "extraHosts": [] },
    "openrouter": { "enabled": true, "extraHosts": ["openrouter.internal"] },
    "deepseek": { "enabled": false, "extraHosts": [] }
  },
  "hosts": [
    { "pattern": "*.openrouter.ai", "enabled": true, "note": "" }
  ]
}

適用場景與注意

適合誰:在 DSH 中混用境內外多家 LLM Provider,希望「該代理的走代理、該直連的直連」,且不想靠全局 HTTPS_PROXY 一刀切。

權限與安全:插件以當前 DSH 進程權限運行;安裝前請自行查看源碼與 MIT 許可證。走代理時隧道層對目標證書不做二次校驗(requestTls.rejectUnauthorized: false),便於配合私有 MITM 代理,也意味着該層不做證書校驗。

已知邊界(來自 README):

  • 判定依據是主機名,不是「哪家 Provider 發起的請求」。同進程內訪問規則內主機的任何請求都會走代理,訪問其它主機則不會——這與「按 Provider 隔離」不是同一概念。
  • 僅支持 HTTP / HTTPS 代理,不支持 SOCKS。
  • 默認隻影響模型相關請求經 fetch 補丁的路徑;搜索、網頁抓取、MCP 等其它流量默認直連,除非其訪問的主機被顯式寫入規則。

DSH 生態強調「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。本插件當前 GitHub 星標爲 0,功能與邊界以倉庫 README 爲準。

結尾

經過上面的步驟,可以在一套 DSH 配置裏同時保留直連國內模型與經代理訪問境外 API,並把規則留在可編輯、可持久化的配置裏。需要詳情時請參閱 SkillHub 目錄頁 與 GitHub 倉庫。

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

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

小夜