🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

出网代理 FIZMIE/dsh-net-proxy

DeepSeek 客户端v0.8.0
FIZMIE20 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

导入 Clash 订阅,自动选最快节点为 Agent 出网

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/FIZMIE/dsh-net-proxy.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 20 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

npm 同名包「dsh-net-proxy」归属 mafeis/dsh-net-proxy,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-net-proxy @ 0.8.0
✓Node 引擎要求 >=22.6 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:39:12

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 41 处,展示前 21 条)
  • 读取本地文件
    lib/index.js:76
    if (!existsSync(file)) return undefined;
  • 读取本地文件
    lib/index.js:77
    const parsed = JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    lib/index.js:144
    return { ...DEFAULT_CONFIG, ...JSON.parse(readFileSync(configPath(), 'utf8')) };
  • 写入本地文件
    lib/index.js:152
    mkdirSync(stateDir(), { recursive: true });
  • 写入本地文件
    lib/index.js:153
    writeFileSync(configPath(), `${JSON.stringify(state.config, null, 2)}\n`, 'utf8');
  • 发起网络请求
    lib/index.js:236
    const response = await fetch(`http://127.0.0.1:${state.config.apiPort}${path}`, {
  • 读取本地文件
    lib/index.js:269
    if (!existsSync(dir)) return undefined;
  • 读取本地文件
    lib/index.js:270
    const found = readdirSync(dir).find((file) => /^mihomo.*\.exe$/i.test(file));
  • 读取本地文件
    lib/index.js:294
    if (!existsSync(from) || existsSync(to)) continue;
  • 写入本地文件
    lib/index.js:296
    copyFileSync(from, to);
  • 写入本地文件
    lib/index.js:323
    mkdirSync(stateDir(), { recursive: true });
  • 写入本地文件
    lib/index.js:335
    writeFileSync(runtimeConfigPath(), buildRuntimeConfig(readFileSync(subscriptionPath(), 'utf8')), 'utf8');
  • 执行外部命令来自配置/变量
    lib/index.js:339
    const spawned = spawn(kernel, ['-d', stateDir(), '-f', runtimeConfigPath()], {
  • 写入本地文件
    lib/index.js:358
    try { writeFileSync(kernelLogPath(), output.join(''), 'utf8'); } catch { }
  • 执行外部命令来自配置/变量
    lib/index.js:582
    const helper = spawn(kernel, ['-d', dir, '-f', configFile], {
  • 删除本地文件递归
    lib/index.js:613
    try { rmSync(dir, { recursive: true, force: true }); break; } catch { await sleep(300); }
  • 发起网络请求
    lib/index.js:625
    const response = await fetch(`http://127.0.0.1:${apiPort}/version`, {
  • 发起网络请求
    lib/index.js:677
    const response = await fetch(url, {
  • 发起网络请求
    client/client.js:152
    const response = await fetch(BASE + path, {
  • 发起网络请求
    client/client.js:186
    const response = await fetch(BASE + "/status", { cache: "no-store" });
  • 发起网络请求
    client/client.js:205
    const response = await fetch(BASE + "/log", { cache: "no-store" });
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 导入Clash订阅
  • 自动选最快节点
  • 故障自动转移

为 DeepSeek Harness 桌面应用自带出站代理:内置 mihomo 内核、导入 Clash 订阅、自研延迟排序与自动故障转移。无需第三方代理客户端,也不占用系统代理。

README

由 DeepSeek 最新模型翻译生成
dsh-net-proxy 把下面这段直接粘给你的 AI Agent(Claude Code、Codex、Cursor、DeepSeek Harness——任何能跑命令的都行),它会帮你装好并配置这个插件: 把 https://github.com/FIZMIE/dsh-net-proxy 这个 DSH 插件装到我的 DeepSeek Harness 里。 读它的 README,接进 ~/.dsh/profiles/<profile>/package.json 和 cordis.patch.yml,再用它 tools/ 目录里的脚本把 mihomo 内核和规则库拉下来。 问我要 Clash 订阅链接,导入,打开代理,然后访问 https://github.com 验证它真的通了。 给 DeepSeek Harness 桌面版的自包含出网代理。 你需要一个订阅。 这个插件是客户端,它自己不提供也不售卖任何线路——请用你现有服务商的 Clash 格式订阅链接。没有订阅它就没有节点可连。 它做什么 订阅链接只需粘一次。
展开完整文档(README 剩余 1 节)
dsh-net-proxy

把下面这段直接粘给你的 AI Agent(Claude Code、Codex、Cursor、DeepSeek Harness——任何能跑命令的都行),它会帮你装好并配置这个插件:

把 https://github.com/FIZMIE/dsh-net-proxy 这个 DSH 插件装到我的 DeepSeek Harness 里。
读它的 README,接进 ~/.dsh/profiles/<profile>/package.json 和 cordis.patch.yml,再用它 tools/ 目录里的脚本把 mihomo 内核和规则库拉下来。
问我要 Clash 订阅链接,导入,打开代理,然后访问 https://github.com 验证它真的通了。

给 DeepSeek Harness 桌面版的自包含出网代理。

你需要一个订阅。 这个插件是客户端,它自己不提供也不售卖任何线路——请用你现有服务商的 Clash 格式订阅链接。没有订阅它就没有节点可连。

它做什么

订阅链接只需粘一次。之后插件会:

1. 启动自己的代理内核 —— 内置 mihomo 二进制,不用额外装任何东西
2. 自己实测每个节点 —— 并发对 https://github.com 测延迟
3. 用最快的那个 —— 节点挂了自动切换
4. 接管 Agent 的出网 —— web_fetch、模型请求,以及 git、npm 这类子进程

不用后台常驻 Clash 客户端,不用开系统代理,不用改 hosts,不需要管理员权限。

为什么会有这个插件

在被墙的网络里让 Agent 干活是这样的:请求超时 → Agent 判断"网络坏了" → 你每次会话都要手动跟它解释一遍你的代理怎么开。

常见的办法对 Agent 都不好使:

- 系统代理它看不见 —— Node 进程里的 fetch 根本不吃系统代理
- 图形界面代理客户端可能没开着,而 Agent 在沙箱里也起不了 GUI 程序
- 客户端自带的 url-test 组按固定间隔(常常是一天)对 gstatic.com 测速 —— 那既不是你关心的站点,而且请求失败时它也不会重测

所以这个插件做的事是:在该测的时候,测你真正关心的那个站点;请求失败时立刻切换。

安装

一句话交给 AI

把文件顶部那段粘给一个能执行 shell 的 Agent。那段话里已经包含它需要的一切:仓库地址、profile 在哪、跑哪些脚本、怎么验证结果。

手动安装

1. 克隆到一个固定位置(别放进 profile 的 node_modules 里)
git clone https://github.com/FIZMIE/dsh-net-proxy.git "$env:USERPROFILE\.dsh\plugins\dsh-net-proxy"

2. 让 profile 认到它在 $DSH_HOME\profiles\<profile>\package.json 里加:
"dependencies": { "dsh-net-proxy": "link:C:/Users/<你>/.dsh/plugins/dsh-net-proxy" }
"dsh": { "profile": { "bundles": [ ..., "dsh-net-proxy" ] } }
然后建链接,让加载器能解析这个名字: New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-net-proxy" -Target "$env:USERPROFILE\.dsh\plugins\dsh-net-proxy"

3. 在 $DSH_HOME\profiles\<profile>\cordis.patch.yml 里注册这个 bundle:
- id: dsh-net-proxy
disabled: false

4. 自检
node "$env:USERPROFILE\.dsh\plugins\dsh-net-proxy\tools\verify-setup.mjs"

5. 重启 DeepSeek Harness(新的宿主插件没法热挂载)

内核和规则库已经提交在仓库里,所以重启就是最后一步 —— 不需要下载任何东西。
以后想更新它们(或者你为了缩小克隆体积把它们删了),见 THIRD-PARTY-NOTICES.md。

用法

打开 设置 → 网络代理。

- 第一次:粘订阅链接 → 点 更新订阅
- 之后每次:点 启用代理 就行。整个流程就这一步 —— 它会启动内核、给所有节点测速、接管出网,大约 2 秒。

节点表会列出每个节点和实测延迟;点节点名可以固定用它,点 自动选最快 恢复自动。
显示日志 可以看到插件在干什么。

你不点它就一直关着

打开应用什么都不会发生:不起内核、不下载订阅、不挂载任何东西(约 4 ms)。
上次关掉时代理是开着的,也不会自动恢复 —— 插件每次启动都是关闭的,等你点。
如果你不想每次惦记它,下面那节"写进 Agent 记忆"就是干这个的。

写进 Agent 记忆

安装时插件会往 $DSH_HOME/AGENTS.md 追加一小节,告诉 Agent 有这个代理、怎么开。
没有这一步,Agent 根本不知道它存在,只会一直报"GitHub 连不上"。
它只写一次,且仅在文件里没有等效章节时才写 —— 你后来改过的文件永远不会被重写。
想关掉,把 $DSH_HOME/.dsh-net-proxy/config.json 里的 "writeMemory" 设为 false。

实测行为

在一个真实的 23 节点订阅上测得:

| 节点测速 | 23/23 可达,最快约 90 ms,最慢约 274 ms |
| 点击到可用 | 点「启用代理」后约 2 秒 |
| 应用启动开销 | 约 4 ms,且不启动任何进程 |
| 开代理后出口 IP | 5.34.221.111 — 🇯🇵 日本东京(Akari Networks) |
| 关代理时出口 IP | 112.50.79.219 — 🇨🇳 广东广州(China Mobile) |
| 故障切换 | 淘汰当前节点 → 自动走到下一个 → https://github.com 返回 200 |
| loopback | 始终直连(127.0.0.1:19387 打到 DSH 本体,没走代理) |

内核自己的日志是流量确实经过它的证据:

[TCP] 127.0.0.1:60196 --> github.com:443 match DomainKeyword(github) using 九云[...]
[TCP] 127.0.0.1:60206 --> 127.0.0.1:19387 match IPCIDR(127.0.0.0/8) using DIRECT

设计说明

改代码前值得读一遍 —— 下面每一条都是踩坑踩出来的。

绝不重塑订阅文档。 mihomo 的 YAML 解析器拒绝重复键(比 YAML 规范严格),所以把自己的键前置会直接失败;而把 dns: 这类块从文档里抽出来会破坏相邻结构。插件只就地改写几个监听/控制器的标量键,所有块原样留在供应商放置的位置 —— 包括供应商的怪癖写法,比如节点名里不带引号的全角冒号。

用订阅自带的选择组,不自建。 自建组就要改组列表,又撞上上面那条。真实订阅都自带一个覆盖全部节点的 selector,所以插件通过 API 发现它并在其中切换。

不重启换节点。 路由走一个装在 Node 全局 dispatcher 槽位的 undici dispatcher —— 这就是 @deepseek-ai/dsh-http-proxy 用的同一套跨包机制。dispatcher 是每次请求读取的,所以切换节点会改变下一个请求的去向。

规则库必须内置,而且必须是完整版。 订阅规则里引用 GEOIP,CN / GEOSITE,所以内核在解析配置之前就需要这些数据。缺了它,内核会去 GitHub 下载然后卡死且没有任何报错;把 geox-url 置空则会直接 fatal 退出。而「精简版」数据库砍掉了 gfw 分类,DNS 配置引用了它的订阅会报 list gfw not found in geosite.dat 起不来。另外内核是在工作目录里找这些文件,不是可执行文件旁边,所以每次启动都会复制过去。

订阅下载有第二条路:走内置内核。 宿主的 fetch 受进程所带代理环境影响,在被墙的网络里可能完全没有出口 —— 而这是最不该失败的地方,因为那次下载是插件的唯一入口。所以 fetch 失败时,插件会用一份只有 MATCH,DIRECT 的临时配置把内置内核拉起来(不需要订阅、不需要节点、不需要规则库就能启动),拿它当 HTTP 代理把订阅拉下来,然后清理掉。另一个进程有另一套网络栈,这是实打实的第二次机会;而订阅服务商通常恰恰是唯一直连可达的那个域名。

启停串行,且停止要等进程真死。 child.kill() 只投递信号;旧进程还占着端口和工作目录时启动新的,表现为第二次启动静默卡住。所有启停走一条队列,旧进程的退出会被等待,而且它的 exit 回调会先确认自己仍是当前子进程才去动状态。

运行配置每次启动重建。 写一次然后复用,会让文件和内存状态不一致 —— 文件里留着过期端口,插件就会去一个没人监听的地址轮询,把已经成功启动的内核报成失败。

启动失败要能看见,不能吞掉。 启用是立即返回、后台完成的,所以那里的异常没有 HTTP 响应可搭车。错误会存进 state.lastError,由 /status 读回给界面 —— 否则用户看到的只是一个"点了没反应"的按钮。

HTTP 接口

全部在 /dsh-net-proxy 下,仅接受环回来源:

| 方法 | 路径 | 用途 |
| GET | /status | 内核、节点、当前出口、路由状态、进度、最近错误 |
| GET | /log | 最近 200 行日志 |
| POST | /enabled | {"enabled":true\|false} 总开关 |
| POST | /subscription | {"url":"..."} 保存订阅链接 |
| POST | /refresh | 重新下载并加载;{"preferCache":true} 用本地缓存 |
| POST | /test | 立即重新测速 |
| POST | /select | {"node":"..."} 固定节点,{"node":"auto"} 恢复自动 |
| POST | /kernel | {"action":"start"\|"stop"\|"restart"} |
| POST | /failover-test | 走一遍故障切换;{"force":true} 先淘汰当前节点 |

目录结构

lib/index.js 宿主半边:内核生命周期、订阅、测速排序、故障切换、路由 client/client.js 浏览器半边:设置页(手写的 ModuleLoader bundle) bin/ 内置的 mihomo 内核 + 规则库 tools/ fetch-kernel.mjs、fetch-geodata.mjs、verify-setup.mjs

运行要求

- DeepSeek Harness 桌面版,Windows x64
- 一个 Clash 格式的订阅链接
- 不需要管理员权限,不需要其他代理客户端

已知限制

- 只吃 Clash YAML 订阅。 base64 订阅链接会被明确拒绝,请在服务商后台切换格式。
- 只支持 HTTP 代理。 DSH 自己的代理层只接受 http(s)://,而内置内核提供的是 HTTP 混合端口 —— 实际不构成限制,但纯 SOCKS 订阅不支持。
- 模型请求默认不走代理(proxyModelCalls: false),这样坏节点不会把对话一起拖下水。可在 config.json 里改。
- 内置内核仅 Windows x64。 插件自身代码与平台无关,但 bin/ 不是。
- 规则库不自动更新。 随插件走;需要时用 tools/fetch-geodata.mjs 刷新。

许可

插件自身源码为 MIT。内置的 mihomo 内核与规则库是 GPL-3.0,以独立文件形式原样再分发 —— 见 THIRD-PARTY-NOTICES.md。
预览分享卡片长什么样 ↓FIZMIE/dsh-net-proxy
分享 · DeepSeek Harness Hub
FIZMIE/dsh-net-proxy

导入 Clash 订阅,自动选最快节点为 Agent 出网

回到顶部