前言¶
在 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:手动安装(推荐)¶
- 从 Releases 下载
dsh-egress-router-0.1.1.zip并解压。 - 将
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
- 在
%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
- 完全退出 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 建议自测:
- 向模型发一句对话,能正常回复 → 模型直连正常。
- 让 agent 抓取
https://en.wikipedia.org/robots.txt,返回 200 → 外网抓取经代理。 - 设置页能看到「出站分流」→ 客户端模块加载正常。
- 关闭 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 本身仍遵循「一切皆插件」的扩展方式,可按需选用。