dsh-save-money

33Star2Fork1Issue0Watching

按时间窗口自动暂停/恢复 DSH 模型请求,应对 DeepSeek 峰谷分时计价并可按模型档位豁免。

机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
main
dshdsh-plugindsh-plugins

安装

$ dsh plugin --profile web add github:zhu168/dsh-save-money

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 zhu168/dsh-save-money:先查看仓库 https://github.com/zhu168/dsh-save-money.git 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

按自定义时间窗自动暂停/恢复 DSH 的模型请求,应对 DeepSeek 等大模型 API 的峰谷分时计价;窗口内 AI 不会发出任何请求、不产生费用,窗口结束自动接着跑,配置按模型档位生效。

核心能力

  • 按时间窗口自动暂停:到达暂停时刻后正在运行的活跃任务会被冻住(进度原样保留),窗口结束自动恢复;没有活跃任务则不创建暂停记录
  • 暂停窗口内完全静默:在窗口期间拦截模型流(llm/stream),所有匹配档位的请求挂起等待,窗口结束再放行,不产生任何 API 费用
  • 按模型档位豁免:默认只对官方 DeepSeek 的 flash / pro 两档生效;opencode go·zen flash / pro 与其他任何无法识别的第三方模型一律豁免,不会阻塞请求
  • 配置持久化:所有设置自动落盘到工作区文件 save-money.config.json,重启 / 浏览器刷新后保留;余额采样历史持久化到 ~/.dsh/dsh-save-money-balance.json(按 API key 指纹标识,换 key 自动作废旧历史)
  • 可选的 DeepSeek 余额与消费图:开启「显示余额」后头部状态文字旁显示官方账户余额;后端每 5 分钟采样一次,悬停余额可见最近 1 小时 / 10 分钟 / 24 小时消费金额,点击余额弹出最近 8 小时、每 10 分钟一根的消费柱形图
  • 一键 DeepSeek 分时计价策略:自动补上 08:58–12:02、13:58–18:02 北京时间高峰窗口(暂停提前 2 分钟、继续延后 2 分钟留余量),不自动启用,由你决定是否勾选

技术实现

  • 语言: TypeScript(tsconfig.json 严格模式;src/ 下 17 个 .ts + 6 个 .tsx
  • 关键依赖: 无运行时第三方依赖;构建期仅 devDependencies 包含 typescript ^5.9.3package.json:17),不引入任何 npm 库
  • 架构模式: 官方 dual-half 插件。Host half 通过 cordis.patch.yml 注入 id: save-money 行;在 ctx.on('llm/stream', ..., { global: true }) 处包裹模型流作为请求级闸门,配合 ctx.get('goals').pause/resume 在暂停/恢复时冻结与还原活跃任务。Client half 通过 plugin/package.json#dsh.client 挂到 web profile,会话头部右上角常驻状态文字、浮动横幅与设置页自动加载。10 种语言文案在 src/i18n/*,构建时内联;React UI 走 DSH 主题变量 --dsw-* 跟随机亮 / 暗主题
  • 入口文件: Host 入口 src/host.tsapply),构建后产出 plugin/index.js;Client 入口 src/client.ts,构建后产出 plugin/client.js;挂载声明 plugin/cordis.patch.yml(bundle 安装插入 1 行 Loader)

适用场景

当 DSH 用户希望压低 DeepSeek 等大模型 API 的高峰期账单,又不想错失自动化长任务时:把白天高峰时段设为暂停窗口,让插件在窗口开始时冻住正在跑的任务、挂起新请求,窗口结束再无缝继续——尤其适合需要长时间无人值守、批量处理任务的场景;同时想要可视化消费走势、设置按模型档位豁免 OpenCode 订阅或第三方中转、不再担心临时忘记重启用开关。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness (DSH)未声明package.json 未声明 engines / peerDependencies;以官方 dsh plugin 形态安装,依赖宿主提供 timer / agents / goals / fs / sessions / webServer / credentials / subprocess 等服务
Node.js未声明仓库未声明 engines;构建脚本使用 node:fs / node:path / node:url / node:test 等内置模块,运行 DSH Web profile 的 Node 版本即可
平台跨平台tsconfig.json#compilerOptions.target = ES2022;源码使用 Intl.DateTimeFormat + IANA 时区(含 DST ±12/±13 边界如 Pacific/Auckland),无平台特定代码
原生模块第三方依赖全部为零;不引入 node-pty / node:sqlite 等原生模块
时区任意 IANA 名设置面板提供 24 个代表时区下拉 + 24 个 IANA 时区候选,Asia/Shanghai 为默认;窗口可单独覆盖时区

