dsh-zcode-startplan
把 ZCode 赠送的免费 plan 接进模型选择器:多账号池轮换、按账号的限流与额度展示、bigmodel/zai 双渠道设备登录。
安装
dsh plugin --profile web add dsh-zcode-startplan
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-zcode-startplan
让 DSH(DeepSeek Harness) 用上 ZCode 赠送的免费 plan
(account:bigmodel-start-plan → https://zcode.z.ai/api/v1/zcode-plan/anthropic)。
- 多账号池:多账号轮换,面板内一键「使用」切换,账号级限流标记与余额可视化
- 每账号一个模型栏位(workbuddy 模式):模型选择器里一栏一个账号
(ZCode Start Plan · 主号),栏内模型固定消耗该账号额度(不自动换号),
多会话各吃各的;「统一选号」栏位可在面板一键隐藏/恢复
- 双渠道登录:
bigmodel(智谱开放平台)/zai(Z.AI),插件详情页内直接发起设备授权 - 额度可视到到期时间:剩余 / 计划名 / 到期(绝对时间 + 相对时长);
未生效的领取包用条纹条显示「X 起可用 · Y 到期」
- 面板内领取赠送额度:可领列表 + 一键领取(captcha 一次性、
1003幂等);
captcha 不可用时给「以调试模式重启」按钮,不用手抄 param
- Web UI 管理面板:挂在官方插件详情页的
plugins.bundle.config座位,零依赖手写组件 - 零运行时依赖:协议层移植自 bonus-plan-4-open-zcode,
但形态不同——它做的是 ZCode 插件(本地代理),这里直接实现 ctx.llm 适配器,
选号、captcha、切号、重试全在 DSH 进程内完成




DSH agent-loop
│ ctx.llm.stream({ provider: 'zcode-start-plan', model: 'GLM-5.3', … })
▼
本插件 NativeZcodeStartPlanAdapter
├─ 选号:手动顺序,跳过「该模型」当日限流中的账号
├─ captcha:默认不带;被 3007 拒了才产出("要了才取"),2 分钟内记住
├─ 组 body:官方身份块 + 日期块 + tools 缓存断点(3012 准入的三道闸门)
├─ 发车闸门:全局串行 + GLM-5.3 间隔 350ms
└─ 读首帧:200 但零内容 → 标记该账号×模型 → 换号重试(客户端零 chunk)
▼
zcode.z.ai/api/v1/zcode-plan/anthropic/v1/messages(直连)
安装
方式一:插件页直接装(最简单)
DSH Web UI 的插件页支持直接按 npm 包名安装:打开插件管理页 → 安装/添加插件 →
输入 dsh-zcode-startplan → 确认。宿主会自己从 npm 拉取并登记,无需任何命令行。
方式二:npm CLI 安装
包发布在 npm:dsh-zcode-startplan。
# 全局安装后得到 zcode-start-plan 命令(CLI 可独立于 DSH 使用:login / list / status) npm install -g dsh-zcode-startplan
把它装进 DSH profile:在 DSH 会话里调用官方安装器,target 传 npm 全局包的
实际目录(npm root -g 拼上包名):
$pkgDir = "$(npm root -g)\dsh-zcode-startplan" # 在 DSH 会话里:plugin_manager install_bundle,target = $pkgDir
方式三:从源码目录
git clone https://github.com/Venshell/dsh-zcode-startplan.git cd dsh-zcode-startplan # 1. 放到 plugins 目录 $dst = "$env:USERPROFILE\.dsh\plugins\dsh-zcode-startplan" robocopy . $dst /E /XD node_modules .git # 2. 用官方安装器登记 —— 在 DSH 会话里调用 plugin_manager install_bundle, # target 传 $dst 的绝对路径
装完后 profile 的 package.json 会自动出现:
{
"dependencies": { "dsh-zcode-startplan": "link:C:/Users/<you>/.dsh/plugins/dsh-zcode-startplan" },
"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-zcode-startplan"] } }
}
⚠ link: 安装下重启宿主才会加载新的 JS 模块代际(热重载只重建 entry,
不重新 import 已缓存的模块)。另外本插件安装目录若为实体拷贝,改完源码记得
robocopy 同步过去,否则宿主看到的永远是旧代码。
登录账号
方式一(推荐):Web UI 面板。重启宿主后打开 DSH 设置 → 插件 →
ZCode Start Plan 详情页,顶部「添加账号」:渠道下拉选 bigmodel 或 zai →
发起登录 → 浏览器完成授权 → 自动入池。
方式二:CLI(无需 DSH 在跑):
cd <插件目录> node bin/cli.mjs login # 默认渠道 bigmodel(智谱 bigmodel.cn) node bin/cli.mjs login --channel zai # zai(Z.AI · z.ai) node bin/cli.mjs list # 账号列表(脱敏,含来源渠道) node bin/cli.mjs status # 账号 + 余额 + 上游模型目录 + captcha 配置
两条渠道协议完全相同(同一个 /api/v1/oauth/cli/init 与 poll/{id}),
只在 provider(bigmodel / zai)与授权站点上不同。
已有 JWT 时可导入:
node bin/cli.mjs import .\zcode-jwt.txt --name <备注>
账号库在 %USERPROFILE%\.dsh\zcode-start-plan\accounts.db(SQLite,600)。
目录不可写时降级为内存库并在日志里明确告警。
Web UI 管理面板
插件详情页的「账号池管理」块(plugins.bundle.config 座位,按包名 key 派发):
- 账号列表:状态点、昵称(点击原位改名)、渠道(
bigmodel/zai)、限流 chips、余额条 - 使用:把该账号置顶 —— 池子的约定是手动顺序即选号优先级,置顶即
「下一次请求用它」;使用中的账号显示「使用中」并高亮
- 删除:二次确认后删除
- 显示在模型列表:每栏最右的开关控制该账号(及「统一选号」栏)是否出现在
模型选择器里。三颗开关(各账号栏 + 统一选号行)在视觉上对齐同一条竖线
(卡片栏距卡片边框 26px,统一行补 13px 内边距拉齐);tooltip 由动态文案改为
固定 aria-label「在模型列表中显示这一栏」,读屏/键盘行为一致
- 刷新:一个按钮搞定(列表+余额一次并行拉全)
- 额度条:已生效与未生效同形状,一句话同时给出剩余、计划名与到期时间
(绝对时间 + 相对时长,如 剩余 4298278/8000000 · GLM-5.3 · 23:59 到期(1 小时 20 分后));
未生效的领取包用条纹 + 半透明并写 23:00 起可用 · 10/27 09:00 到期,
不会被误看成「现在就能用的满格」
- 赠送额度领取:底部「赠送额度」区,按需展开(点「查看可领取」才打上游,
避免常驻轮询)。每账号一行可领取列表 + 「领取」按钮;captcha 不可用时
就地给出「以调试模式重启」
- 安全:面板与宿主之间走同源 fetch + loopback 路由,凭据永不出网关;
登录授权的 flowSecret 只留在宿主内存
赠送额度(领取)
GET /api/zcode-start-plan/claimable?id= → 先补活跃上报(不补则 preview 恒空),
再查可领列表;POST /api/zcode-start-plan/claim {id, planId?} → 逐 plan 领取。
三条来自上游实测的硬约束:
约束 · 违反后果 · 实现
captcha 一次性 · 复用同一个 param 必得 3007 · 每个 plan 循环内重新 mint
1003 = 已领过 · 报红让用户以为失败 · 视为幂等成功(标 alreadyClaimed)
mint 失败不能重试 · 连环重试烧设备信誉(有冷却惩罚) · 立刻停,且根本不发 claim 请求
⚠ captcha 复用 ZcodePlanClient.mintCaptcha(同一份串行队列)而不是另起一个 minter:
产出是设备级的,面板点击与推理链路同时要会互相踩 CDP 页面。
未生效的额度在 billing/balance 的 plans[].entitlements[] 里(带 effective_at),
不在 balances[] —— 只看后者会把「23 点才生效的包」显示成 0/0,看起来像领取失败。
在 DSH 里使用
1. 模型选择器里每个启用账号都是独立一栏:**「ZCode Start Plan · 主号」→
GLM-5.3 / GLM-5.3-Flash** —— 栏内模型固定消耗该账号的额度(额度尽明确报错,
不自动换号),多会话可各选各的账号栏
- 「ZCode Start Plan」统一栏位按置顶顺序自动选号;不需要时可在插件面板
「隐藏统一选号栏位」,随时可恢复
2. 会话里说「看一下 zcode start plan 的状态」→ 触发 zcode_start_plan_status
(返回路由、模型、账号数、每账号的限流标记、captcha 可达性、诊断字段
adapterRegistered / error)
captcha 需要宿主 Electron 的调试端口
先澄清一个高频误解:这个调试端口日常调用模型不需要。
captcha 在推理链路里是按需触发的 —— 只有被上游 3007 拒过、且在该
账号×模型的 2 分钟记忆窗口内,才会去产出一次。实测 captcha.reachable=false
且 captchaRequiredAccounts=0 时,对话完全正常。
只有「领取赠送额度」是硬性要求(claim 接口强制带 captcha 头,每个 plan 一个)。
captcha 是阿里云网页 SDK,必须在真实 https origin 里跑。插件通过 CDP 在宿主
renderer 里挂一个离屏隐藏 iframe(opacity:0、pointer-events:none、只增删自己的
元素、用完即移除),不碰界面。
打包态默认不开调试端口。三种开启方式,任选其一:
1. 面板按钮(最省事):插件详情页的「赠送额度」区,captcha 不可用时会直接出现
「以调试模式重启」,点一下 → 宿主带参数自动重开;脚本带
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:4,最后更新 2026-10-26