前言¶
在 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 一般不会冲掉用户配置。
- 目录页:https://www.skillhub.cn/plugins/LostAbaddon/dsh-llm-proxy-router
- 源码与说明:https://github.com/LostAbaddon/dsh-llm-proxy-router
- 许可证:MIT(见仓库
package.json) - 运行环境:Node.js >= 20
核心功能¶
路由判定顺序¶
单次请求按下列顺序判定,先命中先算:
- 路由总开关关闭 → 直连。
- 未填写代理地址 → 直连。
- 目标为本机(
localhost、127.0.0.1、::1、*.local)→ 直连。 - 目标主机命中某条主机规则 → 走代理。
- 其余 → 直连。
主机规则来自两处,按顺序拼接:
- 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 里其它配置。
典型用法¶
在界面中配置¶
- 打开 设置 → 模型 → LLM 代理路由。
- 填写代理地址(例如本地 Clash 的
http://127.0.0.1:7890)。 - 对需要翻墙的 Provider(如 Gemini、OpenRouter)勾选「走代理」;国内直连 Provider 保持不勾选(且
deepseek等内置排除项本身不会走代理)。 - 若有自建反代或内网网关,在对应 Provider 行或「额外主机规则」中追加主机名。
- 使用「测试代理」确认隧道可用,保存配置。
配置文件示例¶
首次保存后,以 $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 仓库。