安装方式

dsh plugin --profile web add github:zhu168/dsh-save-money

配置项

所有配置通过 设置 → 省钱插件(侧栏) 或 会话头部右上角 "省钱 · 🟢 工作中" 浮层可视化编辑;下方为可调字段一览(节选自 src/config.ts:26-58,所有字段均在 applyConfig 中按 schema 校验后即时自动保存)。语言跟随浏览器或手动选择(auto / zh / zh-TW / en / de / fr / es / it / pt / ja / ko 共 10 种)。

配置类型说明默认值
启用boolean总开关:勾选后插件才会按窗口暂停 / 恢复请求;取消勾选立即释放闸门等待者false(未启用)
时区IANA 名窗口与状态时钟所参照的时区;切换时区会自动换算窗口时间(夏令时感知,例 北京 08:58 夏季对应伦敦 01:58、冬季 00:58)Asia/Shanghai
提前提醒(分钟)number(>=0)距下次暂停还有多少分钟时进入「即将暂停」状态并在顶部显示黄色提醒横幅5
启动时尝试恢复暂停中的任务boolean启动时如果发现之前因崩溃残留的 paused 目标,自动 resume —— 任何任务都不应跨重启被永久冻结true
显示余额boolean头部状态文字旁显示 DeepSeek 官方账户余额 + 悬停卡 + 8 小时消费柱形图;关闭后采样也停止、不再访问 /user/balancefalse(不显示)
模型档位:官方 flashboolean勾选 = 窗口内暂停官方 DeepSeek flash 模型的请求;不勾选 = 豁免(即使在窗口内也放行)true
模型档位:官方 proboolean勾选 = 窗口内暂停官方 DeepSeek pro 模型的请求;不勾选 = 豁免true
模型档位:opencode flashboolean勾选 = 窗口内暂停 opencode go/zen flash 模型请求;不勾选 = 豁免false
模型档位:opencode proboolean勾选 = 窗口内暂停 opencode go/zen pro 模型请求;不勾选 = 豁免false
暂停窗口array<{时间, 星期, 时区}>自定义一组暂停 / 继续时间(HH:mm,支持跨午夜如 23:00–08:00);同组星期(1=周一…7=周日)筛选;单窗口可选独立时区。默认留空时设置面板预填 DeepSeek 高峰 08:58–12:02、13:58–18:02 北京时间[]
一键 DeepSeek 分时计价策略button不修改启用开关;按当前所选窗口视图去重追加 08:58–12:02、13:58–18:02 北京时间高峰窗口
结束本次省钱模式button一次性跳过当前这一个暂停窗口:已暂停则立即恢复、即将暂停则取消本次;持久化的「启用」开关不会被关掉

常见问题

Q: 安装后状态文字 / 浮动横幅 / 设置页都没出现,怎么办?

A: 必须完全重启 DSH(Ctrl+C 停掉再启动)并强制刷新浏览器(Ctrl+Shift+R),插件界面在启动时挂载。仍不出现说明用的是 v1.2.4 之前的旧构建——升级即可(README.zh.md:304)。

Q: 「启用」勾选不上、设置项点不动,是 bug 吗?

A: 不是。早期版本(v1.2.5 之前)在部分机器上插件会比 Web 服务先就绪,界面请求到不了插件。当前 1.4.3 已修复——等待 webServer 就绪后再注册 HTTP 端点(README.zh.md:305 / src/host-http.ts:23-63)。

Q: 这个插件会暂停所有模型调用吗?第三方模型会被暂停吗?

