Skip to content

dsh-peak-hours

Verified

dsh-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 插件,做两件事:

  1. 底栏角标:现在是不是高峰计价时段、还有多久切换;
  2. 设置页卡片:把你自己的用量按高峰/空闲拆开,并算出「实际花了多少」对比「全在高峰 / 全在空闲要花多少」。

设置页卡片:

设置页卡片

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

底栏角标

ci

它显示什么

嵌在输入框底栏(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