dsh-peak-hours
Verifieddsh-peak-hours · v1.13.20 · MIT · Web UI
Sidebar badge that marks the current DeepSeek peak-pricing window (24-hour schedule bar, countdown, click to copy) plus a settings card that splits your logged usage into peak / off-peak tokens and compares what it actually cost against all-peak and all-o
Install
dsh plugin add dsh-peak-hours Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-peak-hours
一个 DeepSeek Harness 插件,做两件事:
- 底栏角标:现在是不是高峰计价时段、还有多久切换;
- 设置页卡片:把你自己的用量按高峰/空闲拆开,并算出「实际花了多少」对比「全在高峰 / 全在空闲要花多少」。
设置页卡片:

底栏角标(和权限、模型名同一行):

它显示什么
嵌在输入框底栏(conversation.input.right)里,和「完全权限」「模型名」「上下文占用」同一行,一行说完三件事:
- 状态灯:橙点 = 高峰(Busy),蓝点 = 空闲(Free)
- 当前时间:北京时间,秒级跳动
- 倒计时:还有多久切换,例如
2 days 07:11(超过一天用days,否则H:MM:SS)
空间够的时候角标会停在「+ 与模型名之间的空白带」中点;窗口变窄、或打开右侧边栏后放不下时,优先让尾部(模型名 / 上下文 / 档位 / 百分比)换到第二行,角标本身始终完整显示。是否换行按这一行的自然宽度算,跟窗口宽度无关,所以拖动窗口或开合侧栏都不会来回跳。
鼠标悬停(或键盘聚焦)角标会弹出一张详情卡:
- 顶部:状态灯 +
Busy/Free+ 当前倍率(高峰×2,空闲5 折) - 现在 · Now:当前北京时间
- 距切换 · Countdown:距离下一次切换的时间,箭头后是切换后的状态(
→ Busy/→ Free) - 本段:当前这一段的起止时间
- 明天 · Tomorrow:明天是工作日、周末还是法定节假日
计费规则
按 DeepSeek 的峰谷定价:
- 高峰:北京时间 09:00–12:00、14:00–18:00
- 空闲:其余时间(含午间 12:00–14:00、18:00 之后、09:00 之前)
- 整天空闲:周六、周日,以及中国的法定节假日
- 闲时价 = 高峰价的一半
节假日表是内置的,不联网:目前覆盖 2026 年(中秋 9/25–27、国庆 10/1–7)。2026 年 9/20(周日)和 10/10(周六)是调休上班日,按规则仍算空闲。表里没有的年份退化成「周末空闲」规则——这是保守选择:宁可把某天当成空闲(少标高峰),也不误报高峰;遇到新的节假日安排需要更新 client.js 里的 HOLIDAYS,tooltip 里显示的年份由该表自动推导。
时间一律按北京时间(UTC+8)算,和你浏览器的时区无关。
用量与费用对比(设置 → 通用)
除了角标,插件还在「设置 → 通用」里加了一行 高峰/空闲用量与费用对比(settings.general.item,排在「性能与用量」后面)。它读取本机 DeepSeek Harness 的会话日志,把每个请求按它发生的北京时间归到高峰或空闲,然后按模型价目表折算成钱:
- 三个区间:近 7 天 / 近 30 天 / 全部
- 三笔钱:实际花费(高峰按 ×2、空闲按 ×1)、假如全部落在高峰、假如全部落在空闲
- 省下的钱与比例:
¥68.49 · 35.5%这样 - 用量拆分:高峰 token、空闲 token、合计、高峰占比,配一条橙/蓝比例条
- 分模型:前四个模型各自的 token 与费用
口径与限制(重要,也是诚实的地方):
- 只统计能对上 DeepSeek 价目表的模型(
deepseek-flash按 flash 价、deepseek-v4-pro/ reasoner 按 pro 价);其他供应商(claude、gpt、qmodel 等)只计 token、不计入费用,并在说明里单独标注 - 价目表同样内置在
lib/schedule.js(元/百万 tokens,空闲→高峰):flash 命中 0.02→0.04、未命中 1→2、输出 4→8;pro 命中 0.15→0.30、未命中 4.5→9、输出 13.5→27 - 同一
turn+step的多次采样按最后一次算(会话流式输出会反复覆盖同一步的用量),不会重复累加 - 数据来自本机会话日志
~/.dsh/sessions/<工作区>/<会话>/session.v4.jsonl.zstd,只在本地读、不外发;解析结果按文件大小与修改时间缓存到~/.dsh/storages/peak-hours/cache.json,第二次打开是毫秒级 - 用量接口也有 60 秒 TTL,卡片上的「刷新」会跳过缓存重新扫一遍
安装
从 npm:
dsh plugin --profile web add dsh-peak-hours
从本地目录:
dsh plugin --profile web add /绝对路径/dsh-peak-hours
装完刷新页面(或重启 dsh web)即可生效。
卸载
dsh plugin --profile web remove dsh-peak-hours
兼容性
- 需要带客户端 UI 的 DeepSeek Harness Web GUI(
dsh.client声明为platform: web);内联角标挂在conversation.input.right,挂在sidebar.footer.action的旧侧栏角标已移除 - 客户端 + 一个只读的 host 半:host 半注册一条
GET /dsh-peak-hours/api/usage,读取本机会话日志算峰谷账,不发任何网络请求;除~/.dsh/storages/peak-hours/cache.json这一份解析缓存外不写文件,不需要任何配置或凭据 - 角标部分纯客户端,不依赖 host 半;即使 host 半取数失败,角标照常工作
- 颜色是固定值(高峰
#f59e0b、空闲#4d6bfe,即 DeepSeek 品牌蓝),不跟随主题brand-primary,以免换皮肤后蓝色被改成别的色
开发
npm test # 25 个单元测试(node --test,零依赖)
npm run verify # npm pack --dry-run,检查发布清单
测试分两块,全部零依赖、不用起 GUI:
test/schedule.test.mjs:通过vm加载client.js,用最小的 React / locale / document 替身渲染角标,验证时段边界、节假日、倒计时、角标与详情卡文案、注册点与中英文 key 对齐test/usage.test.mjs:直接测 host 半的lib/schedule.js与lib/usage.js,用合成事件验证窗口判定、节假日、模型分类、价格公式、turn+step替换语义、按日+小时+模型分桶、峰谷费用对比与区间过滤
设置页卡片还有一个独立的 headless 渲染检查(真实接口数据 + 最小 hooks 替身),确认取数成功后不会渲染崩溃。
许可
MIT