dsh-llm-net-router:按 Provider 分出网与改写客户端指纹

前言

在 DeepSeek Harness(DSH)里接多个 LLM Provider 时,常见两类麻烦与「官方只给一份全局策略」叠在一起:有的中转站必须走代理、有的必须直连,改 NO_PROXY 是进程级补丁,还不能按 Provider 区分;另一类是网关按 user-agent、originator 等头做客户端校验,Harness 里 user-agent 由 dsh-llm 写死,在 profile 的 headers 里同名字段会被冲突过滤,改 YAML 还要重启。

下面介绍社区插件 dsh-llm-net-router(维护者 dyh886,分类:联网工具)。它在传输边界包装 globalThis.fetch,按请求目标 host 决定直连或走 HTTP/HTTPS/SOCKS5 代理,并在最终请求头拼完后改写客户端指纹;卸载即恢复,规则文件原子落盘。本文事实均来自 GitHub 仓库 README 与 package.json。

这是什么

dsh-llm-net-router 是 DSH 的 Cordis 插件(id: llm-net-router),面向「每个 Provider 各自出网、各自伪装成谁」的场景。与官方 @deepseek-ai/dsh-http-proxy 只解析一份全局 undici dispatcher 不同,本插件按 request 的目标 host 在运行中决策;与在 profile 里改 headers 不同,它在 fetch 边界改写头,不碰 baseURL,也不起本地中继端口。

设置入口:设置 → 网络路由(settings.section,order 72)。要求 DeepSeek Harness 0.2.0-rc.2(dshTarget)、Node.js >= 18;零运行时依赖,MIT 许可证。

核心功能

按 host 的出网策略

未被 Provider 规则命中的地址走「默认策略」;命中后可选三种模式:

模式 含义
跟随全局(inherit) 交回 Harness 原生策略,默认最保守
强制直连(direct) 该 host 不走任何代理
走代理(proxy) 指定 地址:端口,支持 HTTP / HTTPS / SOCKS5

match 支持 example.com、.example.com、*.example.com、host:port、*;更长匹配优先,同长度按 provider id 字典序。cordis.patch.yml 里的声明式规则与 $DSH_HOME/net-router/rules.json 合并,文件优先。

客户端指纹(传输边界改写)

id 发出去的头(摘要)
none 不改写
codex originator: codex_cli_rs 及 Codex CLI 风格 user-agent
claude-code Claude CLI 风格 user-agent、x-app: cli 等;可选 1M 追加 anthropic-beta: context-1m-2025-08-07
custom 界面手写 JSON 头

codexVersion / claudeVersion 可覆盖版本号;headers 可覆盖内置值。context1m 仅在 fingerprint: claude-code 时生效,anthropic-beta 与请求原有 beta 及 headers 中去重合并,避免关掉 pi-ai 自带的 thinking 等 beta。

界面与探测

  • 代理池:可逐个探测 TCP / 隧道是否可用。
  • Provider 规则:每行配置通路、代理、指纹;矩阵探测在「直连 / 各代理」×「不伪装 / Codex / Claude Code(+1M)」组合下试通,并可一键采纳写入规则。
  • 用真实推理端点校验:默认只探 GET /models;勾选后探 POST /chat/completions(max_tokens: 1),因不少中转站只在推理路径做客户端校验。
  • 最近路由决策:记录被本插件影响的请求、命中规则、通路、指纹与结果。

探测结论读法(节选):ok 为 2xx;client-gate 需换指纹;context-gate 需勾 Claude Code 旁的 1M;auth 查密钥。

安装与启用

环境需已安装 DeepSeek Harness 0.2.0-rc.2 与 Node.js >= 18。README 推荐方式之一为交给官方插件入口(无需在插件目录执行 npm install 装运行时依赖):

$dshHome = $env:DSH_HOME; if (-not $dshHome) { $dshHome = "$env:USERPROFILE\.dsh" }

dsh plugin --profile desktop add file:$dshHome/plugins/dsh-llm-net-router

若插件已放在 $DSH_HOME/plugins/dsh-llm-net-router,也可按 README 使用:

dsh plugin --profile desktop add github:dyh/dsh-llm-net-router

完成后在 profile 的 cordis.patch.yml 中与其它插件同级启用(节选):

- id: llm-net-router
  config:
    enabled: true
    defaultMode: inherit
    defaultProxy: ''
    proxyPool:
      - http://127.0.0.1:7890
      - socks5://127.0.0.1:1080
    probeTimeoutMs: 8000
    inferenceTimeoutMs: 30000
    rulesFile: 'net-router/rules.json'

并在 dsh.profile.bundles 中加入 dsh-llm-net-router 后重启 Harness(桌面端:托盘退出再启动)。卸载时从 bundles 与 dependencies 移除、删掉 junction(若曾手动创建)、重启;rules.json 可保留或删除。

典型用法

规则文件示例

界面保存或手写的规则位于 $DSH_HOME/net-router/rules.json(原子替换写入,容忍 BOM):

{
  "version": 1,
  "defaults": { "mode": "inherit", "proxy": "" },
  "proxies": ["http://127.0.0.1:7890"],
  "providers": {
    "agentrouter": {
      "enabled": true,
      "match": ["agentrouter.org"],
      "mode": "proxy",
      "proxy": "http://127.0.0.1:7890",
      "fingerprint": "codex",
      "headers": { "x-app": "cli" },
      "note": ""
    }
  }
}

需要 1M 上下文模型且网关要求 beta 时(与 401 客户端校验不同):

{
  "anyrouter": {
    "enabled": true,
    "match": ["anyrouter.top"],
    "mode": "proxy",
    "proxy": "http://127.0.0.1:7890",
    "fingerprint": "claude-code",
    "context1m": true,
    "headers": {},
    "note": "1M 模型必须带 context-1m beta"
  }
}

命令行探测

Harness 运行时,可复用界面规则与凭据:

node scripts/probe-cli.mjs --api http://127.0.0.1:19387 --provider primerelay
node scripts/probe-cli.mjs --api http://127.0.0.1:19387 --provider primerelay --endpoint inference

独立探测(Harness 未运行亦可),密钥用凭据引用避免进 shell 历史:

node scripts/probe-cli.mjs https://relay.example.com/v1 `
  --api-key-ref RELAY_API_KEY --endpoint inference --model gpt-6-sol `
  --proxies 127.0.0.1:7890,socks5://127.0.0.1:1080

--api-key-ref 从 $DSH_HOME/.credentials.yaml 的 refs: 段读取。

适用场景与注意

适合谁:同时配置多个中转站或自建网关,且各站对代理路径、客户端头要求不一致的 DSH 用户;需要在不改 provider baseURL、不重启的前提下试通路和指纹组合时,矩阵探测与决策日志会省很多时间。

权限与安全:插件以当前 DSH 进程权限运行,会包装全局 fetch 并读写 $DSH_HOME 下规则与配置;安装前请自行审阅 源码与许可证(MIT),仅从可信来源安装。

已知边界(README 摘要):只作用于经 globalThis.fetch 发出的请求;官方 HTTP 代理插件的全局 dispatcher 与「跟随全局」模式并存时,以 README「已知边界」为准。社区目录 skillhub.cn 插件页 为独立收录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-llm-net-router 补的是 Harness 配置层不好表达的「按 Provider 出网 + 按站点改客户端头」:规则可界面改、可声明式种子,探测能区分客户端闸门与 1M 闸门。进一步了解可看目录页 https://www.skillhub.cn/plugins/dyh886/dsh-llm-net-router 与仓库 https://github.com/dyh886/dsh-llm-net-router 。

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

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

Xiaoye