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 仓库。

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

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

Xiaoye