针对 DeepSeek Harness 的按模型出站代理路由,
30.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add windwhiterain/dsh-model-proxy该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 按模型分流出站代理
- 指定模型走代理
- 代理不可用直连兜底
按模型分流 DeepSeek Harness 的出站代理:只把你指定的模型走代理,代理不可用时直连兜底。
README
由 DeepSeek 最新模型翻译生成dsh-model-proxy
针对 DeepSeek Harness 的按模型出站代理路由,在代理不可用时回退到直连。
一个网关可以通过不同的上游为不同的模型提供服务,而这些上游的可达性并不相同。
一个被路由到受地域限制、限流或只能通过企业代理访问的上游的模型,其失败原因与同一选择器中紧邻它的模型毫无关系——相同的主机、相同的密钥、相同的请求形态。
环境代理无法表达这种区别:HTTP_PROXY 按主机路由,而两个模型共享同一个主机。
将整个网关通过代理路由会拖累正常工作的模型;什么都不路由则让出问题的模型继续出问题。
dsh-model-proxy 从每个请求中读取模型名称,只将你指定的模型通过代理发送。
路由方式
DSH、pi-ai 以及各 provider SDK 通过 globalThis.fetch 发起请求,它会解析 undici 众所周知的全局 dispatcher 槽位
(Symbol.for('undici.globalDispatcher.1'))。该插件拥有该槽位,并按以下顺序决策:
1. 来源 —— 发往 origins 之外主机的请求,或不携带请求体的请求,保持在此插件加载之前已安装的路由。
2. 代理可达性 —— 当设置了 fallbackToDirect 且代理的 host:port 拒绝 TCP 连接时,候选请求同样保持之前的路由。
展开完整文档(README 剩余 1 节)
dsh-model-proxy
针对 DeepSeek Harness 的按模型出站代理路由,在代理不可用时回退到直连。
一个网关可以通过不同的上游为不同的模型提供服务,而这些上游的可达性并不相同。
一个被路由到受地域限制、限流或只能通过企业代理访问的上游的模型,其失败原因与同一选择器中紧邻它的模型毫无关系——相同的主机、相同的密钥、相同的请求形态。
环境代理无法表达这种区别:HTTP_PROXY 按主机路由,而两个模型共享同一个主机。
将整个网关通过代理路由会拖累正常工作的模型;什么都不路由则让出问题的模型继续出问题。
dsh-model-proxy 从每个请求中读取模型名称,只将你指定的模型通过代理发送。
路由方式
DSH、pi-ai 以及各 provider SDK 通过 globalThis.fetch 发起请求,它会解析 undici 众所周知的全局 dispatcher 槽位
(Symbol.for('undici.globalDispatcher.1'))。该插件拥有该槽位,并按以下顺序决策:
1. 来源 —— 发往 origins 之外主机的请求,或不携带请求体的请求,保持在此插件加载之前已安装的路由。
2. 代理可达性 —— 当设置了 fallbackToDirect 且代理的 host:port 拒绝 TCP 连接时,候选请求同样保持之前的路由。这样代理停止运行时,你只会失去被代理的模型,而不会导致所有调用失败。
3. 模型名称 —— 读取请求体头部的 "model" 字段,当该名称匹配 models 中的某一项时,请求通过 proxy 发送。
只保留请求体的前几个分块,且保留的分块会在流的其余部分之前被产出,因此分块边界、背压和流式响应均保持不变。
direct 指的是进程原本已有的路由。如果启动环境中没有代理,那就是直连,因此未配置的部署行为与安装插件之前完全一致。
安装
在目标 profile 的 package.json 中注册该 bundle (/profiles//package.json):
{
"dependencies": {
"dsh-model-proxy": "github:windwhiterain/dsh-model-proxy"
},
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "dsh-model-proxy"]
}
}
}
本地开发可以使用 link:C:/path/to/dsh-model-proxy。然后安装 profile 并重启 dsh 一次;该 bundle 自带的 cordis.patch.yml 会插入 model-proxy 行,并使用以下默认值。
不要同时为 dsh 进程设置 HTTP_PROXY/HTTPS_PROXY。 启动环境中的代理会让 dsh 安装它自己的进程级 dispatcher,而本插件随后会将其视为对所有未被代理的内容要保留的路由——这与本意相反。保持启动环境为直连,让本让插件成为唯一代理任何东西的东西。
配置
- id: model-proxy
config:
enabled: true
proxy: http://127.0.0.1:10793
origins:
- opencode.ai
models:
- grok-*
- gpt--luna
fallbackToDirect: true
probeTimeoutMs: 300
probeCacheMs: 2000
peekBytes: 16384
| 字段 | 含义 |
| enabled | 为 false 时,插件不安装任何东西,每个请求保持其原有路由。 |
| proxy | 匹配的模型所使用的端点。http: 或 https:,可带凭据。 |
| origins | 其模型可被路由的主机。发往其他所有主机的请求不受影响。 |
| models | 模型模式; 匹配任意字符序列,其他每个字符匹配其自身。 |
| fallbackToDirect | 当代理拒绝连接时,匹配的请求使用先前的路由,而不是失败。 |
| probeTimeoutMs | 可达性探测的 TCP 连接超时。 |
| probeCacheMs | 一次探测结果被复用的时长,因此一串请求只探测一次。 |
| peekBytes | 在放弃查找模型名称之前,可检查的正文字节数。 |
编辑 /profiles//cordis.patch.yml 中的行(热重载),或从设置层覆盖相同的 id。无法使用的配置值会导致激活失败,而不是静默地将流量路由到错误的地方。
配方
一个网关后面的区域受限上游。 OpenCode Go 通过上游提供 grok- 和 gpt--luna,这些上游从被封锁区域会返回 unsupported_country_region_territory,而 GLM、Kimi、 DeepSeek 以及目录中的其余模型从同一区域和同一 API 密钥正常响应。上面的配置只将这两个受限系列通过受支持区域的代理发送;其他所有模型保持直连,停止代理后它们全部仍可正常工作。
直接调用该网关时,请注意它会拒绝任何没有 x-opencode-session 头的请求(400 MissingSessionID),这与本插件无关。
一个提供商位于企业代理之后。
- id: model-proxy
config:
proxy: http://proxy.corp.example:3128
origins: [api.example.com]
models: ['']
整个网关通过不同的出口,而进程的其余部分不受影响。* 与企业案例相同,使用 models: [''] —— 路由仍然是按请求进行的,因此你之后在其他地方添加的主机不受影响。
诊断
每个决策都通过宿主日志记录器记录:
dsh-model-proxy: models grok-, gpt-*-luna on opencode.ai via http://127.0.0.1:10793, direct while it is down
dsh-model-proxy: route=proxy via=http://127.0.0.1:10793 reason=model:grok-4.7
dsh-model-proxy: route=direct via=direct reason=model-other:glm-5.3-flash
dsh-model-proxy: route=direct via=direct reason=proxy-down
dsh-model-proxy: route=direct via=direct reason=origin
卸载时,插件会恢复它所替换的分发器,因此之后的插件可以仍然占用该槽位。
探测
node probe/smoke.mjs # 代理可达
node probe/smoke.mjs --proxy-down # 回退
该探测在桩上下文中启动插件,并通过已安装的调度器驱动真实请求,断言所选路由以及响应体的完整性。它从 DSH 凭据存储中读取 API 密钥,因此在运行前请将配置指向你持有的凭据。node probe/decode-matrix.mjs 将下文描述的 undici 隐患与路由逻辑隔离开来。
兼容性
- Node 24 内置 fetch。 该插件依赖 Node 自身 fetch 所解析的全局调度器槽位;除此之外不假定任何附带 fetch 的 Node 版本。
- undici 被有意固定为 ~8.10.0。 8.11.0 会丢弃 content-encoding,并在 Node 24 下接管全局调度器后,将未解码的响应体交给 fetch——进程中每个响应都以原始字节形式到达。8.10.x 和 7.x 不受影响。提高该固定版本需要重新运行探测的响应体断言。
- DSH 自有的代理包存在同样的暴露面:@deepseek-ai/dsh-http-proxy 声明了 undici: ^8.10.0,因此将锁文件刷新到超过 8.11.0 会以同样的方式破坏该 harness 自身的代理支持。
已知限制
- 仅限进程内调用。 该决策发生在 dsh 进程内部,因此由 shell 工具启动的 curl 或 git 不会遵循它。它们遵循启动环境,而本插件有意不干预该环境。
- 模型从响应体中读取。 仅在请求头中指定模型,或响应体在 model 字段之前就超过 peekBytes 的请求,不会被匹配,并保持直连路由。
- 可达但上游失败的代理不会被检测到。 该探测回答的是“是否有东西在监听”,而不是“代理是否正常工作”;该请求会失败。
- 每行一个代理。 将不同模型系列路由到不同代理需要不止一行,而当前实现不支持这一点。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
windwhiterain/dsh-model-proxy
针对 DeepSeek Harness 的按模型出站代理路由,
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,269已汉化DSH
70.8
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。