dsh-egress-router:DSH 出站分流,模型直连、抓取走代理

前言

在 DeepSeek Harness(DSH)里做智能体时,模型对话和 web_fetch、子进程外联往往共用同一套代理策略。DSH 原生只在启动时读取一次代理环境变量,运行中不能按用途分流;代理关闭后 web_fetch 容易直接失败;要换代理还得改 ~/.dsh/.env 并重启。下面介绍社区插件 dsh-egress-router(维护者 fengyevvv),它把出站策略挂到 @deepseek-ai/dsh-http-proxy 的进程级 active 策略上,在 Web UI 里切换模式,并支持代理不可用时的自动回落。

这是什么

dsh-egress-router 是 DSH 的出站流量路由插件,分类属于联网工具。一句话:DeepSeek 模型请求尽量直连,外网模型相关抓取与子进程走 HTTP(S) 代理,代理挂了可回落直连,恢复后再切回。当前版本 0.1.1,许可证 MIT;目录页见 SkillHub,源码见 GitHub。

插件不依赖 .env 写状态,启动路径零 I/O;任何异常都降级为直连。适配 DSH 0.2.1-rc.2,在 Windows 10/11 上 system 模式会读注册表;非 Windows 上 system 只读启动环境变量。

核心功能

分流策略

能力 说明
模型请求 keepModelDirect: true(默认)时,deepseek.com 始终在 NO_PROXY 中,模型流量直连
web_fetch 经 dsh-web-fetch-http,每次请求调用 proxyRouteFor(url),改策略后立即生效
普通 fetch() 读全局 undici dispatcher,与上述策略一致
子进程 通过导出的 HTTP(S)_PROXY / NO_PROXY 跟随

三种模式

模式 行为
direct 不装代理,全部直连
system Windows 下读 HKCU\...\Internet Settings 的 ProxyEnable / ProxyServer / ProxyOverride(与 Clash「系统代理」一致)
manual 使用配置项 proxy 指定的 HTTP(S) 代理地址

健康检查:按 probeIntervalMs 对代理做 TCP 探测;fallbackToDirect: true 时失败切直连,恢复后自动切回。

Web UI

设置 → 通用 → 出站分流 提供:

  • 下拉:全部直连 / 跟随系统 / 手动代理;
  • 手动模式下的代理地址输入;
  • 「模型请求直连」复选框。

保存后写入 profile 的 cordis.patch.yml,Host 收到配置更新后重新安装策略,无需重启 DSH。

环境变量 DSH_EGRESS_DISABLE=1 时插件完全不接管。

安装与启用

桌面 profile 由桌面应用管理,README 建议优先用手动安装(已实测);bundle 方式可用 lab profile 先验证。

方式 A:手动安装(推荐)

  1. 从 Releases 下载 dsh-egress-router-0.1.1.zip 并解压。
  2. 将 lib/ 与 package.json 复制到 profile 的 node_modules 目录。
$src = ".\dsh-egress-router"
$dst = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-egress-router"
New-Item -ItemType Directory -Force $dst | Out-Null
Copy-Item "$src\lib" $dst -Recurse -Force
Copy-Item "$src\package.json" $dst -Force
  1. 在 %USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml 末尾追加插件块:
- insert:
    - id: egress-router
      name: dsh-egress-router
      config:
        mode: system
        proxy: http://127.0.0.1:7897
        keepModelDirect: true
  1. 完全退出 DSH(含托盘),再重新打开。

方式 B:bundle 安装

发布到 npm 后可用:

dsh plugin --profile web add dsh-egress-router

或在 Web UI:设置 → 插件 → 添加插件,填写 dsh-egress-router。web 仅为示例 profile 名,请换成自己的 profile;desktop 请走 Web UI「添加插件」,不要用 dsh plugin --profile desktop。

本包带有 dsh.bundle.patch,bundle 安装会自动创建 egress-router 条目,不要再手写方式 A 的 insert,否则会重复同 id。

配置项

字段 默认 说明
enabled true 总开关;false 时还原启动时策略
mode system direct / system / manual
proxy http://127.0.0.1:7897 manual 模式代理,仅 http:// / https://
keepModelDirect true 将 deepseek.com 加入 NO_PROXY
noProxy [] 额外直连主机(不支持 192.168.* 等网段写法)
fallbackToDirect true 代理不可用时回落直连
probeIntervalMs 5000 探测周期;0 关闭
probeTimeoutMs 800 单次探测超时

Clash 混合端口示例:http://127.0.0.1:7897。仅支持 HTTP(S) 代理;SOCKS 会被 @deepseek-ai/dsh-http-proxy 拒绝。

典型用法与验证

经过上面的安装与配置,可按 README 建议自测:

  1. 向模型发一句对话,能正常回复 → 模型直连正常。
  2. 让 agent 抓取 https://en.wikipedia.org/robots.txt,返回 200 → 外网抓取经代理。
  3. 设置页能看到「出站分流」→ 客户端模块加载正常。
  4. 关闭 Clash,等待约 5~10 秒再抓外网 → 应出现网络错误而非长时间卡死;重新打开 Clash 后应自动恢复。

适用场景与注意

适合需要在同一 DSH 会话里分开管模型与外网抓取、且常用 Clash 等 HTTP 代理的 Windows 用户;macOS / Linux 可用 direct / manual,但 system 不会读系统代理注册表。

插件以当前 DSH 进程权限运行,安装前请自行查看 源码与 MIT 许可证。代理 URL 不要写带账号密码的形式(会明文写入 profile)。已知限制包括:ProxyOverride 中网段类规则无法完整表达、Clash fake-ip 在「回落直连」时可能触发 DSH 私有地址校验等,详见 README「已知限制」。

回退:完全退出 DSH → 删除 cordis.patch.yml 中本插件的 - insert: 块 → 重启;可选删除 profiles\<name>\node_modules\dsh-egress-router。

结尾

dsh-egress-router 把「模型直连 + 抓取走代理 + 健康回落 + UI 切换」收进一个 Cordis 插件,减轻改 .env 和重启的摩擦。社区插件目录 SkillHub 与仓库 fengyevvv/dsh-egress-router 为独立生态入口,与 DeepSeek / 幻方无官方从属关系;DSH 本身仍遵循「一切皆插件」的扩展方式,可按需选用。

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

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

小夜