dsh-plugin-billing-card 0.0.0-stage → 0.2.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/README.md +239 -2
- package/billing-core.js +1539 -0
- package/client.js +528 -0
- package/cordis.patch.yml +29 -0
- package/icon.svg +6 -0
- package/index.js +35 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +48 -4
package/README.md
CHANGED
|
@@ -1,3 +1,240 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-plugin-billing-card(计费卡片)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
在 DeepSeek Harness 的输入框下方实时显示**当前会话**的 token 用量与估算费用,按模型分项统计,
|
|
4
|
+
默认内置 DeepSeek 官方价格(含**峰谷分时计价**),并保留完整的扩展能力:价格表、峰谷规则、
|
|
5
|
+
其他模型/提供商都可以在插件配置里追加,不需要改代码。0.2.0 起同时统计 **DeepSeek 官方网页搜索 /
|
|
6
|
+
抓取 API** 的调用次数与按次费用(Search 服务端调用免费至 2026-11-01 00:00,之后按每 1000 次
|
|
7
|
+
5 元估算)。
|
|
8
|
+
|
|
9
|
+
> npm:[`dsh-plugin-billing-card@0.2.0`](https://www.npmjs.com/package/dsh-plugin-billing-card)
|
|
10
|
+
> · `tofu-box@1.2.1` 起包含本版本(伞包 1.2.0 含 0.1.0)。
|
|
11
|
+
|
|
12
|
+
- **Host 半**:注册一个客户端可见的 Session 投影单元 `billingUsage`,在提交事件时折叠
|
|
13
|
+
`assistant/message` / `assistant/attempt` 中模型上报的 `usage`(按 `request/header` 归属模型路由),
|
|
14
|
+
并折叠 `tool/call` / `tool/result` 里的 `web_search` / `web_fetch` 调用来估算按次费用;
|
|
15
|
+
纯函数、可重放、不产生任何模型调用。
|
|
16
|
+
- **Client 半**:在 `conversation.composer.dock`(输入框下方的环境条目区)新增一个
|
|
17
|
+
`billing-card` 条目;平时是一枚只显示估算费用的小药丸(token 总量已由 DSH 自带用量药丸显示,
|
|
18
|
+
这里不重复),点开后是明细卡片。
|
|
19
|
+
|
|
20
|
+
> 显示的是**按 token 数、按次价格与价格表计算的估算值**,不是官方账单。实际扣费以 DeepSeek 账单为准。
|
|
21
|
+
|
|
22
|
+
## 显示内容
|
|
23
|
+
|
|
24
|
+
药丸(收起态):`¥0.0123`。只显示估算费用——会话 token 总量与缓存命中率已由 DSH 自带的用量药丸
|
|
25
|
+
显示,不重复占位。鼠标悬停/读屏可读到「预估费用 ¥…」。
|
|
26
|
+
|
|
27
|
+
卡片(展开态):
|
|
28
|
+
|
|
29
|
+
- 本会话估算总费用;若包含高峰时段计价的 token,会标注「含高峰计价」。
|
|
30
|
+
- token 汇总:缓存未命中输入、缓存命中输入(及命中率)、输出、合计。
|
|
31
|
+
- 按模型分项:模型名、token 数、估算费用;没有配置价格的模型显示「未配置价格」,
|
|
32
|
+
token 仍计入合计,但不计入费用。
|
|
33
|
+
- 联网搜索小节(本会话有搜索/抓取调用时出现):搜索调用次数、provider 请求数、预计计费请求数、
|
|
34
|
+
搜索费用;直连 Fetch API 的抓取次数与费用。搜索仍处免费期时显示「免费期内(11/1 起 …)」。
|
|
35
|
+
|
|
36
|
+
会话还没有任何已结算的 token 用量时,卡片不显示(不会占位、不会报错)。
|
|
37
|
+
|
|
38
|
+
## 安装
|
|
39
|
+
|
|
40
|
+
已发布 npm:`dsh-plugin-billing-card@0.2.0`,同时也是 `tofu-box` 伞包(1.2.1 起)的成员。
|
|
41
|
+
插件行 id 为 `billing-card`,Client 半是手写浏览器模块,无需构建步骤。
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 1) 单装(npm)
|
|
45
|
+
dsh plugin --profile <你的profile> add dsh-plugin-billing-card
|
|
46
|
+
|
|
47
|
+
# 2) 或装整套伞包(自动包含本插件)
|
|
48
|
+
dsh plugin --profile <你的profile> add tofu-box
|
|
49
|
+
|
|
50
|
+
# 3) 开发/未发版:从本仓库本地目录安装(link 方式,改代码不用重装)
|
|
51
|
+
dsh plugin --profile <你的profile> add D:\program\dsh-plugins\dsh-plugin-billing-card
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> 建议先在一个**独立 profile** 里验证,不要装进你日常使用的 `desktop` profile:用官方 web 模板新建
|
|
55
|
+
> `dsh --profile billing-dev --from-default-profile web --dump-config`,装好后
|
|
56
|
+
> `dsh --profile billing-dev --no-open --port 58121` 启动(日志会打印带一次性 `?token=` 的地址)。
|
|
57
|
+
|
|
58
|
+
> 新装的 Client 模块需要页面刷新一次才会加载;旧会话的投影基线也在刷新/重连后才会带上
|
|
59
|
+
> `billingUsage`,刷新后输入框下方就会出现计费药丸。
|
|
60
|
+
|
|
61
|
+
如果是在当前会话里用 `plugin_manager` 安装(会让该 profile 的所有会话生效),写法是:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
plugin_manager install_bundle target = D:\program\dsh-plugins\dsh-plugin-billing-card
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
如手工维护 profile 的 `cordis.patch.yml`,等价写法是:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
- insert:
|
|
71
|
+
- id: billing-card
|
|
72
|
+
name: dsh-plugin-billing-card
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 默认价格表(官方价格,绑定于 2026-10-17)
|
|
76
|
+
|
|
77
|
+
计价口径:1) **缓存未命中输入** = `TokenUsage.inputTokens`;2) **缓存命中输入** =
|
|
78
|
+
`TokenUsage.cacheReadTokens`;3) **输出** = `TokenUsage.outputTokens`;4) `cacheWriteTokens`
|
|
79
|
+
默认按 0 元计(DeepSeek 不单独收缓存写入费),可用规则覆盖。
|
|
80
|
+
|
|
81
|
+
官方页面把**空闲时段价格**写成高峰时段的一半;本插件以空闲时段价格为基础价,
|
|
82
|
+
`peak.multiplier`(默认 2)在高峰时段生效。
|
|
83
|
+
|
|
84
|
+
### 人民币(默认 `currency: CNY`,单位:元 / 百万 tokens,空闲时段基础价)
|
|
85
|
+
|
|
86
|
+
| 模型 | 输入(缓存未命中) | 输入(缓存命中) | 输出 |
|
|
87
|
+
|---|---|---|---|
|
|
88
|
+
| `deepseek-flash`(DeepSeek-V4.1-Flash) | 1 | 0.02 | 4 |
|
|
89
|
+
| `deepseek-v4-pro`(DeepSeek-V4-Pro) | 4.5 | 0.15 | 13.5 |
|
|
90
|
+
| `deepseek-v4-flash`、`deepseek-v4-flash-vision-exp`(旧名,按 Flash 计价) | 1 | 0.02 | 4 |
|
|
91
|
+
|
|
92
|
+
高峰时段(北京时间,周一至周五,不含中国法定节假日):**09:00–12:00、14:00–18:00**;
|
|
93
|
+
其余时间(含周末与法定节假日全天)为空闲时段。
|
|
94
|
+
|
|
95
|
+
### 美元(`currency: USD`,单位:美元 / 百万 tokens,空闲时段基础价)
|
|
96
|
+
|
|
97
|
+
| 模型 | 输入(缓存未命中) | 输入(缓存命中) | 输出 |
|
|
98
|
+
|---|---|---|---|
|
|
99
|
+
| `deepseek-flash` | 0.15 | 0.003 | 0.6 |
|
|
100
|
+
| `deepseek-v4-pro` | 0.66 | 0.022 | 1.98 |
|
|
101
|
+
| `deepseek-v4-flash`、`deepseek-v4-flash-vision-exp` | 0.15 | 0.003 | 0.6 |
|
|
102
|
+
|
|
103
|
+
> 价格来源:DeepSeek 官方「模型 & 价格」页(中文 / 英文),核对时间 2026-10-17。
|
|
104
|
+
> 官方保留调价权利,请以官网与你的实际结算为准;调价后覆盖本插件配置即可。
|
|
105
|
+
|
|
106
|
+
## 联网搜索 / 抓取计费(0.2.0)
|
|
107
|
+
|
|
108
|
+
官方口径(Search / Fetch API,2026-10-17 上线):
|
|
109
|
+
|
|
110
|
+
- 按**成功请求次数**计费:每 1,000 次成功请求 **5 元 / $0.75**;失败、空结果、超时不计费,
|
|
111
|
+
`count` 只控制返回条数、不影响单价。
|
|
112
|
+
- 在 DeepSeek Harness / Claude Code / Codex 中由**服务端工具调用**触发的 Search / Fetch 目前免费,
|
|
113
|
+
**北京时间 2026-11-01 00:00 起**按次收费。DSH 的 `web_search` 走服务端 `web_search` 工具;
|
|
114
|
+
而 `web_fetch` 是直连 `POST https://api.deepseek.com/v1/tools/fetch` 的普通 API 请求,
|
|
115
|
+
不属于服务端工具调用,按官方规则自上线起计费。
|
|
116
|
+
- 本插件从会话日志统计(不额外发请求):
|
|
117
|
+
- `web_search`:每次工具调用按**去重后的 query 数**计为 provider 请求数(工具本身就是每个
|
|
118
|
+
query 发一个请求);一次调用成功且结果源非空时,这些 query 计为「预计计费请求」。
|
|
119
|
+
- `web_fetch`:按 HTTP 200 的成功抓取计为 Fetch API 计费请求。
|
|
120
|
+
- 费用 = 预计计费请求数 × `search.perRequest`(默认 0.005 元/次,美元 0.00075/次)。
|
|
121
|
+
- 搜索仍在免费期时,卡片显示「免费期内(11/1 起 ¥…)」;抓取费用始终按已计费估算显示。
|
|
122
|
+
|
|
123
|
+
已知限制(估算口径):
|
|
124
|
+
|
|
125
|
+
- 服务端一次 provider 请求内部可能触发 1 次以上 Search(`max_uses`,默认 5),日志不记录实际
|
|
126
|
+
次数,因此「预计计费」是**下限估算**。
|
|
127
|
+
- 多 query 批量搜索失败时,已成功的那部分可能已被官方计费,但这里整单失败、不计费;
|
|
128
|
+
空结果的成功调用不计费(与官方一致)。
|
|
129
|
+
- 服务端搜索附带的辅助模型 token 费用不写入会话日志,本卡片不统计。
|
|
130
|
+
- 统计假设 `web_search` / `web_fetch` 由 DeepSeek 官方 provider 提供(出厂 profile 即如此)。
|
|
131
|
+
若你改配了 Exa / Perplexity 搜索或本地 HTTP 抓取,请把 `search.enabled` 设为 `false`,
|
|
132
|
+
否则按次费用会误计。
|
|
133
|
+
|
|
134
|
+
## 配置
|
|
135
|
+
|
|
136
|
+
配置写在插件行 `billing-card` 的 `config` 里(profile 的 `cordis.patch.yml` 对整行 `config`
|
|
137
|
+
的覆盖会整表替换,未写的可选项使用默认值)。所有字段都有严格校验:拼写错误、负数、
|
|
138
|
+
非法时间窗口会直接报错并指出配置路径,不会静默忽略。
|
|
139
|
+
|
|
140
|
+
```yaml
|
|
141
|
+
- id: billing-card
|
|
142
|
+
config:
|
|
143
|
+
currency: CNY # CNY | USD,默认 CNY
|
|
144
|
+
|
|
145
|
+
# 追加/覆盖价格规则;优先于内置默认表,按顺序取第一条命中的规则。
|
|
146
|
+
pricing:
|
|
147
|
+
- provider: '*' # 精确 provider 路由或 '*',默认 '*'
|
|
148
|
+
model: deepseek-flash
|
|
149
|
+
inputPerM: 1 # 缓存未命中输入,元/百万 tokens
|
|
150
|
+
cacheReadPerM: 0.02 # 缓存命中输入
|
|
151
|
+
cacheWritePerM: 0 # 可选,默认 0
|
|
152
|
+
outputPerM: 4
|
|
153
|
+
peakMultiplier: 2 # 可选,默认取 peak.multiplier
|
|
154
|
+
|
|
155
|
+
# 峰谷规则(默认即下方深色默认值,可整体调参或关闭)
|
|
156
|
+
peak:
|
|
157
|
+
enabled: true
|
|
158
|
+
utcOffsetMinutes: 480 # 北京时间 UTC+8
|
|
159
|
+
weekdays: [1, 2, 3, 4, 5] # 周一=1 … 周日=7
|
|
160
|
+
windows: [['09:00', '12:00'], ['14:00', '18:00']]
|
|
161
|
+
holidays: [] # 例:['2026-10-01', '2026-10-02'];列出的当地日期全天按空闲计价
|
|
162
|
+
multiplier: 2
|
|
163
|
+
|
|
164
|
+
# 联网搜索 / 抓取按次计价(0.2.0 起,默认即下方值)
|
|
165
|
+
search:
|
|
166
|
+
enabled: true # false = 完全关闭搜索/抓取统计
|
|
167
|
+
perRequest: 0.005 # 每次成功请求的价格(当前币种);默认 CNY 0.005 / USD 0.00075
|
|
168
|
+
searchFreeUntil: 2026-10-31T16:00:00.000Z # 搜索服务端调用的免费截止(北京时间 11/1 00:00);null = 已计费
|
|
169
|
+
trackFetch: true # 是否统计直连 DeepSeek Fetch API 的 web_fetch 调用
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 支持其他提供商 / 模型
|
|
173
|
+
|
|
174
|
+
规则的匹配优先级是:用户规则(精确 provider + 精确 model → 精确 provider + `model: '*'` →
|
|
175
|
+
`provider: '*'` + 精确 model → 全通配)→ 内置默认表。因此:
|
|
176
|
+
|
|
177
|
+
- 换用美元计价:`currency: USD`(内置美元表)。
|
|
178
|
+
- 给自建/第三方模型定价(例如经 OpenAI 兼容端点接入的 GLM):
|
|
179
|
+
|
|
180
|
+
```yaml
|
|
181
|
+
- id: billing-card
|
|
182
|
+
config:
|
|
183
|
+
pricing:
|
|
184
|
+
- provider: llm-pi-ai
|
|
185
|
+
model: GLM/glm-5.3
|
|
186
|
+
inputPerM: 2
|
|
187
|
+
cacheReadPerM: 0.5
|
|
188
|
+
outputPerM: 8
|
|
189
|
+
- provider: llm-pi-ai # 该 provider 下未单独定价的模型统一兜底
|
|
190
|
+
model: '*'
|
|
191
|
+
inputPerM: 2
|
|
192
|
+
cacheReadPerM: 0.5
|
|
193
|
+
outputPerM: 8
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
- 某提供商有自己的一套峰谷/折扣规则:给它的规则单独设置 `peakMultiplier`,
|
|
197
|
+
或把全局 `peak.enabled` 设为 `false` 后按固定价计。
|
|
198
|
+
|
|
199
|
+
> 规则里的 `currency` 默认等于全局 `currency`;写别的币种会被忽略(不会混币种加总)。
|
|
200
|
+
|
|
201
|
+
## 数据口径与已知限制
|
|
202
|
+
|
|
203
|
+
- token 数来自会话日志里模型**上报的 usage**(与 Harness 内置 token 统计同源),不是本地估算;
|
|
204
|
+
失败重试的尝试(`assistant/attempt`)与成功回复都计费,重试会被识别为独立计费尝试。
|
|
205
|
+
- 费用 = token 数 × 价格表;高峰/空闲按**该条 usage 在日志中记录的时间**判定,
|
|
206
|
+
事件时间是持久化的,因此重放、恢复、fork 后结果一致。
|
|
207
|
+
- **辅助调用暂不计量**:会话标题生成、压缩摘要等旁路模型调用的响应 usage 不写入会话日志,
|
|
208
|
+
因此不计入本卡片;如后续 Harness 落盘这类 usage,只需扩展折叠的事件类型。
|
|
209
|
+
- **法定节假日不会自动识别**:官方规则里中国法定节假日按空闲计价,插件无法内置年年变化的
|
|
210
|
+
节假日表,请在 `peak.holidays` 里按需填写;不填写时只按「周一至周五 + 时间窗口」判断。
|
|
211
|
+
- 金额为估算值,浮点计算后仅用于展示(保留 2–4 位小数);并发上限、搜索/抓取等按次计费的
|
|
212
|
+
接口按上面的口径估算,不是账单金额。
|
|
213
|
+
|
|
214
|
+
## 结构
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
dsh-plugin-billing-card/
|
|
218
|
+
├── package.json # dsh.bundle(profile 补丁)+ dsh.client(浏览器模块)+ 导出元数据
|
|
219
|
+
├── cordis.patch.yml # 插入 billing-card 行(不改动任何官方行)
|
|
220
|
+
├── index.js # Host:校验配置并注册 billingUsage 投影
|
|
221
|
+
├── billing-core.js # Host 纯逻辑:事件折叠、价格解析、峰谷判定、视图构建、结构校验
|
|
222
|
+
├── client.js # Client:输入框下方药丸 + 展开卡片(手写浏览器模块,免构建)
|
|
223
|
+
├── locale/{en,zh}.json # 插件管理器里的标题/描述
|
|
224
|
+
├── icon.svg # 插件图标
|
|
225
|
+
└── tests/billing-core.test.mjs # node --test 单元测试
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Host 半零运行时依赖;Client 半只使用浏览器模块表里的 `react` / `react-dom`。
|
|
229
|
+
|
|
230
|
+
## 开发
|
|
231
|
+
|
|
232
|
+
```sh
|
|
233
|
+
cd dsh-plugin-billing-card
|
|
234
|
+
node --check index.js && node --check billing-core.js && node --check client.js
|
|
235
|
+
node --test tests/*.test.mjs
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
MIT
|