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

智能代理路由 Lequait/dsh-proxy-router

DeepSeek Harness
Lequait34 天前有提交已提供中文文档扫描:含敏感能力

直连优先取回,失败自动切代理并记住路线

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Lequait/dsh-proxy-router
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · other
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令发起外部网络请求
查看扫描证据(共 9 处,展示前 9 条)
  • 发起网络请求
    index.js:148
    const r = await smart.fetch(String(args.url), { force: !!args.force });
  • 发起网络请求
    lib/core.mjs:91
    var req = https.request({ host: u.hostname, port: Number(u.port || 443), path: u.pathname + u.search, headers: { Host: u.host, 'User-Agent': 'dsh-prox
  • 发起网络请求
    lib/core.mjs:106
    var req = http.request({ host: u.hostname, port: Number(u.port || 80), path: u.pathname + u.search, method: 'GET', headers: { Host: u.host, 'User-Agen
  • 发起网络请求
    lib/core.mjs:125
    var req = http.request({ host: p.hostname, port: Number(p.port || 8080), path: urlStr, method: 'GET', headers: { Host: u.host, 'User-Agent': 'dsh-prox
  • 发起网络请求
    lib/core.mjs:140
    var req = https.request({ host: u.hostname, port: Number(u.port || 443), path: u.pathname + u.search, headers: { Host: u.host, 'User-Agent': 'dsh-prox
  • 执行外部命令固定命令
    lib/core.mjs:210
    var r = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], { encoding: 'utf8', timeout: 25000, windowsHide: true });
  • 执行外部命令来自配置/变量
    lib/core.mjs:315
    function runQuiet(cmd, args) { try { spawnSync(cmd, args, { encoding: 'utf8', timeout: 120000, windowsHide: true }); } catch (e) {} }
  • 执行外部命令来自配置/变量
    lib/core.mjs:385
    var child = spawn(exe, ['-d', o.dir, '-f', cfgPath], { stdio: ['ignore', logFd, logFd], windowsHide: true });
  • 发起网络请求
    lib/core.mjs:388
    var req = http.request({ host: '127.0.0.1', port: o.controllerPort, path: p, headers: { Authorization: 'Bearer ' + o.secret }, timeout: 8000 }, functi
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 优先直连抓取,失败自动切代理。订阅链接 → 本地内核 → 直连优先、失败自动切代理

README

由 DeepSeek 最新模型翻译生成
dsh-proxy-router 给 DSH 的「直连优先、代理兜底」取回能力。 导入一份代理订阅,直连失败的目标自动改走代理,并记住下次直接走对的那条路。 解决的问题:一遍遍重试直连、一遍遍换镜像源。第一次失败就换路,第二次起零试错。 为什么不直接用环境变量代理 DSH 自带的 dsh-http-proxy 只提供一条路:启动时把 HTTP_PROXY/HTTPS_PROXY/ALL_PROXY 装成 undici 全局 dispatcher,命中就全走代理、没配就全直连。 - 没有按主机判断:直连能通的站点也被塞进代理; - 没有失败重试:第一次连不上就报错; - 启动后改不了:运行中换不了代理; - 代理一挂全挂:节点死了连直连站点也访问不了。 本插件补的就是这一层:两条路 + 记忆 + 健康检查。
展开完整文档(README 剩余 1 节)
dsh-proxy-router

给 DSH 的「直连优先、代理兜底」取回能力。 导入一份代理订阅,直连失败的目标自动改走代理,并记住下次直接走对的那条路。

解决的问题:一遍遍重试直连、一遍遍换镜像源。第一次失败就换路,第二次起零试错。

为什么不直接用环境变量代理

DSH 自带的 dsh-http-proxy 只提供一条路:启动时把 HTTP_PROXY/HTTPS_PROXY/ALL_PROXY 装成 undici 全局 dispatcher,命中就全走代理、没配就全直连。

- 没有按主机判断:直连能通的站点也被塞进代理;
- 没有失败重试:第一次连不上就报错;
- 启动后改不了:运行中换不了代理;
- 代理一挂全挂:节点死了连直连站点也访问不了。

本插件补的就是这一层:两条路 + 记忆 + 健康检查。

工作原理

订阅链接 ──► mihomo 内核(本插件监督)──► 本地混合端口 http://127.0.0.1:<mixedPort> │ proxy-provider:定时重新拉取订阅 │ url-test 组:按真实 204 探测挑最低延迟的健康节点,故障自动切换 ▼ smartFetch(本插件)
1. 查路由记忆(按主机,默认 30 分钟 TTL)
2. 直连优先 → 失败则走代理重试
3. 成功即记住该主机该走哪条路 ▲ └── 代理没有健康节点时,直连路径不受影响

节点选择与故障切换交给内核(这是 mihomo 的强项),直连/代理的选择留给插件(这是 harness 特有的需求)。传输层是纯 node:http/node:https/node:tls + CONNECT 隧道,零第三方依赖。

安装

dsh plugin --profile <你的profile> add dsh-proxy-router
或用 GitHub 源
dsh plugin --profile <你的profile> add github:Lequait/dsh-proxy-router

重启 harness 后,会话里会出现 proxy_router 工具。

你只需要一个订阅地址

其它都不用配。两种给法,任选其一:

① 直接把链接交给 agent(推荐,零配置)

proxy_router { action: "start", subscriptionUrl: "https://你的订阅链接" }

插件会记住它(存在 <DSH_HOME>/cache/proxy-router/subscription.txt),之后 status / test / fetch 都不用再给。

② 写进插件配置(想让内核随 harness 自动启动时用)

上面配置表里的 subscriptionUrl 填一行即可,并可把 autoStart 设为 true。

内核不用你操心

启动时会按顺序找 mihomo:环境变量 DSH_PROXY_CORE → PATH → 常见安装目录 → 正在运行的内核进程 → Windows 注册表卸载项。
你机器上正在跑的 Clash Verge 自带内核(verge-mihomo.exe)就是这样被自动找到的,与安装在哪个盘无关。
都没有时会自动下载 mihomo(GitHub 直连失败会自动换镜像源)到 <DSH_HOME>/cache/proxy-router/bin/。
所以 corePath 和 DSH_PROXY_CORE 都是可选的高级选项,不是必填项。

配置(全部可选)

在 profile 的 cordis.patch.yml 里改 proxy-router 条目的 config:

- id: proxy-router
name: dsh-proxy-router
config:
subscriptionUrl: 'https://你的订阅链接' # 必填,含 token,请自行保管 corePath: '' # 留空自动探测 mihomo / verge-mihomo autoStart: true # 随 harness 启动内核 mixedPort: 19097 controllerPort: 19098 directTimeoutMs: 8000 proxyTimeoutMs: 12000 healthUrl: 'http://cp.cloudflare.com/generate_204'

| 字段 | 默认 | 说明 |
| subscriptionUrl | '' | 订阅链接;支持 Clash YAML 与 base64 节点列表 |
| corePath | 自动探测→自动下载 | 通常不用填;要强制指定内核路径时才填(或设 DSH_PROXY_CORE) |
| autoStart | false | 是否随 harness 启动内核 |
| mixedPort / controllerPort | 19097 / 19098 | 本地混合端口与控制器端口(避开 Clash Verge 的 7897/9097) |
| directTimeoutMs / proxyTimeoutMs | 8000 / 12000 | 两条路的超时预算 |
| healthUrl | cloudflare 204 | 节点健康探测目标 |

工具:proxy_router

| action | 作用 |
| status | 内核状态、当前选中节点、健康节点数、路由记忆条数 |
| start / stop | 启停本地内核 |
| test | 逐节点实测健康度,按延迟排序返回 |
| fetch | 按「直连优先 → 代理兜底」取回一个 URL(force: true 忽略记忆重新试) |
| routes / forget | 查看 / 清空按主机的路由记忆 |

测试

npm test

test/selftest.mjs 用真实的本地内核与真实传输验证四件事:直连失败 → 代理取回成功;第二次调用直接走对的那条路;直连可达的主机不绕代理;路由记忆持久化。
test/router-real.mjs 用真实订阅启动内核并统计节点健康度:

$env:SUB_URL='https://你的订阅链接'; node test/router-real.mjs

边界与注意

- 订阅里的节点可能全是死的(被封锁或服务器下线)。此时插件如实报告「健康 0 个」,只有直连路径生效——不会因为代理挂了而拖死智能体。
- 订阅 URL 会写进生成的内核配置(<DSH_HOME>/cache/proxy-router/config.yaml),该文件含凭据,不要同步或提交。
- 本插件运行第三方内核进程(mihomo)。装插件就是跑第三方代码,请只装你信任的来源。
- 本插件目前没有接管内置 web_fetch:它提供的是独立工具与本地代理端口。要让内置抓取也走这套路由,需要额外注册 ctx.web 抓取提供方。

许可

MIT
预览分享卡片长什么样 ↓Lequait/dsh-proxy-router
分享 · DeepSeek Harness Hub
Lequait/dsh-proxy-router

直连优先取回,失败自动切代理并记住路线

回到顶部