@cassius0924/dsh-usage-dashboard 0.3.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cassius0924
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,190 @@
1
+ # dsh-usage-dashboard
2
+
3
+ 在 [DSH](https://github.com/deepseek-ai)(DeepSeek Harness)的 Web GUI 里,随时看得见 DeepSeek 的钱花在哪:
4
+ **余额还能撑几天、今天花了多少、哪个模型最贵、缓存替你省了多少,以及 2026-08-17 峰谷定价之后账单会变成什么样。**
5
+
6
+ ![dsh-usage-dashboard](docs/hero.png)
7
+
8
+ 装上之后 GUI 里多两样东西:右下角一个可拖动的**悬浮额度窗**,顶部栏多一个**「额度」tab**。
9
+
10
+ ---
11
+
12
+ ## 为什么需要它
13
+
14
+ 用 DSH 跑 agent,钱是一点一点漏掉的,而 DSH 自己不会告诉你:
15
+
16
+ | 你真正想知道的 | 装之前 |
17
+ |---|---|
18
+ | 余额还能用几天? | 只有一个余额数字 |
19
+ | 今天花了多少?这个月呢? | 只有「累计」,没有时间感 |
20
+ | 钱花在哪个模型上? | 不知道 |
21
+ | 缓存到底帮我省了多少? | 完全看不到 |
22
+ | 8-17 涨价后我的账单会变成多少? | 只能自己算 |
23
+
24
+ 这个插件把这些问题逐个翻译成一眼能看懂的数字。**费用全部为估算**,算法与单价公开可查(见[费用是怎么算的](#费用是怎么算的))。
25
+
26
+ ---
27
+
28
+ ## 悬浮额度窗
29
+
30
+ <img src="docs/widget.png" width="300" alt="悬浮额度窗">
31
+
32
+ 常驻右下角,不打断你干活:
33
+
34
+ - 余额 + **今日消耗**,一眼就够。
35
+ - 可拖动,松手自动吸附四角;边界避开侧边栏、右侧详情面板、会话顶栏和输入框——**不会挡住发送按钮**。
36
+ - 可收起成一行;**显示/隐藏、所在角落、收起状态都会记住**,刷新页面后原样回来。
37
+ - 余额跌破预警线时,状态点和余额数字一起转成警示色。
38
+ - 60 秒自动刷新余额。今日消耗读共享缓存,**悬浮窗自己不会触发用量聚合**(那是秒级操作),点 ↻ 才重新拉取。
39
+
40
+ ## 「额度」仪表盘
41
+
42
+ ### 余额:还能撑几天
43
+
44
+ <img src="docs/balance.png" width="720" alt="账户余额与可用天数">
45
+
46
+ 「还剩多少钱」不解决余额焦虑,「还能用几天」才行。按近 7 个自然日(含没用的日子)的日均消耗折算,hover 能看到估算口径;不足 3 天转红。
47
+
48
+ ### 今日 / 本月花了多少 —— 以及这个数怎么来的
49
+
50
+ <img src="docs/overview.png" width="860" alt="消耗概览与计价说明">
51
+
52
+ 今日、本月、累计三个窗口,今日带「较昨日」、本月带「较上月同期」环比(**上月同期**而不是上月整月,免得月初总是显得便宜)。
53
+
54
+ 展开**计价说明**能看到费用估算实际套用的单价表——估算不该是个黑箱。
55
+
56
+ ### 涨价之后会变成多少
57
+
58
+ <img src="docs/peak.png" width="860" alt="高峰 / 闲时分布">
59
+
60
+ DeepSeek 从 2026-08-17 00:00 起改峰谷定价,高峰(北京时间 09:00–12:00、14:00–18:00)价格是闲时的两倍。
61
+
62
+ 这张卡告诉你用量落在峰谷两侧的比例,并且**在新价生效前就把账单重算一遍**:上图这份用量现价 ¥14.64,新价下是 ¥45.84(+213%)。生效之后,这里会换成「把高峰用量挪到闲时能省多少」。
63
+
64
+ ### 缓存替你省了多少
65
+
66
+ <img src="docs/cache.png" width="860" alt="缓存命中与节省">
67
+
68
+ 前缀缓存的命中价只有未命中价的百分之一量级,是 DSH 这类高重复 prompt 负载上**最大的省钱杠杆**——上图这份用量实付 ¥14.64,缓存省下了 ¥458.15。
69
+
70
+ 命中率掉到 60% 以下时,文案会换成怎么把它救回来的建议。
71
+
72
+ ### 钱花在哪个模型上
73
+
74
+ <img src="docs/models.png" width="860" alt="模型成本排行">
75
+
76
+ 按费用降序,带占比条和输入/输出/缓存拆分。模型配色在排行、下拉选择器和图表图例三处一致。
77
+
78
+ ### 哪个会话最烧钱
79
+
80
+ <img src="docs/sessions.png" width="860" alt="会话成本排行">
81
+
82
+ 按模型、按天的视图告诉你「花在什么上」和「什么时候花的」;这张告诉你**是哪一次跑掉的**——对 agent 用户来说,这是唯一能直接动手改的东西:一个特别贵的会话,通常意味着一段值得看看的 prompt 或一个没收住的循环。上图里一个会话就占了总花费的 77.8%。
83
+
84
+ 会话标题直接从会话日志里读(`session/title` 事件),跟用量重放搭同一趟车,不额外读盘。
85
+
86
+ ### 用量的时间分布
87
+
88
+ <img src="docs/charts.png" width="860" alt="逐天柱状图与热力图">
89
+
90
+ 近 30 天逐天、0–23 点逐小时(可按模型多选过滤,叠成分组柱状图),外加近 12 周热力图。hover 立刻出 tooltip,不用等系统那一秒。
91
+
92
+ ### 余额预警
93
+
94
+ <img src="docs/alert.png" width="860" alt="余额低预警警示条">
95
+
96
+ 在「设置」里定一条预警线(默认 ¥10,填 0 关闭)。跌破时仪表盘顶部出现警示条——带上还能撑几天和充值入口——同时悬浮窗一起转警示色,两边不会各说各话:
97
+
98
+ <img src="docs/widget-low.png" width="300" alt="悬浮窗的警示态">
99
+
100
+ ---
101
+
102
+ ## 安装
103
+
104
+ 标准 DSH 插件包(bundle + client 双面包),用 `dsh plugin` 装:
105
+
106
+ ```sh
107
+ # 从 npm 安装
108
+ dsh plugin --profile web add @cassius0924/dsh-usage-dashboard
109
+
110
+ # 或从 GitHub(git 依赖会跑 prepare 脚本现场构建)
111
+ dsh plugin --profile web add github:Cassius0924/dsh-usage-dashboard
112
+
113
+ # 或本地 checkout
114
+ dsh plugin --profile web add ./path/to/dsh-usage-dashboard
115
+ ```
116
+
117
+ 然后**重启 dsh**(`dsh --profile web`)生效。
118
+
119
+ 前提:
120
+
121
+ - 已配置 `DEEPSEEK_API_KEY`(「设置 → 模型」里填,或放在 `$DSH_HOME/.credentials.yaml`)——余额接口要用。
122
+ - 本机有 pnpm(`dsh plugin` 是 pnpm 的转发器)。
123
+
124
+ 装好后打开 GUI,**进入任意一个会话**(「额度」tab 挂在 `conversation.view` 上,New Session 首页没有 tab 栏),顶部就能看到 `Chat / Trajectory / 额度`。
125
+
126
+ ## 费用是怎么算的
127
+
128
+ 费用是**估算**,不是账单。规则都在 [`src/pricing.ts`](src/pricing.ts) 一个文件里:
129
+
130
+ - 逐条用量记录按「**模型** + **是否落在高峰时段**」计价,而不是全局一套价。
131
+ - 2026-08-17 00:00(北京时间)之前的记录按旧的固定价;之后按峰谷价,闲时为高峰的一半。
132
+ - 高峰时段按**北京时间**判定,不随机器时区漂移。
133
+ - 未识别的模型按 `deepseek-v4-pro`(较贵的一侧)计价。
134
+
135
+ 单价(CNY / 百万 tokens):
136
+
137
+ | 模型 | 时段 | 输入·缓存命中 | 输入·未命中 | 输出 |
138
+ |---|---|---|---|---|
139
+ | deepseek-v4-pro | 08-17 前固定 | 0.025 | 3 | 6 |
140
+ | deepseek-v4-pro | 高峰 / 闲时 | 0.3 / 0.15 | 9 / 4.5 | 27 / 13.5 |
141
+ | deepseek-v4-flash | 08-17 前固定 | 0.02 | 1 | 2 |
142
+ | deepseek-v4-flash | 高峰 / 闲时 | 0.1 / 0.05 | 3 / 1.5 | 9 / 4.5 |
143
+
144
+ DeepSeek 再调价时,只改这张表。
145
+
146
+ ## 开发 / 构建
147
+
148
+ ```sh
149
+ pnpm install
150
+ pnpm run build # esbuild 出 lib/index.js(host)+ lib/client.js(client),再 tsc 出类型
151
+ pnpm run typecheck
152
+ ```
153
+
154
+ 产物:
155
+
156
+ - `lib/index.js` —— Host 半(ESM,Node),注册 `/api/dsh-usage-dashboard/*` 路由。
157
+ - `lib/client.js` —— Client 半(CJS 闭包),通过 `window.__ModuleLoader__` 注册进 web 启动图。
158
+
159
+ 改动生效方式不同:只改 `src/client/**` 时,浏览器硬刷新(Ctrl/Cmd+Shift+R)即可;改了 `src/index.ts` 等 host 端要重启 dsh。
160
+
161
+ ```
162
+ src/
163
+ ├── index.ts # Host 半入口(webServer 路由 + TTL 记忆化)
164
+ ├── usage.ts # 余额 + 用量聚合(按天/小时/模型/峰谷分桶)
165
+ ├── pricing.ts # 价目表与费用估算(唯一改价的地方)
166
+ ├── contract.ts # host ↔ client 的 wire 类型
167
+ ├── trust-fence.ts # 浏览器信任校验
168
+ └── client/
169
+ ├── index.tsx # Client 半入口(slots 注册)
170
+ ├── widget.tsx # 悬浮额度窗
171
+ ├── dashboard.tsx # 「额度」tab
172
+ ├── charts.tsx # 柱状图 / 热力图 / tooltip
173
+ ├── styles.ts # 全部样式
174
+ ├── api.ts # fetch + 客户端缓存
175
+ ├── cache.ts # TTL 缓存(含 localStorage 持久化)
176
+ ├── prefs.ts # 用户设置持久化
177
+ └── store.ts # 两个界面共享的设置
178
+ ```
179
+
180
+ 样式全部走 DSH 自己的 `--dsw-alias-*` CSS 变量,跟随宿主主题,不引入独立配色。
181
+
182
+ ## 已知限制
183
+
184
+ - 用量数据来自**本机** DSH 会话日志,不含其它机器/账户的用量。
185
+ - 费用是估算:不含 DeepSeek 侧的折扣、赠金消耗顺序等因素,以官方账单为准。
186
+ - 首次加载用量需要重放全部会话日志(本机实测约 5 秒),因此有 5 分钟的服务端记忆化;界面在此期间显示骨架屏。
187
+
188
+ ## License
189
+
190
+ [MIT](./LICENSE)
@@ -0,0 +1,10 @@
1
+ # dsh-usage-dashboard bundle layer.
2
+ #
3
+ # One row carries both halves:
4
+ # - the host plugin resolves from this package's main export (`lib/index.js`),
5
+ # - the client half rides the same row: dsh's client-modules scans the
6
+ # Loader entries for packages declaring `dsh.client` (package.json) and
7
+ # serves their `./client` bundle into the web boot graph.
8
+ - insert:
9
+ - id: dsh-usage-dashboard
10
+ name: '@cassius0924/dsh-usage-dashboard'