dsh-net-switch:Harness 运行时出网切换

前言

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 半刷新页面即可。

典型用法

  1. 手动切换:点击头部胶囊,或在会话中执行 /net clash、/net lan;用 /net status 查看当前模式与探活结果。
  2. Agent 自主切换:在对话中让模型调用 network_mode,例如需要访问境外 API 时切 clash,任务结束后切回 lan。
  3. 可选配置:在 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 无效、重启才能换路由」,可按上文命令安装并在头部胶囊或斜杠命令里验证。

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

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

Xiaoye