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

多智能体网关 a1141171521/dsh-multi-agent-gateway

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

Free Token —— 把各平台的免费额度,装进 DSH 的模型选择器。

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

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

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-multi-agent-gateway(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/27 23:43:43

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 56 处,展示前 48 条)
  • 写入剪贴板
    lib/client.js:3361
    navigator.clipboard.writeText(text).then(
  • 读取本地文件
    lib/core/http.js:38
    const raw = readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
  • 发起网络请求
    lib/core/http.js:99
    response = await fetch(url, {
  • 写入本地文件
    lib/core/store.js:31
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/core/store.js:33
    writeFileSync(temp, JSON.stringify(value, null, 2), 'utf8')
  • 写入本地文件
    lib/core/store.js:34
    renameSync(temp, path)
  • 读取本地文件
    lib/core/store.js:40
    if (!statSync(path).isFile()) return fallback
  • 读取本地文件
    lib/core/store.js:45
    return JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    lib/core/store.js:50
    renameSync(path, `${path}.corrupt`)
  • 写入本地文件
    lib/core/store.js:140
    mkdirSync(dirname(this.path), { recursive: true })
  • 写入本地文件
    lib/core/store.js:141
    appendFileSync(this.path, `${JSON.stringify(record)}\n`, 'utf8')
  • 读取本地文件
    lib/core/store.js:153
    const raw = readFileSync(this.path, 'utf8')
  • 读取本地文件
    lib/core/store.js:184
    return readFileSync(this.path, 'utf8').split('\n').filter((line) => line.trim() !== '').length
  • 删除本地文件
    lib/core/store.js:208
    unlinkSync(this.path)
  • 执行外部命令固定命令
    lib/core/updater.js:136
    execFile(
  • 读取本地文件
    lib/core/updater.js:395
    const raw = readFileSync(join(dir, 'package.json'), 'utf8')
  • 读取本地文件
    lib/core/crypto.js:78
    if (existsSync(this.keyPath)) {
  • 读取本地文件
    lib/core/crypto.js:79
    const parsed = JSON.parse(readFileSync(this.keyPath, 'utf8'))
  • 写入本地文件
    lib/core/crypto.js:85
    mkdirSync(dirname(this.keyPath), { recursive: true })
  • 写入本地文件
    lib/core/crypto.js:88
    writeFileSync(this.keyPath, JSON.stringify(payload, null, 2), { mode: 0o600 })
  • 写入本地文件
    lib/core/crypto.js:90
    chmodSync(this.keyPath, 0o600)
  • 读取本地文件
    lib/core/crypto.js:100
    return this.masterKey !== null || existsSync(this.keyPath)
  • 读取本地文件
    lib/adapters/raccoon.js:367
    if (!existsSync(path)) continue
  • 读取本地文件
    lib/adapters/raccoon.js:368
    const token = readRaccoonTokenFromAuthFile(JSON.parse(readFileSync(path, 'utf8')))
  • 读取本地文件
    lib/vendor/qoder/qoder-wasm.js:420
    const bytes = readFileSync(WASM_PATH)
  • 读取本地文件
    src/adapters/raccoon.ts:367
    if (!existsSync(path)) continue
  • 读取本地文件
    src/adapters/raccoon.ts:368
    const token = readRaccoonTokenFromAuthFile(JSON.parse(readFileSync(path, 'utf8')))
  • 读取本地文件
    src/core/crypto.ts:78
    if (existsSync(this.keyPath)) {
  • 读取本地文件
    src/core/crypto.ts:79
    const parsed = JSON.parse(readFileSync(this.keyPath, 'utf8')) as MasterKeyFile
  • 写入本地文件
    src/core/crypto.ts:85
    mkdirSync(dirname(this.keyPath), { recursive: true })
  • 写入本地文件
    src/core/crypto.ts:88
    writeFileSync(this.keyPath, JSON.stringify(payload, null, 2), { mode: 0o600 })
  • 写入本地文件
    src/core/crypto.ts:90
    chmodSync(this.keyPath, 0o600)
  • 读取本地文件
    src/core/crypto.ts:100
    return this.masterKey !== null || existsSync(this.keyPath)
  • 读取本地文件
    src/core/http.ts:38
    const raw = readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
  • 发起网络请求
    src/core/http.ts:99
    response = await fetch(url, {
  • 写入本地文件
    src/core/store.ts:31
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    src/core/store.ts:33
    writeFileSync(temp, JSON.stringify(value, null, 2), 'utf8')
  • 写入本地文件
    src/core/store.ts:34
    renameSync(temp, path)
  • 读取本地文件
    src/core/store.ts:40
    if (!statSync(path).isFile()) return fallback
  • 读取本地文件
    src/core/store.ts:45
    return JSON.parse(readFileSync(path, 'utf8')) as T
  • 写入本地文件
    src/core/store.ts:50
    renameSync(path, `${path}.corrupt`)
  • 写入本地文件
    src/core/store.ts:140
    mkdirSync(dirname(this.path), { recursive: true })
  • 写入本地文件
    src/core/store.ts:141
    appendFileSync(this.path, `${JSON.stringify(record)}\n`, 'utf8')
  • 读取本地文件
    src/core/store.ts:153
    const raw = readFileSync(this.path, 'utf8')
  • 读取本地文件
    src/core/store.ts:184
    return readFileSync(this.path, 'utf8').split('\n').filter((line) => line.trim() !== '').length
  • 删除本地文件
    src/core/store.ts:208
    unlinkSync(this.path)
  • 执行外部命令固定命令
    src/core/updater.ts:136
    execFile(
  • 读取本地文件
    src/core/updater.ts:395
    const raw = readFileSync(join(dir, 'package.json'), 'utf8')
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

README

由 DeepSeek 最新模型翻译生成
dsh-multi-agent-gateway Free Token —— 把各平台的免费额度,装进 DSH 的模型选择器。 一个插件管起所有「AI Agent 平台」的账号:统一账号管理、每日签到、额度/积分拉取、多账号智能路由;把各平台的模型按平台分组上报到 DSH 对话框的原生模型选择器,并在每个模型名后标注积分消耗倍率。七个平台的适配器已全部实现。 不是独立 Nginx,也不是外部代理进程 —— 请求全部在插件内部转发,账号凭证只存在本机。 (本地 OpenAI 兼容网关属于后续计划,见路线图。) 理念:Free Token 各平台为了拉新,会持续放出免费额度:OpenCode 的匿名免费层、Qoder / WorkBuddy 的每日签到积分、Trae 的赠送额度……这些「免费 token」分散在七个客户端里,每个都要单独登录、单独签到、单独查余额,最后往往是放着过期。 这个插件的立场很简单: - 免费额度不该被浪费,也不该被平台 UI 绑架 —— 账号收进来、模型接进 DSH、签到与额度查询自动跑; - 默认不烧钱 —— 模型默认一个都不勾,勾选并保存后才出现在选择器里(见 docs/MODELS.md §6.5),避免「白嫖」变成「意外扣费」; - 福利跟进是长期承诺 —— 哪个平台出了新的免费模型或签到活动,适配器就跟着更新。
展开完整文档(README 剩余 1 节)
dsh-multi-agent-gateway

Free Token —— 把各平台的免费额度,装进 DSH 的模型选择器。

一个插件管起所有「AI Agent 平台」的账号:统一账号管理、每日签到、额度/积分拉取、多账号智能路由;把各平台的模型按平台分组上报到 DSH 对话框的原生模型选择器,并在每个模型名后标注积分消耗倍率。七个平台的适配器已全部实现。

不是独立 Nginx,也不是外部代理进程 —— 请求全部在插件内部转发,账号凭证只存在本机。
(本地 OpenAI 兼容网关属于后续计划,见路线图。)

理念:Free Token

各平台为了拉新,会持续放出免费额度:OpenCode 的匿名免费层、Qoder / WorkBuddy 的每日签到积分、Trae 的赠送额度……这些「免费 token」分散在七个客户端里,每个都要单独登录、单独签到、单独查余额,最后往往是放着过期。

这个插件的立场很简单:

- 免费额度不该被浪费,也不该被平台 UI 绑架 —— 账号收进来、模型接进 DSH、签到与额度查询自动跑;
- 默认不烧钱 —— 模型默认一个都不勾,勾选并保存后才出现在选择器里(见 docs/MODELS.md §6.5),避免「白嫖」变成「意外扣费」;
- 福利跟进是长期承诺 —— 哪个平台出了新的免费模型或签到活动,适配器就跟着更新。
各平台接口并不公开,我们坚持逐个真机验证,而不是照抄文档。

一句话:能白拿的 token,一个都别浪费;拿不到的时候,我们自己写适配器。

界面:五页 + 浏览器登录

设置页现在是独立一页(设置 → Free Token),内部按「你此刻要回答的问题」分五页:

| 页 | 回答什么问题 |
| 总览 | 现在健康吗?刚才那条花了多少? |
| 账号 | 这个平台有哪些账号 / 模型? |
| 任务 | 签到和活动任务跑得怎么样? |
| 日志 | 刚才那次为什么失败? |
| 设置 | 那些不常动的东西(含版本更新) |

添加账号不用手抄 token:账号页点「打开登录页」→ 浏览器里完成平台登录 → 回来稍等几秒(会自动轮询),或点「刷新登录状态」→ 插件自己去换 token 并建账号(token 不经过浏览器,加密落盘)。

| 平台 | 登录形态 |
| OpenCode | 设备码(显示 user_code,前端自动轮询) |
| WorkBuddy / 国际版 | 外链(auth/state → 打开登录页 → auth/token?state=) |
| Qoder / Qoder CN | 设备码 + PKCE |

两种形态都会自动轮询(3~5 秒一次):浏览器里授权完成后回来即可看到变绿;「刷新登录状态」只是手动补充入口,不是必点步骤。

模型表按「免费 → 厂商 → 倍率」排序,默认一个都不勾 —— 勾选并「保存并生效」之后才进选择器;还没勾过时可以点「按推荐预选」(OpenCode 推免费,其余平台推全部)。
每行可单独改上下文长度、可单独「测一次」,状态列显示 可用 / 地区受限 / 不可用 / 未探测。
上游声明了思考档位的模型,选择器里还能选 off / low / medium / high…。

💬 DeepSeek Harness 插件交流群

欢迎加入 DeepSeek Harness 插件交流 QQ 群——插件开发、模型接入、推理档位、第三方厂商配置等话题都可以在这里交流,本插件的问题与建议也欢迎直接进群反馈:

🐧 QQ 群号:1105449571

打开 QQ → 搜索群号 1105449571 即可加入(进群请备注「dsh 插件」)

群内可交流:插件开发经验、模型接入与档位配置、DSH 使用技巧、新功能需求投票等。

它解决什么

| 你现在的麻烦 | 这个插件怎么办 |
| 有五六个平台、十几个账号,每个平台一套登录/签到/查额度 | 一个配置页全管起来,按平台分组 |
| 某个号限流了 / 额度用完了,会话当场报错 | 同 Agent 内自动换号重试,用户无感 |
| 每天要手动去点签到、领活动任务积分 | 定时任务自动跑,流水可查 |
| 模型下拉里一堆同名模型,看不出哪个贵 | 按 Agent 分组,后面缀 (×2) / (免费) |

支持情况

七个平台的适配器全部实现,没有一个是「占位骨架」:

| Agent | 签到 | 额度 | 模型目录 | 对话 | 备注 |
| OpenCode | 上游无 / 可配 | ✅ | ✅ | ✅ 流式 + 思维链 | 匿名免费层零凭证可用;签到接口可填 checkInPath |
| Qoder | ✅ | ✅ | ✅ | ✅ | 签到 /sash/api/v1/me/campaigns、额度 /sash/api/v2/me/usage |
| Qoder CN | ✅ | ✅ | ✅ | ✅ | 同上,独立产品线与账号体系 |
| WorkBuddy | ✅ | ✅ | ✅ | ✅ | 签到 + 余额 + 会话头校验 |
| WorkBuddy 国际版 | 上游无 | ✅ | ✅ | ✅ | 上游确实没有签到接口,如实回报「不支持」 |
| Trae | ✅ | ✅ | ✅ | ✅ 流式 | 协议层已实现,默认隐藏(尚未真机验证),显式配置后可启用 |
| 商汤小浣熊 | ✅ 登录积分发放 | ✅ 积分 | ✅ | ✅ 流式 + 思维链 + 工具调用 | 零配置:自动读客户端登录态;10 个模型,其中 3 个 ×0 免费。见 docs/RACCOON-API.md |

关于签到与活动任务:opencode.ai 官方 Console 没有签到接口,国内反代平台则常见「签到 + 活动任务」形态。所以本插件把接口路径做成可配置的:填了 upstream.checkInPath / tasksPath 就真去调;没填就明确回报「上游没有这个接口(这不是故障)」,绝不伪造签到结果。详见 docs/OPENCODE-API.md。

「免费模型不要 key」——对,插件做到了一个字段都不用填

不登录、不填 API key、不填凭证 —— 账号卡片里只填一个标签就完事,在模型选择器里选 OpenCode · xxx (免费) 就能直接聊。

以前会 403、现在能过,原因在这里:上游那句 FreeTierError("can only be used from within OpenCode")是营销话术,它实际校验的是请求形状。消融实验实测出过门三件事:

| 条件 | 去掉会怎样 |
| stream: true | 403 —— 免费层只接受流式 |
| 请求里有一个叫 read 的工具 | 403 |
| 规范的 x-opencode-session(ses_… 降序编码) | 403 |

其余(Authorization、x-opencode-request、x-opencode-project)去掉照样过。

插件在「账号没有 key」时自动补齐这三样(upstream.freeTierMode: 'auto' 默认值),stream: true 本来就是它的固定行为,read 工具 DSH 本来就发 —— 所以是真的零配置。机制细节、实测报文、消融表见 docs/OPENCODE-API.md §1.5–1.6。

实测证据(npm run test:free):空凭证账号 → 200 → 正文「收到」+ reasoning_content + usage,全程没有任何 key。

边界:匿名通道只对免费模型有效;付费模型在它上面会直接 401 Missing API key。要用付费模型就走登录/API key。上游随时可能再改门禁 —— 被拒时错误信息会把那三件事列出来,不会让你瞎试。

另外:模型目录完全免凭证,所以模型选择器里的分组与倍率一个账号都不加也能显示,只是发不出请求。

Trae 为什么默认隐藏:适配器本身是能跑的(协议层、签到、余额、流式对话都实现了),但本机没有 Trae 账号、没有一次真上游验证 —— 露出来只会让你点到一个没验证过的东西。真机验证通过后,把 trae 加进 src/config.ts 的 DEFAULT_VISIBLE_AGENTS 即可显示,别处不用改。

扩展方法见 docs/EXTENDING.md:新增一个平台只需加一个适配器文件 + 在 adapters/index.ts 加一行,核心调度一行都不用改。

路线图

| 方向 | 说明 | 状态 |
| 新平台 / 新福利跟进 | 哪个平台放出新的免费模型、签到活动或赠送额度,就补对应适配器;接口以真机验证为准 | 持续进行 |
| 本地 OpenAI 兼容网关 | 增加本地端点(POST /v1/chat/completions、GET /v1/models),让 Cursor / VS Code / 任意 OpenAI SDK 也能用上这些账号与免费模型;端口可配、默认只绑 127.0.0.1 | 规划中,未发布 |
| 界面与可用性 | 五页设置界面 + 左侧导航入口,继续打磨 | 持续进行 |

现阶段它是 DSH 插件,不是独立服务:请求由宿主进程调进来、在进程内转发。等网关功能落地后,才会额外暴露一个可被外部客户端直连的端点。

快速开始

1) 装进当前 profile(会自动应用 bundle patch)从 GitHub 装:
dsh plugin --profile desktop add github:a1141171521/dsh-multi-agent-gateway
或从本地源码目录装(开发用):
dsh plugin --profile desktop add D:\AI\DeepseekPlugin\dsh-multi-agent-gateway

2) 重启 DSH 桌面端(客户端 bundle 要重新加载)

3) 打开 设置 → 插件 → Free Token,填账号

详细步骤见 docs/INSTALL.md。

文档地图

| 文档 | 内容 |
| docs/INSTALL.md | 安装 / 卸载 / 升级 / 目录结构 / 常见安装问题 |
| docs/USAGE.md | 添加账号、看积分、配自动任务、调账号路由 |
| docs/MODELS.md | 模型分组与倍率标签是怎么进到 DSH 原生选择器的 |
| docs/OPENCODE-API.md | OpenCode 上游的真实接口事实(含核对过的端点表) |
| docs/EXTENDING.md | 新增一个 Agent 适配器要写什么(含完整模板) |
| docs/ERROR-HANDLING.md | 账号降级、重试规则、任务失败与熔断 |
| docs/KNOWN-ISSUES.md | 已知问题 / 待修清单(含验证步骤与排查顺序) |
| docs/NEXT-PHASE.md | 后续计划与暂缓项(含网关功能的前置条件) |

架构(分层模块化)

┌──────────────────────── DSH ────────────────────────┐
对话请求 ──▶ ctx.llm ──▶ src/llm/adapter.ts(每 Agent 一个 provider 路由) │ │ │ │ ▼ │ 模型选择器 ◀───────────│ src/runtime.ts(总装:模型缓存 / 分组 / 倍率标签) │ │ │ │ 客户端配置页 ◀─ src/remote.ts ─┼─▶ core/router.ts 多账号路由(换号/降权/恢复)│ │ ├─▶ core/scheduler.ts 定时任务管理器 │ │ ├─▶ core/tasks.ts 活动任务引擎 │ │ └─▶ core/accounts.ts 账号(AES-256-GCM)│ │ │ │ │ ▼ │ 工具 ◀────────────────┘ src/adapters/*.ts(每 Agent 一个适配器) │ └────────────────────────────────────────────────────┘

新增 Agent 只需要在 src/adapters/ 加一个文件 + 在 adapters/index.ts 加一行。 核心调度(路由 / 定时 / 任务 / 网关 / UI)一行都不用改。

数据落在哪

默认 <DSH_HOME>/multi-agent-gateway(DSH_HOME 一般是 ~/.dsh):

| 文件 | 内容 | 丢了会怎样 |
| .master-key | AES-256-GCM 主密钥(0600) | 账号密文再也解不开,要重录 |
| accounts.enc.json | 账号与凭证(整份加密) | 要重录账号 |
| state.json | 额度缓存、健康、模型缓存、任务游标(明文、无敏感信息) | 重算,无损失 |
| task-log.jsonl | 任务执行流水(可删) | 历史记录没了 |

安全边界(说清楚,不吹):密文与密钥分文件,防的是「配置被云同步 / 被 grep 到明文 token / 备份泄露」。它不是硬件密钥库 —— 能读该目录的本机进程同样能读密钥。

开发

node scripts/build.mjs # TypeScript → lib/(零依赖,用 Node 自带的类型擦除)
npm test # 宿主测试 666 + 客户端契约 85 + 冒烟
node test/live-opencode.mjs # 真机管线:打真实 OpenCode 目录核倍率(需要联网,只读公开接口)

改完 src/ 必须重新构建(lib/ 是产物);改完 client/ 也要重跑构建,然后重启 DSH(宿主在启动时扫描 dsh.client 声明)。

已验证

| 验证 | 结果 |
| node scripts/build.mjs | 58 个 TS 文件 → lib/,零不可擦除语法 |
| 宿主测试(npm test) | 666/666 通过(核心 + 七个适配器 + 推理档位 + 签到记账 + 额度刷新 + 日志采样 + 错误分类) |
| 客户端契约测试 | 85/85 通过(端点、描述符、volatile 路径、真 apply(ctx)、无参端点零参数、真渲染 ModelList、登录弹框五态、请求日志三态账号与失败分类) |
| 假宿主冒烟 | 通过(provider 路由 / 5 个工具 / 模型上报策略真的改变选择器内容 / 密文落盘) |
| 真机免费层(npm run test:free,联网) | 空凭证账号 → 200 → 正文「收到」+ 思维链 + usage,全程零 key |
| 真机管线(npm run test:live,联网) | 真实模型目录 + 倍率;设备码登录实测发起成功、未授权正确返回 pending |
| 真实 DSH 进程(headless profile) | 通过(零 did not activate、零配置校验错误) |
| 真实浏览器(Edge + 真 web profile) | 通过 —— 客户端 bundle 在 boot combo 里、apply 正常激活、控制台零本插件错误 |

模型不是全塞进去:默认一个都不报

上游实测 85 个模型,全进下拉的话免费那几个会被淹没。所以每个 Agent 有一份上报策略(设置页里是三个按钮 + 一个带搜索的勾选列表):selected(默认,不勾不报)/ free / all。勾选只是草稿,点「保存并生效」才真正写配置并重发 provider。
详见 docs/MODELS.md §6.5。

📣 加入交流

对 DeepSeek Harness 插件开发、多平台模型接入感兴趣?欢迎加入交流群一起讨论:

QQ 群:1105449571(QQ 内搜索群号即可加入,进群请备注「dsh 插件」)

群内分享:插件开发经验、模型接入与倍率配置、多账号管理与路由调优、DSH 使用技巧。
如果这个插件帮到了你,也欢迎进群反馈问题、提建议、参与新功能投票 🌟

License

MIT
预览分享卡片长什么样 ↓a1141171521/dsh-multi-agent-gateway
分享 · DeepSeek Harness Hub
a1141171521/dsh-multi-agent-gateway

Free Token —— 把各平台的免费额度,装进 DSH 的模型选择器。

回到顶部