dsh-usage-badge 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/assets/logo.jpg +0 -0
- package/assets/usage-dialog.png +0 -0
- package/docs/design-notes.md +5 -2
- package/lib/holidays-cn.json +17 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@ DeepSeek Harness 的用量徽标插件:侧边栏底部一行「今日用量」
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
+
[](https://awesome-dsh-plugin.com)
|
|
8
|
+
|
|
7
9
|
零依赖、零构建:宿主半只用 Node 内建模块,浏览器半是手写的单文件 bundle,折线图是手写 SVG。
|
|
8
10
|
|
|
9
11
|
## 安装
|
|
@@ -59,7 +61,7 @@ dsh plugin --profile web remove dsh-usage-badge
|
|
|
59
61
|
|
|
60
62
|
官方规则:**周一至周五(不含中国法定节假日)9:00-12:00、14:00-18:00 是高峰时段**,其余时段 —— 包括周末和法定节假日**全天** —— 都按空闲价。
|
|
61
63
|
|
|
62
|
-
插件内置了中国法定节假日日历(2025–
|
|
64
|
+
插件内置了中国法定节假日日历(2025–2027,取自国务院办公厅的放假安排通知)。**但它是价格表里 `holidays.source` 这个开关**:写 `"cn"`(或点一次「应用官方价格」,它会自动打开)才算数,缺省时工作日节假日会被当成普通工作日按峰价计费 —— 面板在未启用时会这么写明。
|
|
63
65
|
|
|
64
66
|
**峰谷对价格表里的每一行都生效**,包括你后来手写加的行 —— 不用每行都写一遍 `timeOfUse`。想让某一行完全不参与峰谷(比如网关那边已经是固定折后价),在行编辑器里把「峰谷」选成**不参与峰谷**;想让它按别的倍率算,选**自定义**并写一整套 `timeOfUse`(写全:行内规则是**整体替换**表级规则的,漏了 `peakMultiplier` 就等于那一行不加价)。**周末**用 `days` 逐行控制,编辑器给的是 周一至周五 / 周末 / 每天 三档,数组写法(`[6,7]`)要手写 JSON;**法定节假日**用 `"honorHolidays": false` 逐行关掉(有些网关在国庆照样按自己的峰时收费),这个勾选框在峰谷选成「自定义」后出现。
|
|
65
67
|
|
|
@@ -95,7 +97,7 @@ dsh plugin --profile web remove dsh-usage-badge
|
|
|
95
97
|
|
|
96
98
|
```sh
|
|
97
99
|
npm install # 只为测试装 react / react-dom
|
|
98
|
-
npm test # 11 个套件
|
|
100
|
+
npm test # 11 个套件 908 条断言:包契约、定价、节假日、官方定价解析、缓存存储、同步分片、同步编排、宿主同步接线、自动触发、WebDAV(Digest)、浏览器半渲染
|
|
99
101
|
```
|
|
100
102
|
|
|
101
103
|
云同步的前五步已经在真实的 `bytemark/webdav` 容器上核对通过。要自己核对一遍:
|
package/assets/logo.jpg
ADDED
|
Binary file
|
package/assets/usage-dialog.png
CHANGED
|
Binary file
|
package/docs/design-notes.md
CHANGED
|
@@ -131,6 +131,9 @@ DeepSeek 官方政策原文:
|
|
|
131
131
|
|---|---|---|---|
|
|
132
132
|
| 2025 | 国办发明电〔2024〕7号 | 28 | 5 |
|
|
133
133
|
| 2026 | 国办发明电〔2025〕7号 | 33 | 6 |
|
|
134
|
+
| 2027 | 国办发明电〔2026〕10号 | 29 | 5 |
|
|
135
|
+
|
|
136
|
+
2027 年的端午(6 月 9 日)与中秋(9 月 15 日)都落在周三、各只放一天 —— 不处理就是两天全按峰价计费,这正是日历存在的意义。所以它也成了最纯粹的一组断言:同一个 10:30,节当天按 x1,旁边的周三仍按 x2。
|
|
134
137
|
|
|
135
138
|
**这在你自己的历史数据上是可测的,而且我在这里犯过错**:本机 `2026-09-20` 是调休上班的周日,我最初把它按工作日计价,得出 **¥13.78**;按政策原文(周末全天空闲)应为 **¥7.46** —— 也就是说我**多收了 ¥6.32**,而当时我以为是自己修好了桌面壳的「少算」。现已改正,`2026-09-19`(普通周六)与 `2026-09-21`(普通周一)的数字不受影响。这个错误现在被 `test/holidays.verify.mjs` 里三条断言钉住(调休周日、调休周六、以及旧配置里的 `holidays.workdays` 必须被忽略)。
|
|
136
139
|
|
|
@@ -368,7 +371,7 @@ npm test
|
|
|
368
371
|
|---|---|
|
|
369
372
|
| `test/manifest.verify.mjs` | 包契约:`dsh.bundle.patch` / `dsh.client` / `exports["./client"]` 是否与磁盘上的文件对得上;patch 行名与包名是否一致;宿主半**没有** `export default`(有的话 Loader 的 `unwrapExports` 会丢弃 `inject`);节假日数据文件的结构与来源完整性 |
|
|
370
373
|
| `test/pricing.verify.mjs` | 用临时 `DSH_HOME` + 合成会话日志跑真实宿主半,断言精确金额。第一组用例**逐字移植自桌面壳的 `pricing-key-case.verify.mjs`**(同样的 fixture、同样的期望值),用来证明移植后的定价与原实现一致;另覆盖上下文档位(严格大于、`"128K"` 紧凑写法、缓存 token 计入上下文)、峰谷 `days` 规则、跨币种换算、前缀行的四条优先级规则(精确行优先、长前缀优先、星号不是分隔符、裸 `*` 仍是死配置)、隐式前缀回退(官方行兜住自己的变体、分隔符边界让 `gpt-4` 吞不掉 `gpt-4o`、开关经 PUT 路由后在**同一个进程内**立刻重算),以及未匹配模型不计价的语义(哪些行算「匹配」、token 仍计入、快照列出被跳过的路由)、逐行/表级的 `honorHolidays`(既有「节假日盖过行内规则」也有「行内拒绝日历后照样收峰价」)、行编辑器的写入路径(整份 `overrides` 经 PUT 落盘、其它字段与两个开关不受影响)、**`default` 行是整体替换而非字段合并**(清空的字段真的消失、`{}` 被当成「没有这一行」)、以及**一行 `null` 覆盖行**被跳过而不是让 `/summary` 500 |
|
|
371
|
-
| `test/holidays.verify.mjs` | 节假日日历的行为:工作日节假日全天空闲、**调休周末仍按空闲价**(政策原文说周末全天空闲)、旧配置里的 `holidays.workdays` 被忽略、关闭日历时回到旧的按星期行为、自定义 `extra
|
|
374
|
+
| `test/holidays.verify.mjs` | 节假日日历的行为:工作日节假日全天空闲、**调休周末仍按空闲价**(政策原文说周末全天空闲)、旧配置里的 `holidays.workdays` 被忽略、关闭日历时回到旧的按星期行为、自定义 `extra`、同一个月内不同日子的分类互不干扰,以及**2027 年的单日端午/中秋**(同一天 10:30,节当天 x1、旁边的周三 x2)与 2027-02-14 调休周日 |
|
|
372
375
|
| `test/official-pricing.verify.mjs` | 解析器对**中英文两个页面快照**的逐字段断言(含旧模型别名、时区识别与换算);页面结构变化时会抛错而不是静默返回错价;`应用` 的合并语义(未知字段存活、已有的 `default` 行不动、没有 `default` 行时按官方第一条补一个并报告 `defaultFrom`、页面第一条确实是最便宜那档);并用**被 stub 掉的 fetch** 跑通两个路由,最后验证应用后的价格真的参与计费(含未列出模型按生成的 default 行计价),以及兜底行的完整生命周期:删除 → 回到内置模板并把 `defaultSource` 报成 `template` → 再次应用从官方第一条生成回来 → 手改过的兜底行不会被应用覆盖 |
|
|
373
376
|
| `test/cache.verify.mjs` | 缓存存储层:**两个后端跑同一套契约断言**(会话游标与桶的往返、`hourly` 槽位与逐请求记录、重写会话即替换它的日期集合、`years()` 的年份列表与有界区间读),以及只有跨重启才看得见的行为 —— **删掉会话日志后历史仍在**(新挂载的宿主照旧报出同样的金额)、**没有变化的一轮刷新不写文件**、**超出加载窗口的那天留在库里只是不读进来**(换个更宽的窗口还能取到)、旧 `cache.json` **迁移一次**并把旧文件改名为 `.migrated`(且 `.migrated` 之后**不再被读**)、**读不出来的缓存文件被改名保留并新建一个**、**更新版本的库只读使用且绝不改名**、加载窗口必须大于快照窗口这条不变量,以及 `按年` 路由(三年以前那一年照样读得到、12 个月恒定、`daily` 带节假日标记与 provider 拆分、没有数据的年份是 12 个空月而不是报错、非法年份 400)。 |
|
|
374
377
|
| `test/client.render.mjs` | 用替身 Loader 加载浏览器 bundle,检查 slot 注册形状与 `id`,再用 `react-dom/server` 渲染两个面板,断言金额格式、区间页签(含 `按年`:下拉只列出宿主报的那几年、选中的那一年被选中、月份轴恒为 12、点数是 12 × 序列数、四张卡片是那一年的合计、这一档不画热力图、没有年份时不渲染空下拉)、四序列折线的条数与配色、图例开关(单独显示某一条时的折线条数,以及面积填充有没有跟着走)、悬停 tooltip 的装配、provider 页签、热力图的格数(371 − 今天之后的那几天)与分档、官方价格表内容、两个开关(前缀回退与未匹配模型计价:开/关两种状态各自渲染出的说明与动作、default 行的来源标注、以及「哪些模型没价格」的提示)、**覆盖行编辑器**(每行的编辑/删除动作、倍率与峰谷列恒定存在、表单用被编辑行的真实数值预填而不是空模板、自定义规则才展开规则字段、新增行不给删除按钮、**兜底行同样可编辑可删除且不提供那些不生效的字段**、**重名键与「改过的行」会被保存拦下**、**旧宿主不会被说成「兜底行还没有」**、以及「保留未显示字段」与拒绝写 NaN 的源码断言)、节假日徽标与日历区块、展开/收起两种行形态、**弹窗那一段 CSS 里不许出现任何宿主颜色令牌(`--dsw-`),必须自带浅色/深色两套 `--dub-*` 调色板**,以及空数据 / 稀疏 provider 两个边界不崩 |
|
|
@@ -814,7 +817,7 @@ storages/usage-badge/host.lock # { pid, startedAt, instanceId, hostname, at
|
|
|
814
817
|
## 已知限制
|
|
815
818
|
|
|
816
819
|
- **节假日与峰谷按本机时区判定**:官方窗口按北京时间定义,应用官方价格时已把窗口换算到本机。但**日历匹配用的是本地日期**,主机不在 UTC+8 时,跨午夜的请求可能落到错误的本地日期从而判错节假日。中国主机(UTC+8)下完全精确。如需任意时区精确,可加 `timeOfUse.zone` 选项(尚未实现)。
|
|
817
|
-
- **节假日数据需要逐年更新**:内置 2025 与
|
|
820
|
+
- **节假日数据需要逐年更新**:内置 2025、2026 与 2027(共 90 个放假日)。国务院通常在每年 11 月公布次年安排,届时需补 `lib/holidays-cn.json`(放假日与调休上班日、文号、链接);缺失年份会在启动日志与面板提示,不会静默算错。
|
|
818
821
|
- **官方页面解析依赖当前页面结构**:改版后「获取官方定价」会报错(面板显示原因并保留原价格),用 `node test/official-pricing.live.mjs` 可以随时核对;价格仍可手改 JSON 兜底。
|
|
819
822
|
- **定价数字仅供参考**:token 列是**四桶合计**(输入 / 缓存读 / 缓存写 / 输出 —— 代码里没有第五个桶,reasoning token 没有被读取),与官方「三列」天然对不齐,与官方实时数字也存在分钟级时差;**对账请以金额为准**。
|
|
820
823
|
- **只统计 DSH 记进日志的调用**:统计口径是会话日志里的 `assistant/message` + `usage`;某个插件直接请求外部 API 且不向宿主上报 usage,这部分消耗统计不到。
|
package/lib/holidays-cn.json
CHANGED
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
"document": "国办发明电〔2025〕7号",
|
|
12
12
|
"published": "2025-11-04",
|
|
13
13
|
"url": "https://www.gov.cn/zhengce/zhengceku/202511/content_7047091.htm"
|
|
14
|
+
},
|
|
15
|
+
"2027": {
|
|
16
|
+
"document": "国办发明电〔2026〕10号",
|
|
17
|
+
"published": "2026-11-05",
|
|
18
|
+
"url": "https://www.gov.cn/zhengce/content/202611/content_7085101.htm"
|
|
14
19
|
}
|
|
15
20
|
},
|
|
16
21
|
"years": {
|
|
@@ -36,6 +41,18 @@
|
|
|
36
41
|
{ "name": "国庆节", "from": "2026-10-01", "to": "2026-10-07" }
|
|
37
42
|
],
|
|
38
43
|
"workdays": ["2026-01-04", "2026-02-14", "2026-02-28", "2026-05-09", "2026-09-20", "2026-10-10"]
|
|
44
|
+
},
|
|
45
|
+
"2027": {
|
|
46
|
+
"blocks": [
|
|
47
|
+
{ "name": "元旦", "from": "2027-01-01", "to": "2027-01-03" },
|
|
48
|
+
{ "name": "春节", "from": "2027-02-05", "to": "2027-02-13" },
|
|
49
|
+
{ "name": "清明节", "from": "2027-04-03", "to": "2027-04-05" },
|
|
50
|
+
{ "name": "劳动节", "from": "2027-05-01", "to": "2027-05-05" },
|
|
51
|
+
{ "name": "端午节", "from": "2027-06-09", "to": "2027-06-09" },
|
|
52
|
+
{ "name": "中秋节", "from": "2027-09-15", "to": "2027-09-15" },
|
|
53
|
+
{ "name": "国庆节", "from": "2027-10-01", "to": "2027-10-07" }
|
|
54
|
+
],
|
|
55
|
+
"workdays": ["2027-01-31", "2027-02-14", "2027-05-08", "2027-09-26", "2027-10-09"]
|
|
39
56
|
}
|
|
40
57
|
}
|
|
41
58
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-usage-badge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "DeepSeek Harness 的用量徽标插件:侧边栏底部一行显示当天的 token 总量与估算费用,点开可看 24 小时 / 近 7 日 / 近 30 日 / 近 12 个月 / 按年用量,按 provider 筛选,并按 DeepSeek 官方定价与中国法定节假日计价。A usage badge plugin for DeepSeek Harness: today's tokens and estimated spend in the sidebar, with 24h / 7d / 30d / 12-month and per-year charts, official DeepSeek pricing and Chinese public holidays.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|