A: 默认只暂停官方 DeepSeek 的 flash / pro 两档;opencode go·zen flash / pro 与其他任何无法识别为官方 flash/pro 或 opencode flash/pro 的模型一律豁免,绝不阻塞请求。识别不到的 provider(如其他第三方中转、旧名 deepseek-chat / deepseek-reasoner)永远不会卡住你的请求(src/balance-bars.ts:53-63)。

Q: 数据存放在哪里?删除后会发生什么?

A: 设置文件落在工作区的 save-money.config.json(gitignored);余额采样历史存于 ~/.dsh/dsh-save-money-balance.json(按 API key 指纹标识,换 key 自动作废旧历史)。删除前者即恢复默认;删除后者清空消费统计(src/config.ts:57-58 / src/balance-tracker.ts:81-100)。

Q: 暂停窗口开始后,正在跑的任务会不会丢失?

A: 不会。正在执行的活跃任务会被安全「冻住」(进度原样保留),窗口结束自动恢复接着跑;如果此刻没有活跃任务,插件不会创建暂停记录(src/host-goals.ts:63-90 / src/host.ts:151-155)。

Q: 「结束本次省钱模式」按钮会把整个插件关掉吗?

A: 不会。该按钮是只跳过当前这一个暂停窗口(已暂停则立即恢复、即将暂停则取消本次),下一次窗口(今天或以后)照常生效,且不会改动持久化的「启用」开关(src/state.ts:50-79 / src/host.ts:348-366)。

Q: 余额数字显示很怪——切了模型就消失了?

A: 余额只对官方 DeepSeek(provider 为 deepseek-official)生效;当你切到 OpenCode / 第三方模型时余额会自动隐藏,但已采样的消费统计不会被清除,切回 DeepSeek 后余额立即恢复(src/balance-tracker.ts:178)。

Q: 如何卸载?卸载后设置还在吗?

A: dsh plugin --profile web remove dsh-save-money,重启 DSH。配置文件 save-money.config.json 留在原目录里——卸载 / 重装不会动它,想恢复默认就手动删除该文件(README.zh.md:238 / README.zh.md:306)。

上手难度

入门 — 安装后只需重启 DSH 并强制刷新浏览器,会话头部右上角即出现「省钱」状态文字;点击进入设置后,按一键 DeepSeek 分时计价策略 + 勾选「启用」即可生效,不必关心内部闸门 / 目标冻结 / 时区换算等机制。

已知问题与限制

  • 暂停生效范围仅限能识别为官方 flash/pro 或 opencode flash/pro 的模型:其他第三方中转、旧名 deepseek-chat / deepseek-reasoner、未声明模型名一律豁免,不会被暂停(src/balance-bars.ts:53-63
  • 余额显示依赖最近的真实请求跑在官方 DeepSeek:切到 OpenCode 或第三方中转时余额会自动隐藏(已采样的消费统计不会被清除),只有把 baseURL 改成非官方端点(中转无 /user/balance)时才会禁用(src/balance-tracker.ts:178 / CHANGELOG.zh.md:67-68
  • 「提前提醒」按配置的全局时区计算分钟差:跨午夜窗口或跨时区窗口的提醒时间可能与直觉略有偏差(src/state.ts:62-78
  • 配置文件查找走「指针 → 工作区 → 仓库目录 → DSH 启动目录 → 同级 dsh-save-money 目录 → sandboxPolicy.workspaceRoot」6 级候选:若有多份配置散落在不同目录,最终胜出的是第一个存在配置文件的目录,与启动位置强相关(src/config.ts:210-240
  • 余额历史绑定 API key 指纹:更换 DeepSeek API key 后旧历史自动作废,不会把旧账户的余额轨迹带到新账户(src/balance-tracker.ts:81-100
  • 暂停窗口内的请求会无限挂起等待闸门打开:客户端取消请求(abort 信号)或 DSH 关停会让闸门立即放行以避免悬挂;但若长时间挂起且无任何唤醒事件触发,请求最多延迟到下一次 60 秒定时 tick 才被唤醒(src/host.ts:218-238 / src/gate.ts:55-72
  • 安装 / 更新插件后必须重启 DSH 生效:bundle 行的解析与客户端 bundle 均在启动时扫描,只刷新浏览器不会重新装载服务端插件(README.zh.md:93

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/zhu168/dsh-save-money)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录