订阅额度模拟器(dsh-subscription-sim)
给 DeepSeek 假装一个「订阅制」,并且把 OpenAI ChatGPT 和 Anthropic Claude 两家的档位分开模拟: 每家一套独立订阅档位,额度用完之后模型请求会真的报错;你可以给自己派发「重置卡」立刻恢复。
所有额度与价格都是本机模拟的娱乐设定,不改变 DeepSeek 的真实计费,也不会真的扣费。
适用于 DSH 浏览器版与 Desktop 桌面版(两者内置同一套 Web GUI)。
两套订阅(额度为模拟值)
Anthropic Claude(5 小时会话额度 + 每周额度)
| 档位 | 价格 | 5 小时窗口 | 7 天窗口 |
|---|---|---|---|
| Free | $0 | 150,000 | 1,000,000 |
| Pro | $20/月 | 2,000,000 | 20,000,000 |
| Max 5× | $100/月 | 8,000,000 | 80,000,000 |
| Max 20×(默认) | $200/月 | 30,000,000 | 300,000,000 |
OpenAI ChatGPT(滚动窗口消息额度,按 tokens 模拟)
| 档位 | 价格 | 5 小时窗口 | 7 天窗口 |
|---|---|---|---|
| Free | $0 | 100,000 | 800,000 |
| Go | $8/月 | 500,000 | 4,000,000 |
| Plus | $20/月 | 2,500,000 | 20,000,000 |
| Pro | $200/月 | 30,000,000 | 250,000,000 |
| Pro Max | $500/月 | 60,000,000 | 500,000,000 |
2026 年 OpenAI 的 Pro 已拆成两档:Pro($200/月)与 Pro Max($500/月,含 Astra Ultrafast 极速档), ChatGPT 个人订阅现有 Free / Go / Plus / Pro / Pro Max 五档。
两个窗口都是滚动窗口,可在设置页里只开 7 天、或同时开 5 小时 + 7 天(至少保留一个)。
界面:状态与设置分离
- 主页面只显示状态:侧边栏底部「订阅」入口、输入框下方的额度条、右侧订阅面板 (档位/用量/自动释放倒计时、领取与使用重置卡、最近事件),以及额度耗尽时的全屏横幅。 主面板里不再有任何设置项。
- 所有配置在独立设置页:
设置 → 订阅额度,包括- 订阅方案:Claude / ChatGPT 两组档位,点击即切换(价格与模拟额度一目了然);
- 额度窗口:5 小时 / 7 天开关;
- 拦截设置:额度耗尽时是否真的拦截请求、压缩/会话标题等后台调用是否也计数;
- 自定义额度:分别设置 5 小时 / 7 天 tokens 上限;
- 危险区域:重置全部模拟数据;
- 存储:状态文件路径与最近一次保存状态。
额度耗尽时会发生什么
- 下一次模型请求被插件短路,产生真实的请求失败(
SUBSCRIPTION_QUOTA,HTTP 429 语义)—— 会话里出现报错行,而不是伪造的 UI 文案。 - 弹出一条全屏横幅:哪个窗口耗尽、已用/上限、多久后自动释放、还剩几张重置卡。
- 处理方式任选:点横幅「使用重置卡」立即清空被卡住的窗口;或等窗口滚动释放; 或去设置页换成更宽的档位。
重置卡是用户自助派发的:主面板「领取重置卡」按钮,默认 10 秒冷却、最多持有 9 张、初始 2 张,
都可以在配置里改。模型只有一个只读工具 subscription_status,不能替你领卡或用卡。
安装(分享给他人)
要求:DSH 浏览器版(web profile)或 Desktop 桌面版均可——界面由 DSH 内嵌的 Web GUI 提供,已在 0.2.1-rc.2 的浏览器版与 Desktop 上实测通过。插件包纯 JS、Host 端零依赖,不需要构建。
方式 A:从 npm 安装(推荐)
让对方的 DSH 会话执行(plugin_manager 工具,需 Full access):
plugin_manager action=install_bundle target="dsh-subscription-sim"
或命令行(装完要到 设置 → 插件 里选中启用 bundle;profile 按运行方式选:浏览器版通常 web,Desktop 为 desktop,用 Desktop 自带 CLI 时同样适用):
dsh plugin --profile web add dsh-subscription-sim # 浏览器版
dsh plugin --profile desktop add dsh-subscription-sim # Desktop
安装后刷新一次 Web 页面。想固定版本就写 dsh-subscription-sim@1.0.1。
方式 B:直接从 GitHub 安装
plugin_manager action=install_bundle target="github:wjlfish/dsh-subscription-sim"
或 dsh plugin --profile web add github:wjlfish/dsh-subscription-sim(同样需要启用 bundle)。
方式 C:克隆后按本地目录安装(开发用)
git clone https://github.com/wjlfish/dsh-subscription-sim.git
# plugin_manager action=install_bundle target=/abs/path/to/dsh-subscription-sim
安装/更新后:
- 刷新一次 Web 页面(浏览器半边只在页面重新加载时装载);
- 如果设置页提示「版本不匹配」,说明 Host 半边还停在旧版本,重启一次
dsh即可; - 额度状态保存在每个人自己的
$DSH_HOME/plugin-data/dsh-subscription-sim/state.json, 不会随仓库分发,也不会上传任何数据(插件不联网,只统计本机模型调用的 usage)。
开发与测试
node --test 'test/*.test.mjs' # 110 项单元/静态/mock-render 测试,Node >= 22
仓库结构:index.js + lib/(Host:额度引擎、llm/stream 拦截、HTTP API、模型工具)、
client.js(Web UI:三块状态界面 + 独立设置页)、locale/(插件列表元数据)、
cordis.patch.yml(bundle 默认配置)、test/(测试)、CONTRACT.md(实现契约)、
VERIFICATION.md(独立验收报告)。
配置
在 $DSH_HOME/profiles/web/cordis.patch.yml 中覆盖插件行配置(行 id 为 subscription-sim):
- id: subscription-sim
name: 'dsh-subscription-sim'
config:
vendor: claude # 默认订阅方:claude | openai(仅首次安装/无状态时生效)
plan: max20x # 默认档位(同上)
windows:
h5: true # 是否启用 5 小时窗口(可只开 7 天)
d7: true # 是否启用 7 天窗口
enforce: true # false = 只统计不拦截
countAuxiliary: true # 压缩 / 会话标题等后台调用是否也计数并拦截
cards:
initialHeld: 2 # 首次安装时赠送的重置卡
maxHeld: 9 # 重置卡持有上限
claimCooldownSeconds: 10 # 领卡冷却(秒)
claimBatch: 1 # 每次领几张
stateFile: '' # 留空使用默认路径(见下)
数据文件:$DSH_HOME/plugin-data/dsh-subscription-sim/state.json(损坏时自动备份为
state.json.corrupt-<时间戳> 并以全新状态启动;v1 旧状态会自动迁移为「Claude / Max 20×」)。
实现方式(给好奇的人)
- Host 半边监听
llm/streamwaterfall({ global: true, prepend: true }),在每次模型调用 前检查两个窗口的滚动用量;额度用尽时短路返回一个终态finishchunk (reason.kind = 'error',failure.code = 'SUBSCRIPTION_QUOTA'),从而产生一条真实的 请求失败,而不是伪造 UI 文案。 - 每次流里的
usagechunk(input/output/cache tokens)累计进按分钟分桶的账本; 5 小时 / 7 天窗口都是对账本做滚动求和,所以额度会随时间自然释放。 - 重置卡只会清空对应窗口的账本桶,
lifetime累计值不会被清掉。 - 客户端是纯 JS 的 Web 插件:主页面三块状态 UI(侧边栏入口 / composer 额度条 / 全屏面板 + 耗尽横幅)
- 一个
settings.section设置页;数据全部来自本地POST /subscription-sim/api,每 4 秒轮询。
- 一个
自检
两个内部诊断动作(不是普通用户操作入口):
probe:真的发起一次最小模型调用,验证「额度拦截 → 恢复」整条链路,返回probe.blocked/probe.failure.code(正常时应为blocked: false并返回 chunk 序列)。arm-simulate-block:装填一次「模拟拦截」,让下一次模型请求以额度耗尽错误失败一次。
两者都走 POST /subscription-sim/api。该路由和其它 /api 路由一样受本机连接鉴权保护
(需要浏览器会话 cookie),curl 直接请求会得到 403(这是鉴权,不是插件故障)。
完整验收命令与结论见 VERIFICATION.md。
已知限制
- 额度是模拟值,不映射真实 DeepSeek / OpenAI / Anthropic 价格;两家的真实限额机制 (Claude 的 5 小时会话 + 每周额度、ChatGPT 的按模型消息条数)被统一近似为「tokens 滚动窗口」。
- Tokens 计数来自当前进程内所有模型调用(含子 Agent、工作流、压缩、会话标题,可按配置排除后台调用), 共用同一份「账户额度」。
- 界面通过 DSH 内嵌的 Web GUI 提供:浏览器版与 Desktop 桌面版均可(两者已在
0.2.1-rc.2实测);TUI / headless 等无该界面的运行方式不可用。浏览器版与 Desktop 共用同一$DSH_HOME,因此额度状态也是同一份。
No comments yet. Be the first to write one.