前言¶
DeepSeek Harness(DSH)里,LLM 调用、Web 搜索/抓取、HTTP MCP 以及部分 agent shell 子进程的 HTTP 流量,都走进程内的 HTTP 栈。官方通过 @deepseek-ai/dsh-http-proxy 在启动时从环境变量(或 $DSH_HOME/.env)读一次策略,装成进程级 undici dispatcher;它不支持 SOCKS、PAC,也不会读操作系统代理。因此 Clash Verge 的「系统代理」对 Harness 本体无效——只有 shell 里的 curl、git、npm 等子进程会受系统代理影响。
想换路由,官方路径通常是改环境变量并重启 Harness。若你本地用 Clash Verge Rev 做混合代理,又希望 agent 在「走代理」和「直连/局域网」之间随时切换而不重启,社区插件 dsh-net-switch(维护者 B1aZerr,分类:联网工具)针对的就是这个缺口。
这是什么¶
dsh-net-switch 给 DSH 提供一个运行时出网开关:在「本地 Clash Verge 代理」与「直连(含局域网)」之间切换 Harness 自身的出站流量,无需重启。当前版本为 0.1.0,许可证 MIT,要求 DSH >=0.2.0-rc.2。
三个入口驱动同一套逻辑:
| 入口 | 用法 |
|---|---|
| 会话头部状态胶囊 | 紧邻模式选择按钮右侧;绿点「代理」/ 灰点「直连」/ 琥珀「代理离线」,点击切换 |
| Agent 工具 | network_mode:模型可按任务临时切到 clash,用完切回 lan |
| 斜杠命令 | /net clash、/net lan、/net status |
插件目录页:https://www.skillhub.cn/plugins/B1aZerr/dsh-net-switch;源码与说明:https://github.com/B1aZerr/dsh-net-switch。
核心功能¶
进程内路由替换¶
插件把官方「启动时一次性解析」的 dispatcher 换成每次请求现判的 SwitchDispatcher:
mode=clash→ 经ProxyAgent发往 Clash Verge(默认127.0.0.1:7897,可从verge.yaml自动读混合端口)mode=lan→ 使用原直连 dispatcher- 命中 NO_PROXY 的目标永远直连
覆盖范围包括:LLM 调用、web 搜索/抓取、HTTP MCP;可选通过 publishEnvToChildren 同步 HTTP_PROXY / HTTPS_PROXY / NO_PROXY / NODE_USE_ENV_PROXY 到 git/curl/npm/pwsh 等子进程。
私网与回环绕过¶
比官方策略更严的绕过列表:localhost、127.0.0.0/8、::1、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16,以及配置项 noProxy 中的额外主机名/IP/CIDR。NAS、局域网 IP、本地服务不会被误送进代理。
失败开放与状态展示¶
选了 clash 但代理端口探不通时,默认自动回退直连(fail-open),避免 agent 卡死;状态保留 mode: clash 且 degraded: true,胶囊显示琥珀「代理离线」。若需要「无代理即失败」,将 autoFallback 设为 false。
插件只读 Clash Verge 的 verge.yaml 做端口发现,不修改其系统代理、TUN 或订阅。卸载时会恢复原有 dispatcher 与代理环境变量。
GUI 与安全¶
状态胶囊注册在 conversation.session.header.actions(order: -5,介于 agent-preset 与 job-list 之间),随头部流式排布,不覆盖已有控件。
宿主暴露仅限回环的 HTTP 路由:GET /dsh-net-switch/state、POST /dsh-net-switch/mode(支持 {"mode":"clash"|"lan"} 或 {"toggle":true})。Host 须为回环;跨站 POST 会因 Origin 校验被拒绝。
安装与启用¶
前置:带 profile 的 DSH(示例 profile 名为 desktop),Clash Verge Rev 在运行(混合端口默认 7897)。
下面三种方式任选其一(命令来自项目 README):
# 方式 A:从 GitHub 安装(推荐)
dsh plugin --profile desktop add github:B1aZerr/dsh-net-switch
# 方式 B:本地 link(开发时改代码即时生效)
git clone https://github.com/B1aZerr/dsh-net-switch
dsh plugin --profile desktop add link:<克隆路径>\dsh-net-switch
# 方式 C:从 tgz 安装
dsh plugin --profile desktop add file:<解压路径>\dsh-net-switch-0.1.0.tgz
预构建包(无需本地构建):
https://github.com/B1aZerr/dsh-net-switch/releases/latest/download/dsh-net-switch.tgz
装完后可在插件目录执行自检(对运行中的 host):
node dsh-net-switch\tools\verify-install.mjs
会话头部、模式选择按钮右侧应出现状态胶囊(默认「直连」)。若修改了 host 侧代码,需在「设置 → 插件」中关闭再打开 net-switch,或重启 DSH Desktop,否则 host 模块缓存可能导致改动不生效;client 半刷新页面即可。
典型用法¶
- 手动切换:点击头部胶囊,或在会话中执行
/net clash、/net lan;用/net status查看当前模式与探活结果。 - Agent 自主切换:在对话中让模型调用
network_mode,例如需要访问境外 API 时切 clash,任务结束后切回 lan。 - 可选配置:在 profile 的
cordis.patch.yml中覆盖插件config(节选):
- id: net-switch
name: 'dsh-net-switch'
config:
proxy: 'http://127.0.0.1:7897'
mode: lan
autoFallback: true
probeIntervalMs: 5000
probeTimeoutMs: 2000
noProxy: ['nas.home.arpa']
persist: true
publishEnvToChildren: true
enabled: true
模式优先级:config.mode → 持久化状态文件(默认 $DSH_HOME/storages/dsh-net-switch.json)→ lan。
适用场景与注意¶
适合谁:本机长期跑 Clash Verge、用 DSH Desktop 做 agent 开发或日常对话,需要在「Harness 本体走代理」和「直连/内网」之间频繁切换,且不想每次改 .env 并重启的人。
务必知晓:
- 插件以当前 DSH 进程权限运行,安装前请阅读源码与 MIT 许可证,确认代理 URL 与路由逻辑符合你的安全策略。
- 不支持 SOCKS/PAC;代理地址须为 HTTP 形式(与官方 http-proxy 一致)。
- 社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态遵循「一切皆插件」,本插件为社区维护的联网工具类扩展。
结尾¶
dsh-net-switch 把 Harness 出网从「启动定死」改成「运行时一键切换」,并与 Clash Verge 混合端口、头部 UI、network_mode 工具、/net 命令打通。若你的痛点正是「系统代理对 Harness 无效、重启才能换路由」,可按上文命令安装并在头部胶囊或斜杠命令里验证。