dsh-cost-meter 1.8.2 → 1.8.3
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 +511 -511
- package/README.zh-CN.md +515 -515
- package/docs/billing-statistics.md +53 -53
- package/lib/client.js +5 -5
- package/lib/native-search-billing.js +50 -9
- package/lib/store.js +7 -0
- package/lib/typert.host.js +3 -0
- package/package.json +147 -147
package/README.zh-CN.md
CHANGED
|
@@ -1,515 +1,515 @@
|
|
|
1
|
-
# dsh-cost-meter
|
|
2
|
-
|
|
3
|
-
[English](README.md) | **简体中文**
|
|
4
|
-
|
|
5
|
-
<div align="center">
|
|
6
|
-
|
|
7
|
-
**DeepSeek Harness 会话费用统计插件(界面中英双语)**
|
|
8
|
-
|
|
9
|
-
本会话费用 · 当日费用 · OpenCode Go 订阅额度显示 · 预算与已用百分比 · 官方账户余额 · 自定义 Provider 余额查询(可配任意 HTTP 端点) · 余额三段进度条 · 历史记录 · 峰谷计价时段显示(UTC 01:00–04:00、06:00–10:00 为峰时段;周末与中国法定假日全天按谷价,分别标注) · 峰/谷切换前弹窗与系统通知提醒(位置/提前量/提醒类型可配) · 官方价格一键同步 · 类 Codex Token 用量热图 · 多厂商多模型价格计费(内置 90+ 模型价格目录与自动匹配) · 主流 Coding Plan 额度查询与显示(Anthropic / Z.ai / MiniMax / Kimi / OpenRouter / SiliconFlow / CommandCode / SCNet / 火山方舟 / 千问 / 小米 MiMo 十一家,含 Volcano Ark AK/SK 签名与 MiMo 控制台 Cookie 查询) · Plan/API 双轨计费(订阅额度与按量金额分离统计,每 1% 额度与满窗的 token/等值金额估算及日/周/月曲线) · 输入框上方额度横条(预算/Go/Coding Plan 用量一条横排显示,可开关)
|
|
10
|
-
|
|
11
|
-
[,使用应用自带的 CLI 和 `desktop` Profile。
|
|
16
|
-
|
|
17
|
-
[](https://www.npmjs.com/package/dsh-cost-meter)
|
|
18
|
-
[](LICENSE)
|
|
19
|
-
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
20
|
-
[](https://awesome-dsh-plugin.com)
|
|
21
|
-
[](https://whaleharness.com/audit-report.md)
|
|
22
|
-
|
|
23
|
-
</div>
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-

|
|
28
|
-
|
|
29
|
-
## 功能总览
|
|
30
|
-
|
|
31
|
-
| 功能 | 位置 | 说明 |
|
|
32
|
-
|---|---|---|
|
|
33
|
-
| 计费统计与明细 | 会话输入框下方 / 标题栏 / 设置 → 费用 → 计费统计 | 输入、输出、缓存、推理费用;按轮次、模型、搜索和压缩统计;日、周、月及全部记录。[说明](docs/billing-statistics.md#简体中文) |
|
|
34
|
-
| 按模型花费卡片 | 侧栏 / 右下角 dock(可配) | 默认关闭;就地展开 Top-N、其它汇总、占比和可选 Token;支持今日 / 近 90 天、展开记忆及 Top-1 角标,见[使用说明](docs/model-cost-card.md) |
|
|
35
|
-
| 本会话费用 | 输入区下方 / 会话标题栏 | 实时累计费用 + 输入/缓存/输出 token;输入区下方在“输入”前显示缓存命中率(缓存读取 / 含缓存写入的全部输入),位置可配 |
|
|
36
|
-
| 官方余额 | 侧边栏顶部 / 设置页(可配) | 总余额 / 赠送 / 充值,自动刷新 + 手动刷新;可选三段进度条(蓝/橙/灰),当日段只统计官方渠道费用(不含 Coding Plan / 自定义 Provider) |
|
|
37
|
-
| 自定义 Provider 余额 | 侧边栏 / 设置页(可配) | 可配置 HTTP 查询任意 Provider 余额(LiteLLM 等);中/英名称、币种、extract 规则(点路径 / 数字常量 / add / subtract / divide,divide 适配 NewApi 等 quota 端点,见下方[示例](#自定义-provider-余额配置示例newapi-模板));与 Coding Plan 同区可折叠配置 |
|
|
38
|
-
| OpenCode Go 额度 | 侧边栏 / 设置页 / 右下角(dock,可配) | 滚动 5 小时 / 本周 / 本月用量百分比与重置时间,三档可分别开关,可同时显示预算已用%;Key 自动发现(专用引用 / 官方 Go 路由 apiKeyEnv / 环境变量 / opencode 登录态)或手动填写 |
|
|
39
|
-
| Coding Plan 额度 | 侧边栏 / 设置页(每家可配) | 多厂商 coding plan 订阅额度查询(Anthropic Claude Pro/Max、Z.ai/智谱 GLM、MiniMax Token Plan、Kimi Code 本周/5 小时配额(无订阅 Key 时回落 PAYG 余额)、OpenRouter credits、SiliconFlow 余额、CommandCode 5h/周窗口与月度 Credits 余额、小米 MiMo Token Plan 套餐/补偿积分窗口与周期截止重置、余额(控制台 Cookie 凭据)、火山方舟 Volcano Ark 5h/周/月三档(需 AK/SK 管控面 HMAC 签名,需 ArkReadOnlyAccess + BillingCenterReadOnlyAccess)),各家独立启用开关、凭据、显示位置与刷新间隔(侧边栏卡片与 Go 额度同款,收起窄栏显示百分比),默认使用官方端点,MiniMax 可[配置可信查询域名](docs/minimax-quota-endpoint.md);无凭据/无订阅为中性提示;SCNet 超算互联网 Token Plan 支持[外部控制台额度快照](docs/scnet-official-snapshot.md),无有效快照时按官方 Credits 抵扣表由本地账本估算月度用量(无需凭据) |
|
|
40
|
-
| 额度横条 | 输入框上方(显示设置可开关) | 一条横排 chips 实时显示预算已用% / Go 主窗口 / 各已启用 Coding Plan 用量窗口(短标签+迷你进度条,≥80% 预警、≥100% 超支,悬停见重置时刻);点击任意 chip 即刷新对应数据源(budget→状态、Go→Go 额度、厂商→该家全部窗口),同一厂商多窗口融合为一条 chip 分段显示;首次更新弹引导卡由用户自主决定开关;无可用数据自动隐藏 |
|
|
41
|
-
| 点击立即刷新 | 侧边栏余额/额度图框 | 官方余额 / 自定义余额 / Coding Plan 图框(含窄栏收起态)点击即触发一次查询,刷新中呼吸闪烁,失败保持原值并在悬停提示说明;键盘 Enter/Space 可触发;更新后首次进入有引导提示 |
|
|
42
|
-
| 简化侧栏显示 | 设置 → 费用 → 显示 | 可选开启;更新首次提示选择,压缩卡片和明细,面板高度限制为视口的 38% 且不超过 320 像素;保留金额、额度、点击刷新与悬停详情,关闭后恢复原布局。[使用说明](docs/sidebar-simple.md) |
|
|
43
|
-
| 当日费用 | 侧边栏底部(设置按钮上方) | 「今日 ¥x」,悬停见调用次数与 token 明细 |
|
|
44
|
-
| 预算图框 | 侧边栏底部(余额行与设置按钮之间) | 圆角方形图框:预算、已用%、进度条、今日费用与占预算%、已用/额度,≥80% 预警、≥100% 超支 |
|
|
45
|
-
| 汇总卡片 | 设置页 | 今日 / 本月 / 累计费用与调用次数 |
|
|
46
|
-
| 外部用量 | 设置 → 费用 | 同账户其他进程通过[只读快照](docs/external-usage.md#中文)提供用量;按来源查看 token、调用、费用和近期每日记录,并显示 DSH + 外部的日/月/累计合计。有效快照的今日费用参与官方余额对账。 |
|
|
47
|
-
| Token 用量统计 | 设置页(费用设置) | 历史累计 token 总量(输入/缓存/输出/调用)+ 类 Codex 的 26 周每日用量方格热图,横向铺满设置页宽度,悬停见当日明细 |
|
|
48
|
-
| Token Plan 用量统计 | 设置页(用量) | 各已启用 Coding Plan(含 Go)当前窗口的「每 1% 额度」与「满窗 100%」对应的 token 数与等值金额估算(采样差分/当前用量折算),附每日/每周/每月用量曲线;Plan 类调用金额只记等值,不动真金白银(issue #64) |
|
|
49
|
-
| 今日会话明细 | 设置页 | 每个会话的调用次数、输入/缓存/输出 token 与费用 |
|
|
50
|
-
| 历史记录 | 设置页 | 按天汇总,保留天数可配(默认 180 天) |
|
|
51
|
-
| 历史按模型统计回填 | 设置页(按模型统计) | 按模型统计上线前的旧账本自动回放宿主会话日志重建逐模型 token/费用拆分(旧调用按当时基础价),日志已清理的部分归入「早期未分模型」残差行 |
|
|
52
|
-
| 导入安装前历史 | 首次启动自动 | 安装/升级后首次启动自动回放宿主全部会话日志,把未装插件时期的对话导入账本(缺失日期整日重建,已有日期只补未知会话,幂等不与实时计费重复;金额按事件时刻历史价回推);设置页保留手动重跑入口 |
|
|
53
|
-
| 预算设置 | 设置页顶部 | 额度、周期(今日/本月/累计/自定义日期区间)、已用% |
|
|
54
|
-
| 价格表 | 设置页 | 每模型 谷时/峰时 两档价格(支持 input/output 简写,缓存价自动补齐),增删改自由 |
|
|
55
|
-
| 峰谷计价时段显示 | 设置页 / 预算 / 今日费用 | 显示 UTC 峰时段 01:00–04:00、06:00–10:00 与当前档位;周末和已配置的中国法定假日(北京日期)全天按谷价计费并分别标注;展开态显示时段条与倒计时,收起态显示竖向条,可单独开关 |
|
|
56
|
-
| 峰/谷切换弹窗提醒 | 全局浮层 | 距进入峰/谷时段不足设定提前量(默认 2 分钟,1-30 可配)时全屏色条徽标弹窗(提醒色区分进入峰/谷);弹窗位置可选**右下角 / 屏幕中心**,提醒类型可选(进入峰 / 进入谷 / 峰和谷),同一切换点只提醒一次;可选**同步发送浏览器(系统)通知**(页面最小化也能收到,需授权通知权限);设置页峰谷计价面板内配置,并可**一键预览弹窗效果**(真实组件渲染,文案/位置/通知与实际触发完全一致) |
|
|
57
|
-
| 官方价格同步 | 设置页 | 抓取解析官方定价页,一键应用;可选**官方价格币种**(美元·英文官方页 / 人民币·中文官方页),人民币价按展示汇率折算入账、展示人民币时与官方账单一致 |
|
|
58
|
-
| 界面语言 | 设置页 → 显示设置 | 简体中文 / English / 跟随浏览器(自动);切换即时生效并自动保存 |
|
|
59
|
-
| 隐藏官方余额 / 隐藏今日消耗 | 设置页 → 显示设置 | 两个独立开关:开启后对应 UI 区块(侧边栏余额行与面板 / 今日费用行、预算明细、概览今日卡片等)**整体不再渲染**,token 与调用次数统计不受影响,共享屏幕/截图防泄露 |
|
|
60
|
-
| AI 价格同步 | [提示词](docs/AI-PRICE-SYNC-PROMPT.md) | DeepSeek 官方同步;其他 provider 使用已核对的官方价格目录与手动配置 |
|
|
61
|
-
| 模型与 Plan 适配说明 | [适配文档](docs/model-and-plan-adaptation.md) | 各厂商模型计费与各 Coding Plan 的适配矩阵、自动匹配机制与价格来源([English](docs/model-and-plan-adaptation.en.md)) |
|
|
62
|
-
| 峰/谷切换提醒图解 | [提醒文档](docs/peak-alert.md) | 峰谷切换前弹窗与系统通知的完整图解:效果截图(中/英)、设置项说明与使用建议([English](docs/peak-alert.en.md)) |
|
|
63
|
-
| Token Plan 用量统计图解 | [面板文档](docs/token-plan-stats.md) | 每 1% 与满窗估算的四列含义、首尾差分估算方法与精度标注、口径边界(只统计 dsh 内调用)与用量曲线说明([English](docs/token-plan-stats.md#english)) |
|
|
64
|
-
| OpenRouter 透传定价 | [定价说明](docs/openrouter-pricing.md) | OpenRouter 原样透传上游价格:内置快照、旧账本自动回填、公开目录(无需认证)定时刷新合并,失败保留本地快照([English](docs/openrouter-pricing.md#english)) |
|
|
65
|
-
| 多 provider 计费 | 设置页 / 账本 | 支持 OpenAI、Anthropic、Google Gemini、Mistral 等 provider 的 input/output、缓存与 reasoning token 价格,按 provider+model 隔离计费 |
|
|
66
|
-
| 模型名自动匹配 | 设置页 / 账本 | 未知模型 id 自动匹配价格表:忽略大小写/空格/横杠/点号与括号附注,归一化等价或请求名包含表内模型名即命中(如 `gpt5.6 luna(go)`);路由 provider(opencode/zen 等)下跨厂商全库查找;可关闭为仅精确;未命中模型可手动指定计费条目 |
|
|
67
|
-
| 拓展价格表 | 设置页 → 拓展价格表 | 内置各厂商、按模型家族分类的参考价格目录(点开展开,厂商默认折叠);一键挂载参与计费,挂载的第三方模型默认收入表内可编辑;逐模型「在费用设置直接显示」开关自选哪些模型(含 DeepSeek)在「价格表」区直接显示 |
|
|
68
|
-
|
|
69
|
-
## 自定义 Provider 余额配置示例(NewApi 模板)
|
|
70
|
-
|
|
71
|
-
**POST 携带 JSON 请求体:**进入**设置 → 费用 → 额度**,展开自定义余额,选择 **POST**,在**请求体 (JSON)** 中填写接口要求的内容。例如接口需要账号参数,并返回 `{"data":{"balance":12.5}}`:
|
|
72
|
-
|
|
73
|
-
```json
|
|
74
|
-
{"account_id":"example-account","include_credit":true}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
把**解析规则 (JSON)** 设为 `{"remaining":"data.balance"}`。有效 JSON 按原文独立保存并发送,保留嵌套值和大整数 ID;格式错误会显示提示,保留上一次有效配置。清空编辑框后不再发送请求体;切换 GET/HEAD 不发送请求体,切回 POST 时保留原内容。未配置 Content-Type 时自动使用 `application/json`,手动请求头不区分大小写。
|
|
78
|
-
|
|
79
|
-
兼容已有 `request.body` 对象和原始字符串。请求体属于普通持久化配置,`{{VAR}}` 凭据替换只用于请求头;使用请求头认证时,可填写 `{"Authorization":"Bearer {{MY_API_KEY}}"}`,并通过下方凭据输入框设置密钥。
|
|
80
|
-
|
|
81
|
-
**按显示币种折算:**进入**设置 → 费用 → 额度**,展开一条自定义余额配置,开启**按显示币种折算(USD 余额)**。每条配置默认关闭;“余额原币种”仍应填写端点实际返回的币种。例如原余额为 USD 54.3792,显示币种为 CNY、汇率为 7.2、精度为两位小数时,显示 **¥391.53**。侧栏、设置页与悬停明细中的已用金额、接口上限和手动上限一起折算;进度比例和原始余额不变。手动上限按原币种输入。对应持久化字段为该 `customBalances[]` 条目的 `convertToDisplayCurrency: true`,也兼容旧 `customBalance` 配置。
|
|
82
|
-
|
|
83
|
-
全局汇率表示**美元到显示币种**的换算。原币种为 CNY/EUR 或积分时保留原单位,开关不可用;阿里云余额以接口返回币种为准。切换开关不查询汇率、不额外请求余额,关闭后立即恢复原币种。
|
|
84
|
-
|
|
85
|
-
千问 / 阿里云资金账户余额可直接点击「添加千问 / 阿里云余额」,使用 RAM AccessKey 签名查询,显示接口返回的可用金与币种;配置步骤、所需权限及口径见[千问余额说明](docs/qianwen-balance.md)。
|
|
86
|
-
|
|
87
|
-
千问 Token Plan 可在卡片内选择[官方 CLI 订阅额度](docs/qwen-cli-quota.md),需在 DSH 主机以同一系统账号安装 CLI 并运行 `qianwen auth login`。默认保留本地估算;CLI 模式显示账号当前 Credits,不修改本地账本。
|
|
88
|
-
|
|
89
|
-
千问 Token Plan 的本地 Credits 仅统计 `qwen`、`qwen-tokenplan`、`qianwen-tokenplan`、`qwen-token-plan`、`qianwen-token-plan` 订阅 provider(大小写不敏感,可带 `llm-` 前缀);显式归类为 API 的调用不计。`qianwen` 按量 provider 即使使用相同模型名也不会计入订阅额度。自定义渠道名需使用上述订阅名称之一,模型不在抵扣表中时需补充三项费率。
|
|
90
|
-
|
|
91
|
-
小米 MiMo Token Plan 的额度查询使用**控制台 Cookie**(而非 API Key):登录 `platform.xiaomimimo.com` 后按 F12 →「网络」→ 找到 `balanceAlertConfig` 请求,把请求头 `cookie` 整段粘贴进「设置 → 费用 → 额度」的 MiMo 卡片(需含 `serviceToken` 与 `userId`,DSH 凭据库以 `MIMO_COOKIE` 托管)。卡片显示套餐/补偿积分窗口与周期截止重置(北京时间)及余额行。控制台 Cookie 过期后,按卡片提示重新复制。此控制台查询不接受 Token Plan 推理专用 Key(`tp-*` / `ttp-*`)。本地套餐统计按自然月汇总;补偿积分和余额只展示查询结果,不用无法区分归属的本地调用估算。
|
|
92
|
-
|
|
93
|
-
CLIProxyAPI 网关来源卡片可勾选「只显示 Gemini 额度」,仅影响该来源的 Antigravity 分组。默认显示全部分组;过滤后无可见额度时显示空列表,解析错误仍单独报告。
|
|
94
|
-
|
|
95
|
-
自定义 Provider 余额的 `extract` 规则支持四种形式:数字常量、点路径字符串、`add`/`subtract` 多路径加减、`divide` 按 `by` 除数缩放。**`divide` 适用于 NewApi 等以 quota 整数计量的端点**(1 USD = 500000 quota,与 cc-switch 同款换算)。
|
|
96
|
-
|
|
97
|
-
- **`unit: "CREDITS"`**:非货币计数端点可选 `CREDITS`,按小数精度设置显示并标明 Credits。美元花费不转换为积分,也不显示由它推算的今日积分消耗;进度条仅使用接口返回的积分上限,全局货币预算不适用。
|
|
98
|
-
- **本机回环端点支持明文 HTTP**:端点主机为 `127.0.0.1` / `localhost` / `[::1]` 时允许 `http://`(流量不出网卡),用于只监听回环、不提供 TLS 的本地只读路由(如 `dsh-workbuddy-connect` 的 `/plugins/dsh-workbuddy-connect/status`)。**非回环主机仍强制 https**,明文请求一律拒绝。
|
|
99
|
-
|
|
100
|
-
### WorkBuddy 积分示例(本机插件路由)
|
|
101
|
-
|
|
102
|
-
已安装 `dsh-workbuddy-connect` 时,其 Web 状态路由直接返回聚合积分,无需复制任何凭据:
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"enabled": true,
|
|
107
|
-
"display": "sidebar",
|
|
108
|
-
"refreshMinutes": 15,
|
|
109
|
-
"label": "WorkBuddy 积分",
|
|
110
|
-
"labelEn": "WorkBuddy Credits",
|
|
111
|
-
"unit": "CREDITS",
|
|
112
|
-
"request": { "url": "http://127.0.0.1:3080/plugins/dsh-workbuddy-connect/status", "method": "GET", "headers": {} },
|
|
113
|
-
"extract": { "remaining": "credits.total" }
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
端口和响应字段按实际本机服务调整。该示例要求对应插件已提供此路由;本插件拒绝跟随重定向,现有凭据主机白名单继续生效。
|
|
118
|
-
|
|
119
|
-
以 NewApi 的 `GET /api/usage/token` 为例(响应 `{ "code": 200, "data": { "total_granted": ..., "total_used": ..., "total_available": ..., "unlimited_quota": false } }`):
|
|
120
|
-
|
|
121
|
-
```json
|
|
122
|
-
{
|
|
123
|
-
"enabled": true,
|
|
124
|
-
"display": "both",
|
|
125
|
-
"refreshMinutes": 15,
|
|
126
|
-
"label": "NewApi",
|
|
127
|
-
"labelEn": "NewApi",
|
|
128
|
-
"unit": "USD",
|
|
129
|
-
"request": {
|
|
130
|
-
"url": "https://你的NewApi域名/api/usage/token",
|
|
131
|
-
"method": "GET",
|
|
132
|
-
"headers": { "Authorization": "Bearer {{NEWAPI_API_KEY}}" }
|
|
133
|
-
},
|
|
134
|
-
"extract": {
|
|
135
|
-
"remaining": { "op": "divide", "path": "data.total_available", "by": 500000 },
|
|
136
|
-
"maxBudget": { "op": "divide", "path": "data.total_granted", "by": 500000 },
|
|
137
|
-
"spend": { "op": "divide", "path": "data.total_used", "by": 500000 },
|
|
138
|
-
"unit": "USD"
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
- `{{NEWAPI_API_KEY}}` 从 DSH 凭据库或环境变量解析(**仅请求头支持占位符**,URL 需写死完整地址);
|
|
144
|
-
- 无限额度 token(`unlimited_quota: true`)没有 `total_available`,无法提取 `remaining`,查询会报「remaining is missing or not numeric」——请改用有限额度 token,或在中间层端点换算;
|
|
145
|
-
- 配置入口:设置 → 费用(额度标签)→「自定义 Provider 余额」展开配置;或直接改 `storages/cost-meter/ledger.json` 的 `config.customBalance`。
|
|
146
|
-
|
|
147
|
-
### 凭据与安全
|
|
148
|
-
|
|
149
|
-
- **变量名命名规则**:`{{VAR_NAME}}` 的参考格式为 `<ROUTE>_API_KEY`——`<ROUTE>` 对应 DSH 模型配置页(设置 → 模型)里的 Provider ID,把 ID 大写、非字母数字字符替换为下划线,例如 `openai`→`{{OPENAI_API_KEY}}`、`anthropic`→`{{ANTHROPIC_API_KEY}}`、`abc23-d`→`{{ABC23_D_API_KEY}}`。与模型页共用同一变量名,自定义余额查询与模型调用即**共用同一把密钥**(都从 DSH 凭据库解析)。该说明也展示在设置页「请求头 (JSON)」输入框上方。
|
|
150
|
-
- **凭据输入框**:展开条目配置后,「凭据输入」区会为请求头里出现的每个 `{{VAR}}` 占位符显示一行 write-only 输入框,密钥直接存入 DSH 凭据库(不落盘、不回显、不经 `ledger.json`),无需再手改环境变量或凭据文件。
|
|
151
|
-
- **明文密钥自动迁移**:旧版本把 `Bearer sk-…` 明文写在请求头里时会明文落盘;插件在启动时自动把这类明文导入 DSH 凭据库,并把头值替换为 `{{CUSTOM_BALANCE_KEY_…}}` 占位符(名称由条目 host + 头名派生,跨重启稳定),功能不受影响。此后 `ledger.json` 与下发给浏览器的配置**永不包含明文密钥**——疑似密钥头(Authorization / X-Api-Key / Bearer / sk- 前缀 / 长不透明串)一律置空,占位符与普通头照常保留。
|
|
152
|
-
- **凭据白名单 `allowedHosts`**:请求头携带密钥(占位符或明文)时,出站主机必须命中该白名单,否则直接拒绝——用于防止「导入他人配置」导致密钥外带。未配置白名单时放行并在日志警告一次。设置页条目面板内有「凭据白名单主机」输入框(逗号分隔)。
|
|
153
|
-
- **混合凭据模板**:同一头值同时含静态密钥与动态占位符时,不能自动整体迁移为嵌套凭据。插件提示待处理并阻止该值落盘、下发;请将静态部分另存为凭据,改用纯引用组合。正常的 `Bearer {{VAR}}` 或 `{{USER}}:{{PASS}}` 保留。
|
|
154
|
-
|
|
155
|
-
## CLIProxyAPI 网关额度与 WorkBuddy 积分 (Issue #87)
|
|
156
|
-
|
|
157
|
-
支持对接本地或局域网部署的 [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) 代理网关,集中观测代理的多个 Provider 账号额度与 WorkBuddy 插件积分:
|
|
158
|
-
|
|
159
|
-
- **多 Provider 账号原生适配**:自动通过 CPA Management API 发现账号,接入 Antigravity、Claude、Codex、Kimi、xAI (Grok) 官方原生配额/用量接口。统一归一化为 5h / 7d / weekly / monthly 等用量百分比窗口与 ISO 重置时刻。
|
|
160
|
-
- **WorkBuddy 插件积分**:只读接入 WorkBuddy 插件 `/v0/management/plugins/workbuddy/credits` 路由,展示账户总积分、已用/剩余与套餐周期,保留独立账号卡片。
|
|
161
|
-
- **零计费副作用保证**:严禁并杜绝任何产生计费消耗的操作——不调用 Codex 的 reset-credit consume 端点,不向 xAI 发送消耗 token 的 chat probe,不调用 WorkBuddy 的任何变更性 POST 路由。
|
|
162
|
-
- **严格凭据隔离与安全门禁**:
|
|
163
|
-
- Management Key 通过只写 (write-only) 形式托管于 DSH 凭据库 (`CLIPROXYAPI_MANAGEMENT_KEY_<SOURCE_ID>_<HASH>`),永不存入配置文件、账本或浏览器 state。
|
|
164
|
-
- 请求路径严格限制为三条固定管理路径 (`/v0/management/auth-files`、`/v0/management/api-call`、`/v0/management/plugins/workbuddy/credits`),禁止任意 URL 拼接。
|
|
165
|
-
- 严格出站白名单 (`allowedHosts`):非 loopback 来源必须精确命中白名单,非 loopback HTTP 必须显式开启 `allowInsecureHttp`。
|
|
166
|
-
- 强制禁止 HTTP 重定向 (`redirect: 'manual'`, 3xx 状态码坚决拒绝),防止网关重定向劫持或凭据外带。
|
|
167
|
-
- 账号隐私与元数据过滤:auth-files 响应仅提取必需字段,剔除 raw tokens / cookies / ID claims,展示层邮箱自动脱敏掩码 (`s***@domain`)。
|
|
168
|
-
|
|
169
|
-
## 双语界面
|
|
170
|
-
|
|
171
|
-
插件界面(会话徽章、侧边栏余额与预算图框、设置页全部文案)支持**简体中文**与**English**:
|
|
172
|
-
|
|
173
|
-
- 语言可选 **简体中文** / **English** / **跟随浏览器(自动)**;
|
|
174
|
-
- 默认「跟随浏览器」:自动探测浏览器语言(`zh*` → 中文,其余 → 英文),并把探测结果写回配置,服务端消息(余额查询、价格同步等)与界面语言保持一致;
|
|
175
|
-
- 在 **设置 → 费用 → 显示设置 → 界面语言** 中切换,切换后整个插件界面即时生效并自动保存;设置页左侧的分节标签也随之切换(费用 / Cost);
|
|
176
|
-
- 服务端返回的提示(余额刷新、官方价格同步、配置校验错误等)同样按当前语言输出。
|
|
177
|
-
|
|
178
|
-
## 图文演示
|
|
179
|
-
|
|
180
|
-
> 截图均取自真实 DeepSeek Harness 实例,默认以中文界面展示;插件界面本身中英双语,可在设置中切换为 English。
|
|
181
|
-
|
|
182
|
-
### 主页面
|
|
183
|
-
|
|
184
|
-
**侧边栏底部**(自上而下:官方余额 → 额度 / 预算图框 → 设置按钮):
|
|
185
|
-
|
|
186
|
-

|
|
187
|
-
|
|
188
|
-
- 余额行显示官方开放平台总余额,悬停可见赠送/充值拆分;开启「余额进度条」后以三段图框展示(蓝=余额,橙=当日,灰=已用);
|
|
189
|
-
- 自定义 Provider 余额(如 LiteLLM)可配置 HTTP 查询,侧边栏与设置页同图框样式;
|
|
190
|
-
- 未启用预算时,该位置显示「今日 ¥x」徽章。
|
|
191
|
-
|
|
192
|
-
**余额进度条与自定义 Provider 配置**:
|
|
193
|
-
|
|
194
|
-
| 侧边栏进度条 + 显示设置 | 自定义 Provider 余额面板 |
|
|
195
|
-
|---|---|
|
|
196
|
-
|  |  |
|
|
197
|
-
|
|
198
|
-
- 显示设置 →「余额进度条」全局开关;可选「额度上限」覆盖 API 的 `max_budget`;
|
|
199
|
-
- 设置 → 费用 →「自定义 Provider 余额」:展开后编辑 URL / Headers(JSON) / extract(JSON)、中/英名称与币种。
|
|
200
|
-
|
|
201
|
-
**额度 / 预算图框三态**(OpenCode Go 额度与预算各自独立开关,同款圆角图框;两者同时开启时自动**合并为一张卡片**,Go 在上、预算在下,细分隔线、各自保留预警色;「图框详细信息」开关可收起次要行,只保留 标签 + 已用% + 进度条):
|
|
202
|
-
|
|
203
|
-
| 仅 OpenCode Go 额度 | 仅预算 | 两者合并 |
|
|
204
|
-
|---|---|---|
|
|
205
|
-
|  |  |  |
|
|
206
|
-
|
|
207
|
-
- 预算图框显示「预算 · 已用% · 进度条 · 今日费用与占预算% · 已用/额度」,≥80% 预警、≥100% 超支;窄栏(rail)模式收窄为百分比方块;
|
|
208
|
-
- 峰谷计价时段显示 UTC 峰时段 01:00–04:00、06:00–10:00 与当前档位;预算框与今日费用区域显示单行紧凑时段条——细轨道左橙右蓝、标记线指向当前时段,右侧文字为当前时段与距下次切换的倒计时(30 秒刷新),不显示价格;可在设置中单独关闭,并在「峰谷时段条样式」中切换简洁/经典两种样式;rail 窄栏显示同构的竖向时段条,下方横排短词「峰时 / 平价」,倒计时与完整文案悬停可见;
|
|
209
|
-
|
|
210
|
-
**峰时/平价时段条与收起态竖向进度条**:
|
|
211
|
-
|
|
212
|
-
| 设置页峰谷面板(提示开关/样式切换/预览) | 设置页右下角(dock)显示与图框详细信息 |
|
|
213
|
-
|---|---|
|
|
214
|
-
|  |  |
|
|
215
|
-
|
|
216
|
-
时段条与收起态竖向条真实 DSH 侧边栏实拍(现行样式),按 UI 类型分组(图示为峰时):
|
|
217
|
-
|
|
218
|
-
**不收起(展开态)**——预算框 / 今日费用区域显示单行时段条:
|
|
219
|
-
|
|
220
|
-
| 简洁 | 经典 |
|
|
221
|
-
|---|---|
|
|
222
|
-
|  |  |
|
|
223
|
-
|
|
224
|
-
- 简洁:细轨道左橙右蓝、标记线指向当前时段,右侧短文案「峰时 · N小时后进入平价」;
|
|
225
|
-
- 经典:同款轨道与标记线,右侧完整文案「峰时 · 距平价 HH:MM:SS」倒计时(30 秒刷新),不显示价格。
|
|
226
|
-
|
|
227
|
-
**收起(rail 窄栏)**——侧边栏底部堆叠竖向时段条,与百分比方块居中对齐:
|
|
228
|
-
|
|
229
|
-
| 简洁 | 经典 |
|
|
230
|
-
|---|---|
|
|
231
|
-
|  |  |
|
|
232
|
-
|
|
233
|
-
- 简洁:竖向条下方仅横排短词「峰时 / 平价」;
|
|
234
|
-
- 经典:竖向条下方竖排完整文案,含距下次切换的倒计时;两种样式下完整文案均悬停可见。
|
|
235
|
-
|
|
236
|
-
- 提示遵循 `peakNotice` / `peakEnabled` / `peakEffectiveAt` / `peakWindows` 门控,按 UTC 峰时窗口显示;
|
|
237
|
-
- 设置 → 费用 → 峰谷计价 下可单独开关「峰时高价时段显著提示」,关闭后展开态时段条与收起态竖向条同时隐藏;
|
|
238
|
-
- 上方第一张为设置页峰谷面板截图(提示开关、样式切换与实时预览);时段条与收起态竖向条的实拍效果见上述分组配图;右下角(dock)各项开关与图框详细信息开关见第二张截图。
|
|
239
|
-
|
|
240
|
-
- Go 图框按主档位(默认滚动 5 小时,可在显示设置切换周/月)显示已用% 与进度条,下方一行展示其余两档与重置时间:
|
|
241
|
-
|
|
242
|
-

|
|
243
|
-
|
|
244
|
-
**右下角(dock)额度 / 预算 chips**(显示设置中开启,四项独立开关:5h / 周 / 月额度 + 预算已用%):
|
|
245
|
-
|
|
246
|
-
| 右下角实际显示 | 显示设置(开关位置) |
|
|
247
|
-
|---|---|
|
|
248
|
-
|  |  |
|
|
249
|
-
|
|
250
|
-
**本会话费用**(两个位置,可在设置中切换):
|
|
251
|
-
|
|
252
|
-
| 输入区下方 | 会话标题栏 |
|
|
253
|
-
|---|---|
|
|
254
|
-
|  |  |
|
|
255
|
-
|
|
256
|
-
> 上图:本会话 ¥5.5939 · 输入 321K · 缓存 119M · 输出 235K;右图:标题栏徽章「费用 ¥6.1606」(真实会话截图)
|
|
257
|
-
|
|
258
|
-

|
|
259
|
-
|
|
260
|
-
### 设置 → 费用
|
|
261
|
-
|
|
262
|
-
**概览**(OpenCode Go 额度 → 预算 → 余额 → 汇总卡片 → 今日会话 → 历史记录 → 显示设置 → 价格表 → 数据与同步):
|
|
263
|
-
|
|
264
|
-

|
|
265
|
-
|
|
266
|
-
**OpenCode Go 额度面板**(设置页最顶部:三档进度条,主档位高亮,手动刷新;未订阅时为中性提示,可一键关闭):
|
|
267
|
-
|
|
268
|
-

|
|
269
|
-
|
|
270
|
-
**预算面板**(含自定义日期区间):
|
|
271
|
-
|
|
272
|
-

|
|
273
|
-
|
|
274
|
-
**余额面板**(总余额/赠送/充值 + 手动刷新):
|
|
275
|
-
|
|
276
|
-

|
|
277
|
-
|
|
278
|
-
**显示设置**(Go 主档位与 Key、右下角 chips、图框详细信息等):
|
|
279
|
-
|
|
280
|
-

|
|
281
|
-
|
|
282
|
-
**汇总卡片**:
|
|
283
|
-
|
|
284
|
-

|
|
285
|
-
|
|
286
|
-
**Token 用量统计**(历史累计总量 + 类 Codex 的 26 周方格热图,横向铺满设置页宽度;无用量日为半透明玻璃格):
|
|
287
|
-
|
|
288
|
-

|
|
289
|
-
|
|
290
|
-
**今日会话 / 历史记录**(输入、缓存、输出 token 分列):
|
|
291
|
-
|
|
292
|
-
 
|
|
293
|
-
|
|
294
|
-
**价格表**(谷时/峰时两档,支持 input/output 简写,美元 / 1M tokens):
|
|
295
|
-
|
|
296
|
-

|
|
297
|
-
|
|
298
|
-
**数据与同步**(配置即时自动保存 + 官方价格同步 + 清除历史):
|
|
299
|
-
|
|
300
|
-

|
|
301
|
-
|
|
302
|
-
## 安装
|
|
303
|
-
|
|
304
|
-
> 需求:Node.js ≥ 20 + DeepSeek Harness(带 `dsh plugin` 命令的版本,`npm install -g @deepseek-ai/dsh`)+ **DSH 进程的 PATH 中可找到 pnpm**;通过 npm 包名或插件市场安装也需要 pnpm。下方固定的 pnpm 11 需要 Node.js ≥ 22.13;Node.js 20 可使用 pnpm 10。
|
|
305
|
-
|
|
306
|
-
### 一键安装(推荐)
|
|
307
|
-
|
|
308
|
-
**macOS / Linux 首次安装准备:**在启动 DSH 的终端安装 pnpm(Windows 也可执行相同命令):
|
|
309
|
-
|
|
310
|
-
```sh
|
|
311
|
-
npm install -g pnpm@11.21.0
|
|
312
|
-
pnpm --version
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
Node.js 20 请改用 `npm install -g pnpm@10`。版本要求见 [pnpm 官方安装说明](https://pnpm.io/installation)。
|
|
316
|
-
|
|
317
|
-
**npm 包名安装**(已发布到 npm registry,始终跟随最新版本;无需 git):
|
|
318
|
-
|
|
319
|
-
```sh
|
|
320
|
-
dsh plugin --profile web add dsh-cost-meter
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
**PowerShell 一键脚本**(复制整行粘贴回车;自动补齐 pnpm、自动探测 git,无需克隆仓库;安装链**固定到发布 tag `v1.8.
|
|
324
|
-
|
|
325
|
-
```powershell
|
|
326
|
-
irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.8.
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
**或直接命令行**(机器上需已有 pnpm 与 git;同样固定到 tag):
|
|
330
|
-
|
|
331
|
-
```sh
|
|
332
|
-
dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.8.
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
没有 git 时可用 GitHub tag 打包直链:
|
|
336
|
-
|
|
337
|
-
```sh
|
|
338
|
-
dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.8.
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
安装后**重启** `dsh web`(插件行、Typert 清单与客户端 bundle 均在启动时扫描):
|
|
342
|
-
|
|
343
|
-
```sh
|
|
344
|
-
dsh web
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### 安装排障:pnpm was not found(macOS / Linux)
|
|
348
|
-
|
|
349
|
-
报错 `dsh: pnpm was not found; install pnpm and make it available on PATH.` 表示 DSH 无法启动包管理器,此时尚未加载插件。使用 npm 包名安装同样依赖 pnpm。
|
|
350
|
-
|
|
351
|
-
完成上方准备后,在启动 DSH 的**同一终端、同一系统用户**下检查:
|
|
352
|
-
|
|
353
|
-
```sh
|
|
354
|
-
command -v node
|
|
355
|
-
command -v pnpm
|
|
356
|
-
command -v dsh
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
如果 npm 已安装 pnpm,但终端仍找不到命令,将 npm 全局可执行文件目录加入当前终端的 PATH,然后重试:
|
|
360
|
-
|
|
361
|
-
```sh
|
|
362
|
-
export PATH="$(npm prefix -g)/bin:$PATH"
|
|
363
|
-
pnpm --version
|
|
364
|
-
dsh plugin --profile web add dsh-cost-meter@latest
|
|
365
|
-
dsh web
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
重启前先停止原 DSH 进程。插件市场运行于 DSH 内,继承的是该进程的 PATH;只刷新浏览器不会更新 PATH。使用 nvm/fnm 时,先选择 DSH 使用的 Node.js 版本,再安装 pnpm。若 npm 报 `EACCES`,按 pnpm 文档使用当前用户可写的 Node.js 安装目录或全局安装前缀,再检查 PATH。需要长期生效时,将可执行文件目录写入相应 shell 配置。重启 DSH 后出现插件,才表示在该机器上安装成功。
|
|
369
|
-
|
|
370
|
-
### 安装排障:ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION
|
|
371
|
-
|
|
372
|
-
症状:`dsh plugin --profile web add` 阶段安装失败,pnpm 报 `[ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION] N lockfile entries failed verification`。
|
|
373
|
-
|
|
374
|
-
原因:你的环境(pnpm 配置或上层安装器自带策略)启用了「最小发布年龄」供应链保护——lockfile 中**发布时间距今小于阈值**的包一律拒绝。插件引入依赖精确锁版之前的历史版本,生产依赖是浮动区间,首次安装会解析到当时最新发布版(实测 `^0.1.0-rc.6` 漂到仅发布一周左右的 rc.8),在该策略下即被拒绝。
|
|
375
|
-
|
|
376
|
-
处理:
|
|
377
|
-
|
|
378
|
-
1. **升级插件并使用宿主插件安装器**:独立运行依赖 `zod` 保持精确锁版;`@deepseek-ai/dsh-credentials`、`@deepseek-ai/dsh-home-paths` 改由宿主通过 peer dependency 提供,避免另装旧版宿主包触发依赖预检(issue #106)。精确锁版能防止版本漂移,但不能保证满足任意年龄阈值;
|
|
379
|
-
2. 若仍出现年龄限制,可等待该版本达到阈值,或在核实报错中的具体包与版本后,由你决定是否在 profile 的 `pnpm-workspace.yaml`(默认 `$DSH_HOME/profiles/web/pnpm-workspace.yaml`)加入单项排除:
|
|
380
|
-
|
|
381
|
-
```yaml
|
|
382
|
-
minimumReleaseAgeExclude:
|
|
383
|
-
- '<报错中的包名>@<版本>'
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
DSH `0.2.0-rc.1` 已通过安装包安装、Web 启动、模块复用、合成计费、RPC 和完整回归。此前宿主适配验证覆盖 DSH `0.1.2-rc.1`、`0.1.3-alpha.2`、`0.1.5-alpha.1` 的安装、启动、模块复用和卸载;`0.1.3-alpha.1` 在此前核查中无可获取的官方 npm 版本,暂标记为未知。验证环境及边界见[兼容记录](docs/host-compatibility.md)。
|
|
387
|
-
|
|
388
|
-
如果插件市场仅显示 `diagnostics: .../.plugin-manager/logs/operation-.../pnpm.log`,这行信息无法指出失败的包或命令。请打开所指的 `pnpm.log`,反馈其中第一条实际错误;分享前删去凭据及私人路径。DSH `0.2.0-rc.1` 的 Git 地址和 npm 包名安装已在隔离 Windows 环境通过;特定机器上的失败仍需要该机器的诊断日志。
|
|
389
|
-
|
|
390
|
-
账号模式下余额返回 HTTP 401:请在「设置 → 费用 → 官方账户余额」保存独立的开放平台 API Key。凭据优先级和存储说明见[余额专用凭据](docs/balance-credentials.md)。
|
|
391
|
-
|
|
392
|
-
### 更新 / 卸载
|
|
393
|
-
|
|
394
|
-
```sh
|
|
395
|
-
# 更新:发布新版后用新版 install.ps1 重跑(脚本内固定版本随之更新)
|
|
396
|
-
dsh plugin --profile web remove dsh-cost-meter # 卸载
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
安装报错或重装后仍被禁用,见[排障说明](docs/install-troubleshooting.md)。
|
|
400
|
-
|
|
401
|
-
### 开发者本地调试
|
|
402
|
-
|
|
403
|
-
```sh
|
|
404
|
-
git clone https://github.com/Han-1413141/dsh-cost-meter.git
|
|
405
|
-
cd <克隆目录的父目录>
|
|
406
|
-
dsh plugin --profile web add link:./dsh-cost-meter # 符号链接,改 lib/client.js 后刷新页面即生效
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
## 计费规则
|
|
410
|
-
|
|
411
|
-

|
|
412
|
-
|
|
413
|
-
- 价格单位与官方文档一致:**美元 / 1M tokens**;
|
|
414
|
-
- 成本 = 未命中输入 × cache-miss + 输出 × output + (缓存读 + 缓存写) × cache-hit(缓存写沿用官方历史规则按命中价计费);
|
|
415
|
-
- **纯峰谷两档计价**(2026-08 起官方方案):峰时段(01:00–04:00、06:00–10:00 UTC)按峰时价,其余按谷时价(谷时价 = 峰时价的一半);基础档与谷时档同价,未启用峰谷时按谷时价计;设置页实时显示当前档位(峰时段/谷时段);预算与今日费用区域显示峰时/平价时段条(当前/下一时段与倒计时),收起态显示竖向峰谷进度条;
|
|
416
|
-
- **周末与法定假日全天谷价**:自 2026-08-23 北京时间 00:00 起,周六、周日全天谷价,调休上班的周末也不例外。中国法定假日同样全天谷价。`peakHolidays` 为 `YYYY-MM-DD` 北京日期数组,默认预置 2026 年峰谷规则生效后的中秋和国庆日期;以后可在 设置 → 费用 → 峰谷计价 中修改。时段条单独标注假日并倒计时至下一次实际价格变化。历史 DeepSeek 金额升级时从完整会话日志一次性重算;日志不完整的记录保留原金额;
|
|
417
|
-
- **历史计费正确性**:2026-08-16 16:00 UTC(峰谷时代分界)之前的调用按当时的基础价计费,之后的调用按峰谷两档;
|
|
418
|
-
- 账本金额恒以**美元**存储,币种/汇率仅影响显示(默认 1 USD = 7.2 CNY,可改);
|
|
419
|
-
- 会话徽章与当日/月度/累计、预算一样,按每次调用的**实际时刻精确计费**(宿主导出的逐次成本);
|
|
420
|
-
- 计费来源为通过宿主 `llm/stream` 上报的 usage 块,包含隔离 LLM 服务中的子代理、压缩、标题等辅助调用。子会话按自己的 `sessionId` 记录,不并入父会话徽章;无 `sessionId` 的后台调用只计入日/月/累计总额。记忆等插件若直接请求外部 API、未向宿主上报 usage,本插件无法统计该部分消耗;
|
|
421
|
-
- **峰谷档位按请求发起时刻判定**:流式调用可能跨峰谷边界整点,以完成时刻归档会把数分钟前发起的请求算进另一个峰位;
|
|
422
|
-
- **峰谷生效时刻锚定**:官方价格页已不再标注生效时间,价格同步不再把峰谷生效时刻重置为「同步时刻」——历史重算(会话投影回放 / 按模型回填)一律按 2026-08-16 16:00 UTC 分界判档,峰时历史事件不再被按谷价半价重算;此前被污染的存量账本升级时自动钳制修复(幂等迁移);
|
|
423
|
-
- **币种切换即全量换基准**:「价格币种」切换并同步后,历史账目按新价目在后台整体重算(会话日志覆盖完整的日子整体替换,日志已清理的会话保持原口径),历史与官方账单同基准,完成后有提示;升级到本版时,此前切换过币种而新旧口径并存的存量账本自动重算一次;
|
|
424
|
-
- **官方账单对齐口径**:① 与官方实时数字存在**分钟级时差**属预期——账本 2 秒防抖落盘,关停瞬间仍在途的流会被服务端照常扣费而 usage 块无人接收(缺口集中在缓存命中列);② reasoning tokens 由 API 单独上报且**不计费**,token 列为五桶合计,与官方「三列」天然对不齐,**对账请以金额为准**;③ 「价格币种」设为人民币时按官方 CNY 价目直计入账,与人民币账单币种一致(CNY 计价账号推荐);设为 USD 时显示金额经固定汇率折算,与 CNY 直计存在结构性细差(两套价目比值非均匀);
|
|
425
|
-
- 预算与超支提示**仅提醒,不阻止调用**。
|
|
426
|
-
- **Plan/API 双轨计费**(issue #64):订阅制渠道(MiniMax / Codex 手动标记等)的调用金额只记「等值」,预算/今日费用/概览卡片等金额展示仅统计按量计费(API)部分;
|
|
427
|
-
- **「含 Plan 总额」开关**:概览页汇总卡片下的快捷开关切换全部金额展示口径——关闭时仅计真金白银(API 渠道),开启后显示含 Plan 等值的总金额;网关路由(provider 缺失)调用的第三方目录模型自动归入对应订阅归类,无模型明细的历史残差计入 API 口径;设置 → 用量 的 Token Plan 统计面板提供每 1% 额度与满窗的 token/等值金额估算与日/周/月曲线;分类可在配置中按厂商或 provider:model 级覆盖。
|
|
428
|
-
- **全仓安全审计修复**:账本退出丢写(close/flush 次序)、发版脚本命令注入、面板空指针崩溃(Go 月窗空值)3 项高危,及路由调用小时桶漏记、官方余额对账告警失效、自定义余额提取失败误显 $0、计费流中断泄漏等 30 余项中低危问题全量修复;账本损坏自动备份、写失败重试、配置补丁原子性、原型链与凭据处理加固。逐项清单见 [CHANGELOG.md](CHANGELOG.md)。
|
|
429
|
-
|
|
430
|
-
## 数据存储
|
|
431
|
-
|
|
432
|
-
- 账本:`$DSH_HOME/storages/cost-meter/ledger.json`(原子写入 + 2 秒防抖;按 `historyDays` 保留,每日最多 200 个会话明细);
|
|
433
|
-
- **API Key 不落盘**:所有密钥(OpenCode Go Key、各 Coding Plan Key、火山 AK/SK)只存入 DSH 凭据库,账本文件与设置页回传均不含明文;设置页输入框为 write-only,保存后不可回显;
|
|
434
|
-
- 所有设置修改**即时自动保存**(600ms 防抖),无需手动保存;
|
|
435
|
-
- 删除账本文件即可清零,或使用设置页「清除全部历史」;
|
|
436
|
-
- 隐私边界:余额/额度类端点(官方余额与各 Coding Plan)**仅在用户显式启用对应 Provider 时**才会出站请求,未启用不产生任何网络流量。
|
|
437
|
-
|
|
438
|
-
## 架构
|
|
439
|
-
|
|
440
|
-

|
|
441
|
-
|
|
442
|
-
```
|
|
443
|
-
dsh-cost-meter
|
|
444
|
-
├── cordis.patch.yml # bundle 补丁:向 web profile 插入 cost-meter 行
|
|
445
|
-
├── install.ps1 # 一键安装/更新脚本(irm … | iex)
|
|
446
|
-
├── .github/workflows/ # CI:install-smoke 一键安装冒烟验证
|
|
447
|
-
├── package.json # dsh.bundle 补丁声明 + dsh.client 浏览器声明
|
|
448
|
-
└── lib/
|
|
449
|
-
├── index.js # 宿主插件:llm/stream 计费包裹、costUsage 会话投影、
|
|
450
|
-
│ # costMeter 服务(手写 typertRemote 绑定)、余额查询
|
|
451
|
-
├── backfill.js # 历史账本按模型回填:回放会话日志重建旧账本缺失的
|
|
452
|
-
│ # byProviderModel(拼接 zstd frame 扫描 + 逐帧解压)
|
|
453
|
-
├── pricing.js # 官方价格表、官方页面 HTML 解析、峰谷计费数学
|
|
454
|
-
├── store.js # 账本持久化与配置管理($DSH_HOME/storages/cost-meter)
|
|
455
|
-
├── typert.host.js # ./typert 导出:Typert 清单(typert-loader 自动注册)
|
|
456
|
-
└── client.js # ./client 导出:浏览器单文件 bundle(徽章/图框/设置页)
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
数据通道:
|
|
460
|
-
|
|
461
|
-
- **本会话费用**:宿主注册 `costUsage` 会话投影(纯 token 桶 + 按模型拆分),浏览器经 `useProjection('costUsage')` 读取并按当前价格表计价;
|
|
462
|
-
- **全局账本 / 预算 / 余额 / 配置**:`costMeter/getState | updateConfig | fetchPrices | refreshBalance | resetHistory`,经 Typert 网关 RPC(`remote.costMeter.*`);
|
|
463
|
-
- **余额**:调用官方 `GET {baseURL}/user/balance`,复用模型请求的同一把 API Key(凭证服务/环境变量),进程内缓存按 `refreshMinutes` 过期。
|
|
464
|
-
|
|
465
|
-
插件不导入 cordis/dsh 的 Service/Context 运行时类(仅 Node 内建模块、zod、dsh-home-paths、dsh-credentials 的纯函数),与宿主共享同一运行时实例,无重复依赖风险。
|
|
466
|
-
|
|
467
|
-
## 官方价格同步原理
|
|
468
|
-
|
|
469
|
-
**人民币对账:**美元价格乘以显示汇率与官方人民币价可能不同。「设置 → 费用 → 价格」提供说明和 CNY 选择按钮;选择后等待自动保存,再同步价格。详见[币种选择、同步与结算延迟](docs/billing-currency.md#中文)。
|
|
470
|
-
|
|
471
|
-
`fetchPrices` 抓取官方定价页(Docusaurus 服务端预渲染;英文页为美元价、中文页为人民币价,由「官方价格币种」设置决定,币种按页面金额符号自动检测,高峰时段中文页按北京时间 −8h 折算为 UTC),解析:
|
|
472
|
-
|
|
473
|
-
1. 基础价格表(转置布局:首行 MODEL + 模型 id,价格行标签后紧跟价格);
|
|
474
|
-
2. 峰谷价格表(每模型两行:OFF-PEAK / PEAK);
|
|
475
|
-
3. 生效时间(take effect at …)与峰时段窗口(Peak hours are …)。
|
|
476
|
-
|
|
477
|
-
解析结果写入价格表并持久化;页面结构变化时同步报错并保留原价格,可手动编辑兜底。
|
|
478
|
-
|
|
479
|
-
## AI 价格同步
|
|
480
|
-
|
|
481
|
-
[docs/AI-PRICE-SYNC-PROMPT.md](docs/AI-PRICE-SYNC-PROMPT.md)(中文)与 [docs/AI-PRICE-SYNC-PROMPT.en.md](docs/AI-PRICE-SYNC-PROMPT.en.md)(English) 提供可直接复制给任意 AI 的提示词:
|
|
482
|
-
AI 自主读取官方定价 → 输出多模型、分时(基础/谷时/峰时 + 生效时间)价格 JSON → 人工核对后应用(设置页 / RPC / 文件三选一)。适合官方价格变动时自主同步。
|
|
483
|
-
|
|
484
|
-
## 开发与验证
|
|
485
|
-
|
|
486
|
-
```sh
|
|
487
|
-
corepack pnpm install # 依赖
|
|
488
|
-
node --check lib/index.js && node --check lib/pricing.js \
|
|
489
|
-
&& node --check lib/store.js && node --check lib/typert.host.js \
|
|
490
|
-
&& node --check lib/client.js # 语法检查
|
|
491
|
-
node test/verify.mjs # 纯模块验证(解析/计费/账本/配置)
|
|
492
|
-
node test/mock-balance.mjs # (可选)本地余额接口模拟:3101
|
|
493
|
-
dsh --profile web --dump-config # 组合树校验
|
|
494
|
-
dsh --profile web --port 3099 # 真机启动(观察启动日志与 UI)
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
## 已知限制
|
|
498
|
-
|
|
499
|
-
- 历史按模型回填依赖宿主会话日志仍在盘:日志已被清理的早期调用无法逐模型重建,只能以「未分模型」残差行计入当日合计;
|
|
500
|
-
- 官方页面解析依赖当前页面结构;改版后「从官方文档同步价格」会报错,可手动编辑价格表兜底;
|
|
501
|
-
- 会话徽章在账本数据不可用时的回退估算按「当前时刻」的价格档位给该会话全部调用定价(含 Plan 类会话):跨峰谷时段的会话在峰时会高估其谷时部分,精确费用以账本为准(账本按每次调用的发起时刻逐笔计价);
|
|
502
|
-
- 价格同步会覆盖官方页面列出的同名模型价格,自定义模型条目不受影响;
|
|
503
|
-
- 余额查询需要可访问 api.deepseek.com 的网络与有效 API Key;**API Key 只会发往官方域名**(baseURL 指向非官方域名时余额查询拒绝请求,模型请求不受影响);
|
|
504
|
-
- OpenCode Go 额度接口为 opencode.ai 官方端点(社区文档);接口结构变化时设置页会显示错误,可在显示设置中关闭该显示;
|
|
505
|
-
- Token Plan 统计的「每 1% 额度/满窗」为估算值:各家额度接口只返回百分比且读数存在个位级量化(显示 1% 的真实值可能在 0.5%~1.5%),插件以连续可信段的首尾差分推算以压低量化误差(跨度不足 5 个百分点时标注「读数精度受限」,样本超 7 天回退当前用量折算,窗口边界按小时对齐);服务端百分比统计的是该账号全部用量——同一 Key 在其它机器/CLI 的消耗不在本地账本,估算偏低属预期,仅供跨套餐横向比较;
|
|
506
|
-
- Plan/API 双轨分类基于渠道与配置推断,混合订阅/按量使用同一厂商 Key 的场景(如 Kimi 订阅 + PAYG 混用)可在设置中按 provider:model 手动覆盖。
|
|
507
|
-
- 安装/更新插件后需重启 `dsh web` 生效。
|
|
508
|
-
|
|
509
|
-
## 更新历史
|
|
510
|
-
|
|
511
|
-
各版本更新总览与社区 issue 处理记录见 [docs/UPDATE-HISTORY.md](docs/UPDATE-HISTORY.md);逐条开发记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
512
|
-
|
|
513
|
-
## License
|
|
514
|
-
|
|
515
|
-
[MIT](LICENSE) © 2026 dsh-cost-meter contributors
|
|
1
|
+
# dsh-cost-meter
|
|
2
|
+
|
|
3
|
+
[English](README.md) | **简体中文**
|
|
4
|
+
|
|
5
|
+
<div align="center">
|
|
6
|
+
|
|
7
|
+
**DeepSeek Harness 会话费用统计插件(界面中英双语)**
|
|
8
|
+
|
|
9
|
+
本会话费用 · 当日费用 · OpenCode Go 订阅额度显示 · 预算与已用百分比 · 官方账户余额 · 自定义 Provider 余额查询(可配任意 HTTP 端点) · 余额三段进度条 · 历史记录 · 峰谷计价时段显示(UTC 01:00–04:00、06:00–10:00 为峰时段;周末与中国法定假日全天按谷价,分别标注) · 峰/谷切换前弹窗与系统通知提醒(位置/提前量/提醒类型可配) · 官方价格一键同步 · 类 Codex Token 用量热图 · 多厂商多模型价格计费(内置 90+ 模型价格目录与自动匹配) · 主流 Coding Plan 额度查询与显示(Anthropic / Z.ai / MiniMax / Kimi / OpenRouter / SiliconFlow / CommandCode / SCNet / 火山方舟 / 千问 / 小米 MiMo 十一家,含 Volcano Ark AK/SK 签名与 MiMo 控制台 Cookie 查询) · Plan/API 双轨计费(订阅额度与按量金额分离统计,每 1% 额度与满窗的 token/等值金额估算及日/周/月曲线) · 输入框上方额度横条(预算/Go/Coding Plan 用量一条横排显示,可开关)
|
|
10
|
+
|
|
11
|
+
[](https://github.com/Han-1413141/dsh-cost-meter)
|
|
12
|
+
|
|
13
|
+
**v1.8.3**:修复打开计费统计或单会话明细时出现的「Remote package already registered」错误(#210)。入口为输入框下方的 **本会话费用明细**,或 **设置 → 费用 → 计费统计**。已补充 DSH 0.1.7-rc.2 与 0.2.0-rc.2 真实客户端注册流程的回归测试。详见[统计说明](docs/billing-statistics.md#简体中文)及[更新说明](docs/release-notes/v1.8.3.md)。
|
|
14
|
+
|
|
15
|
+
桌面端用户请按 [Desktop 安装说明](docs/install-troubleshooting.md#desktop-安装与更新),使用应用自带的 CLI 和 `desktop` Profile。
|
|
16
|
+
|
|
17
|
+
[](https://www.npmjs.com/package/dsh-cost-meter)
|
|
18
|
+
[](LICENSE)
|
|
19
|
+
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
20
|
+
[](https://awesome-dsh-plugin.com)
|
|
21
|
+
[](https://whaleharness.com/audit-report.md)
|
|
22
|
+
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## 功能总览
|
|
30
|
+
|
|
31
|
+
| 功能 | 位置 | 说明 |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| 计费统计与明细 | 会话输入框下方 / 标题栏 / 设置 → 费用 → 计费统计 | 输入、输出、缓存、推理费用;按轮次、模型、搜索和压缩统计;日、周、月及全部记录。[说明](docs/billing-statistics.md#简体中文) |
|
|
34
|
+
| 按模型花费卡片 | 侧栏 / 右下角 dock(可配) | 默认关闭;就地展开 Top-N、其它汇总、占比和可选 Token;支持今日 / 近 90 天、展开记忆及 Top-1 角标,见[使用说明](docs/model-cost-card.md) |
|
|
35
|
+
| 本会话费用 | 输入区下方 / 会话标题栏 | 实时累计费用 + 输入/缓存/输出 token;输入区下方在“输入”前显示缓存命中率(缓存读取 / 含缓存写入的全部输入),位置可配 |
|
|
36
|
+
| 官方余额 | 侧边栏顶部 / 设置页(可配) | 总余额 / 赠送 / 充值,自动刷新 + 手动刷新;可选三段进度条(蓝/橙/灰),当日段只统计官方渠道费用(不含 Coding Plan / 自定义 Provider) |
|
|
37
|
+
| 自定义 Provider 余额 | 侧边栏 / 设置页(可配) | 可配置 HTTP 查询任意 Provider 余额(LiteLLM 等);中/英名称、币种、extract 规则(点路径 / 数字常量 / add / subtract / divide,divide 适配 NewApi 等 quota 端点,见下方[示例](#自定义-provider-余额配置示例newapi-模板));与 Coding Plan 同区可折叠配置 |
|
|
38
|
+
| OpenCode Go 额度 | 侧边栏 / 设置页 / 右下角(dock,可配) | 滚动 5 小时 / 本周 / 本月用量百分比与重置时间,三档可分别开关,可同时显示预算已用%;Key 自动发现(专用引用 / 官方 Go 路由 apiKeyEnv / 环境变量 / opencode 登录态)或手动填写 |
|
|
39
|
+
| Coding Plan 额度 | 侧边栏 / 设置页(每家可配) | 多厂商 coding plan 订阅额度查询(Anthropic Claude Pro/Max、Z.ai/智谱 GLM、MiniMax Token Plan、Kimi Code 本周/5 小时配额(无订阅 Key 时回落 PAYG 余额)、OpenRouter credits、SiliconFlow 余额、CommandCode 5h/周窗口与月度 Credits 余额、小米 MiMo Token Plan 套餐/补偿积分窗口与周期截止重置、余额(控制台 Cookie 凭据)、火山方舟 Volcano Ark 5h/周/月三档(需 AK/SK 管控面 HMAC 签名,需 ArkReadOnlyAccess + BillingCenterReadOnlyAccess)),各家独立启用开关、凭据、显示位置与刷新间隔(侧边栏卡片与 Go 额度同款,收起窄栏显示百分比),默认使用官方端点,MiniMax 可[配置可信查询域名](docs/minimax-quota-endpoint.md);无凭据/无订阅为中性提示;SCNet 超算互联网 Token Plan 支持[外部控制台额度快照](docs/scnet-official-snapshot.md),无有效快照时按官方 Credits 抵扣表由本地账本估算月度用量(无需凭据) |
|
|
40
|
+
| 额度横条 | 输入框上方(显示设置可开关) | 一条横排 chips 实时显示预算已用% / Go 主窗口 / 各已启用 Coding Plan 用量窗口(短标签+迷你进度条,≥80% 预警、≥100% 超支,悬停见重置时刻);点击任意 chip 即刷新对应数据源(budget→状态、Go→Go 额度、厂商→该家全部窗口),同一厂商多窗口融合为一条 chip 分段显示;首次更新弹引导卡由用户自主决定开关;无可用数据自动隐藏 |
|
|
41
|
+
| 点击立即刷新 | 侧边栏余额/额度图框 | 官方余额 / 自定义余额 / Coding Plan 图框(含窄栏收起态)点击即触发一次查询,刷新中呼吸闪烁,失败保持原值并在悬停提示说明;键盘 Enter/Space 可触发;更新后首次进入有引导提示 |
|
|
42
|
+
| 简化侧栏显示 | 设置 → 费用 → 显示 | 可选开启;更新首次提示选择,压缩卡片和明细,面板高度限制为视口的 38% 且不超过 320 像素;保留金额、额度、点击刷新与悬停详情,关闭后恢复原布局。[使用说明](docs/sidebar-simple.md) |
|
|
43
|
+
| 当日费用 | 侧边栏底部(设置按钮上方) | 「今日 ¥x」,悬停见调用次数与 token 明细 |
|
|
44
|
+
| 预算图框 | 侧边栏底部(余额行与设置按钮之间) | 圆角方形图框:预算、已用%、进度条、今日费用与占预算%、已用/额度,≥80% 预警、≥100% 超支 |
|
|
45
|
+
| 汇总卡片 | 设置页 | 今日 / 本月 / 累计费用与调用次数 |
|
|
46
|
+
| 外部用量 | 设置 → 费用 | 同账户其他进程通过[只读快照](docs/external-usage.md#中文)提供用量;按来源查看 token、调用、费用和近期每日记录,并显示 DSH + 外部的日/月/累计合计。有效快照的今日费用参与官方余额对账。 |
|
|
47
|
+
| Token 用量统计 | 设置页(费用设置) | 历史累计 token 总量(输入/缓存/输出/调用)+ 类 Codex 的 26 周每日用量方格热图,横向铺满设置页宽度,悬停见当日明细 |
|
|
48
|
+
| Token Plan 用量统计 | 设置页(用量) | 各已启用 Coding Plan(含 Go)当前窗口的「每 1% 额度」与「满窗 100%」对应的 token 数与等值金额估算(采样差分/当前用量折算),附每日/每周/每月用量曲线;Plan 类调用金额只记等值,不动真金白银(issue #64) |
|
|
49
|
+
| 今日会话明细 | 设置页 | 每个会话的调用次数、输入/缓存/输出 token 与费用 |
|
|
50
|
+
| 历史记录 | 设置页 | 按天汇总,保留天数可配(默认 180 天) |
|
|
51
|
+
| 历史按模型统计回填 | 设置页(按模型统计) | 按模型统计上线前的旧账本自动回放宿主会话日志重建逐模型 token/费用拆分(旧调用按当时基础价),日志已清理的部分归入「早期未分模型」残差行 |
|
|
52
|
+
| 导入安装前历史 | 首次启动自动 | 安装/升级后首次启动自动回放宿主全部会话日志,把未装插件时期的对话导入账本(缺失日期整日重建,已有日期只补未知会话,幂等不与实时计费重复;金额按事件时刻历史价回推);设置页保留手动重跑入口 |
|
|
53
|
+
| 预算设置 | 设置页顶部 | 额度、周期(今日/本月/累计/自定义日期区间)、已用% |
|
|
54
|
+
| 价格表 | 设置页 | 每模型 谷时/峰时 两档价格(支持 input/output 简写,缓存价自动补齐),增删改自由 |
|
|
55
|
+
| 峰谷计价时段显示 | 设置页 / 预算 / 今日费用 | 显示 UTC 峰时段 01:00–04:00、06:00–10:00 与当前档位;周末和已配置的中国法定假日(北京日期)全天按谷价计费并分别标注;展开态显示时段条与倒计时,收起态显示竖向条,可单独开关 |
|
|
56
|
+
| 峰/谷切换弹窗提醒 | 全局浮层 | 距进入峰/谷时段不足设定提前量(默认 2 分钟,1-30 可配)时全屏色条徽标弹窗(提醒色区分进入峰/谷);弹窗位置可选**右下角 / 屏幕中心**,提醒类型可选(进入峰 / 进入谷 / 峰和谷),同一切换点只提醒一次;可选**同步发送浏览器(系统)通知**(页面最小化也能收到,需授权通知权限);设置页峰谷计价面板内配置,并可**一键预览弹窗效果**(真实组件渲染,文案/位置/通知与实际触发完全一致) |
|
|
57
|
+
| 官方价格同步 | 设置页 | 抓取解析官方定价页,一键应用;可选**官方价格币种**(美元·英文官方页 / 人民币·中文官方页),人民币价按展示汇率折算入账、展示人民币时与官方账单一致 |
|
|
58
|
+
| 界面语言 | 设置页 → 显示设置 | 简体中文 / English / 跟随浏览器(自动);切换即时生效并自动保存 |
|
|
59
|
+
| 隐藏官方余额 / 隐藏今日消耗 | 设置页 → 显示设置 | 两个独立开关:开启后对应 UI 区块(侧边栏余额行与面板 / 今日费用行、预算明细、概览今日卡片等)**整体不再渲染**,token 与调用次数统计不受影响,共享屏幕/截图防泄露 |
|
|
60
|
+
| AI 价格同步 | [提示词](docs/AI-PRICE-SYNC-PROMPT.md) | DeepSeek 官方同步;其他 provider 使用已核对的官方价格目录与手动配置 |
|
|
61
|
+
| 模型与 Plan 适配说明 | [适配文档](docs/model-and-plan-adaptation.md) | 各厂商模型计费与各 Coding Plan 的适配矩阵、自动匹配机制与价格来源([English](docs/model-and-plan-adaptation.en.md)) |
|
|
62
|
+
| 峰/谷切换提醒图解 | [提醒文档](docs/peak-alert.md) | 峰谷切换前弹窗与系统通知的完整图解:效果截图(中/英)、设置项说明与使用建议([English](docs/peak-alert.en.md)) |
|
|
63
|
+
| Token Plan 用量统计图解 | [面板文档](docs/token-plan-stats.md) | 每 1% 与满窗估算的四列含义、首尾差分估算方法与精度标注、口径边界(只统计 dsh 内调用)与用量曲线说明([English](docs/token-plan-stats.md#english)) |
|
|
64
|
+
| OpenRouter 透传定价 | [定价说明](docs/openrouter-pricing.md) | OpenRouter 原样透传上游价格:内置快照、旧账本自动回填、公开目录(无需认证)定时刷新合并,失败保留本地快照([English](docs/openrouter-pricing.md#english)) |
|
|
65
|
+
| 多 provider 计费 | 设置页 / 账本 | 支持 OpenAI、Anthropic、Google Gemini、Mistral 等 provider 的 input/output、缓存与 reasoning token 价格,按 provider+model 隔离计费 |
|
|
66
|
+
| 模型名自动匹配 | 设置页 / 账本 | 未知模型 id 自动匹配价格表:忽略大小写/空格/横杠/点号与括号附注,归一化等价或请求名包含表内模型名即命中(如 `gpt5.6 luna(go)`);路由 provider(opencode/zen 等)下跨厂商全库查找;可关闭为仅精确;未命中模型可手动指定计费条目 |
|
|
67
|
+
| 拓展价格表 | 设置页 → 拓展价格表 | 内置各厂商、按模型家族分类的参考价格目录(点开展开,厂商默认折叠);一键挂载参与计费,挂载的第三方模型默认收入表内可编辑;逐模型「在费用设置直接显示」开关自选哪些模型(含 DeepSeek)在「价格表」区直接显示 |
|
|
68
|
+
|
|
69
|
+
## 自定义 Provider 余额配置示例(NewApi 模板)
|
|
70
|
+
|
|
71
|
+
**POST 携带 JSON 请求体:**进入**设置 → 费用 → 额度**,展开自定义余额,选择 **POST**,在**请求体 (JSON)** 中填写接口要求的内容。例如接口需要账号参数,并返回 `{"data":{"balance":12.5}}`:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{"account_id":"example-account","include_credit":true}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
把**解析规则 (JSON)** 设为 `{"remaining":"data.balance"}`。有效 JSON 按原文独立保存并发送,保留嵌套值和大整数 ID;格式错误会显示提示,保留上一次有效配置。清空编辑框后不再发送请求体;切换 GET/HEAD 不发送请求体,切回 POST 时保留原内容。未配置 Content-Type 时自动使用 `application/json`,手动请求头不区分大小写。
|
|
78
|
+
|
|
79
|
+
兼容已有 `request.body` 对象和原始字符串。请求体属于普通持久化配置,`{{VAR}}` 凭据替换只用于请求头;使用请求头认证时,可填写 `{"Authorization":"Bearer {{MY_API_KEY}}"}`,并通过下方凭据输入框设置密钥。
|
|
80
|
+
|
|
81
|
+
**按显示币种折算:**进入**设置 → 费用 → 额度**,展开一条自定义余额配置,开启**按显示币种折算(USD 余额)**。每条配置默认关闭;“余额原币种”仍应填写端点实际返回的币种。例如原余额为 USD 54.3792,显示币种为 CNY、汇率为 7.2、精度为两位小数时,显示 **¥391.53**。侧栏、设置页与悬停明细中的已用金额、接口上限和手动上限一起折算;进度比例和原始余额不变。手动上限按原币种输入。对应持久化字段为该 `customBalances[]` 条目的 `convertToDisplayCurrency: true`,也兼容旧 `customBalance` 配置。
|
|
82
|
+
|
|
83
|
+
全局汇率表示**美元到显示币种**的换算。原币种为 CNY/EUR 或积分时保留原单位,开关不可用;阿里云余额以接口返回币种为准。切换开关不查询汇率、不额外请求余额,关闭后立即恢复原币种。
|
|
84
|
+
|
|
85
|
+
千问 / 阿里云资金账户余额可直接点击「添加千问 / 阿里云余额」,使用 RAM AccessKey 签名查询,显示接口返回的可用金与币种;配置步骤、所需权限及口径见[千问余额说明](docs/qianwen-balance.md)。
|
|
86
|
+
|
|
87
|
+
千问 Token Plan 可在卡片内选择[官方 CLI 订阅额度](docs/qwen-cli-quota.md),需在 DSH 主机以同一系统账号安装 CLI 并运行 `qianwen auth login`。默认保留本地估算;CLI 模式显示账号当前 Credits,不修改本地账本。
|
|
88
|
+
|
|
89
|
+
千问 Token Plan 的本地 Credits 仅统计 `qwen`、`qwen-tokenplan`、`qianwen-tokenplan`、`qwen-token-plan`、`qianwen-token-plan` 订阅 provider(大小写不敏感,可带 `llm-` 前缀);显式归类为 API 的调用不计。`qianwen` 按量 provider 即使使用相同模型名也不会计入订阅额度。自定义渠道名需使用上述订阅名称之一,模型不在抵扣表中时需补充三项费率。
|
|
90
|
+
|
|
91
|
+
小米 MiMo Token Plan 的额度查询使用**控制台 Cookie**(而非 API Key):登录 `platform.xiaomimimo.com` 后按 F12 →「网络」→ 找到 `balanceAlertConfig` 请求,把请求头 `cookie` 整段粘贴进「设置 → 费用 → 额度」的 MiMo 卡片(需含 `serviceToken` 与 `userId`,DSH 凭据库以 `MIMO_COOKIE` 托管)。卡片显示套餐/补偿积分窗口与周期截止重置(北京时间)及余额行。控制台 Cookie 过期后,按卡片提示重新复制。此控制台查询不接受 Token Plan 推理专用 Key(`tp-*` / `ttp-*`)。本地套餐统计按自然月汇总;补偿积分和余额只展示查询结果,不用无法区分归属的本地调用估算。
|
|
92
|
+
|
|
93
|
+
CLIProxyAPI 网关来源卡片可勾选「只显示 Gemini 额度」,仅影响该来源的 Antigravity 分组。默认显示全部分组;过滤后无可见额度时显示空列表,解析错误仍单独报告。
|
|
94
|
+
|
|
95
|
+
自定义 Provider 余额的 `extract` 规则支持四种形式:数字常量、点路径字符串、`add`/`subtract` 多路径加减、`divide` 按 `by` 除数缩放。**`divide` 适用于 NewApi 等以 quota 整数计量的端点**(1 USD = 500000 quota,与 cc-switch 同款换算)。
|
|
96
|
+
|
|
97
|
+
- **`unit: "CREDITS"`**:非货币计数端点可选 `CREDITS`,按小数精度设置显示并标明 Credits。美元花费不转换为积分,也不显示由它推算的今日积分消耗;进度条仅使用接口返回的积分上限,全局货币预算不适用。
|
|
98
|
+
- **本机回环端点支持明文 HTTP**:端点主机为 `127.0.0.1` / `localhost` / `[::1]` 时允许 `http://`(流量不出网卡),用于只监听回环、不提供 TLS 的本地只读路由(如 `dsh-workbuddy-connect` 的 `/plugins/dsh-workbuddy-connect/status`)。**非回环主机仍强制 https**,明文请求一律拒绝。
|
|
99
|
+
|
|
100
|
+
### WorkBuddy 积分示例(本机插件路由)
|
|
101
|
+
|
|
102
|
+
已安装 `dsh-workbuddy-connect` 时,其 Web 状态路由直接返回聚合积分,无需复制任何凭据:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"enabled": true,
|
|
107
|
+
"display": "sidebar",
|
|
108
|
+
"refreshMinutes": 15,
|
|
109
|
+
"label": "WorkBuddy 积分",
|
|
110
|
+
"labelEn": "WorkBuddy Credits",
|
|
111
|
+
"unit": "CREDITS",
|
|
112
|
+
"request": { "url": "http://127.0.0.1:3080/plugins/dsh-workbuddy-connect/status", "method": "GET", "headers": {} },
|
|
113
|
+
"extract": { "remaining": "credits.total" }
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
端口和响应字段按实际本机服务调整。该示例要求对应插件已提供此路由;本插件拒绝跟随重定向,现有凭据主机白名单继续生效。
|
|
118
|
+
|
|
119
|
+
以 NewApi 的 `GET /api/usage/token` 为例(响应 `{ "code": 200, "data": { "total_granted": ..., "total_used": ..., "total_available": ..., "unlimited_quota": false } }`):
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"enabled": true,
|
|
124
|
+
"display": "both",
|
|
125
|
+
"refreshMinutes": 15,
|
|
126
|
+
"label": "NewApi",
|
|
127
|
+
"labelEn": "NewApi",
|
|
128
|
+
"unit": "USD",
|
|
129
|
+
"request": {
|
|
130
|
+
"url": "https://你的NewApi域名/api/usage/token",
|
|
131
|
+
"method": "GET",
|
|
132
|
+
"headers": { "Authorization": "Bearer {{NEWAPI_API_KEY}}" }
|
|
133
|
+
},
|
|
134
|
+
"extract": {
|
|
135
|
+
"remaining": { "op": "divide", "path": "data.total_available", "by": 500000 },
|
|
136
|
+
"maxBudget": { "op": "divide", "path": "data.total_granted", "by": 500000 },
|
|
137
|
+
"spend": { "op": "divide", "path": "data.total_used", "by": 500000 },
|
|
138
|
+
"unit": "USD"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- `{{NEWAPI_API_KEY}}` 从 DSH 凭据库或环境变量解析(**仅请求头支持占位符**,URL 需写死完整地址);
|
|
144
|
+
- 无限额度 token(`unlimited_quota: true`)没有 `total_available`,无法提取 `remaining`,查询会报「remaining is missing or not numeric」——请改用有限额度 token,或在中间层端点换算;
|
|
145
|
+
- 配置入口:设置 → 费用(额度标签)→「自定义 Provider 余额」展开配置;或直接改 `storages/cost-meter/ledger.json` 的 `config.customBalance`。
|
|
146
|
+
|
|
147
|
+
### 凭据与安全
|
|
148
|
+
|
|
149
|
+
- **变量名命名规则**:`{{VAR_NAME}}` 的参考格式为 `<ROUTE>_API_KEY`——`<ROUTE>` 对应 DSH 模型配置页(设置 → 模型)里的 Provider ID,把 ID 大写、非字母数字字符替换为下划线,例如 `openai`→`{{OPENAI_API_KEY}}`、`anthropic`→`{{ANTHROPIC_API_KEY}}`、`abc23-d`→`{{ABC23_D_API_KEY}}`。与模型页共用同一变量名,自定义余额查询与模型调用即**共用同一把密钥**(都从 DSH 凭据库解析)。该说明也展示在设置页「请求头 (JSON)」输入框上方。
|
|
150
|
+
- **凭据输入框**:展开条目配置后,「凭据输入」区会为请求头里出现的每个 `{{VAR}}` 占位符显示一行 write-only 输入框,密钥直接存入 DSH 凭据库(不落盘、不回显、不经 `ledger.json`),无需再手改环境变量或凭据文件。
|
|
151
|
+
- **明文密钥自动迁移**:旧版本把 `Bearer sk-…` 明文写在请求头里时会明文落盘;插件在启动时自动把这类明文导入 DSH 凭据库,并把头值替换为 `{{CUSTOM_BALANCE_KEY_…}}` 占位符(名称由条目 host + 头名派生,跨重启稳定),功能不受影响。此后 `ledger.json` 与下发给浏览器的配置**永不包含明文密钥**——疑似密钥头(Authorization / X-Api-Key / Bearer / sk- 前缀 / 长不透明串)一律置空,占位符与普通头照常保留。
|
|
152
|
+
- **凭据白名单 `allowedHosts`**:请求头携带密钥(占位符或明文)时,出站主机必须命中该白名单,否则直接拒绝——用于防止「导入他人配置」导致密钥外带。未配置白名单时放行并在日志警告一次。设置页条目面板内有「凭据白名单主机」输入框(逗号分隔)。
|
|
153
|
+
- **混合凭据模板**:同一头值同时含静态密钥与动态占位符时,不能自动整体迁移为嵌套凭据。插件提示待处理并阻止该值落盘、下发;请将静态部分另存为凭据,改用纯引用组合。正常的 `Bearer {{VAR}}` 或 `{{USER}}:{{PASS}}` 保留。
|
|
154
|
+
|
|
155
|
+
## CLIProxyAPI 网关额度与 WorkBuddy 积分 (Issue #87)
|
|
156
|
+
|
|
157
|
+
支持对接本地或局域网部署的 [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) 代理网关,集中观测代理的多个 Provider 账号额度与 WorkBuddy 插件积分:
|
|
158
|
+
|
|
159
|
+
- **多 Provider 账号原生适配**:自动通过 CPA Management API 发现账号,接入 Antigravity、Claude、Codex、Kimi、xAI (Grok) 官方原生配额/用量接口。统一归一化为 5h / 7d / weekly / monthly 等用量百分比窗口与 ISO 重置时刻。
|
|
160
|
+
- **WorkBuddy 插件积分**:只读接入 WorkBuddy 插件 `/v0/management/plugins/workbuddy/credits` 路由,展示账户总积分、已用/剩余与套餐周期,保留独立账号卡片。
|
|
161
|
+
- **零计费副作用保证**:严禁并杜绝任何产生计费消耗的操作——不调用 Codex 的 reset-credit consume 端点,不向 xAI 发送消耗 token 的 chat probe,不调用 WorkBuddy 的任何变更性 POST 路由。
|
|
162
|
+
- **严格凭据隔离与安全门禁**:
|
|
163
|
+
- Management Key 通过只写 (write-only) 形式托管于 DSH 凭据库 (`CLIPROXYAPI_MANAGEMENT_KEY_<SOURCE_ID>_<HASH>`),永不存入配置文件、账本或浏览器 state。
|
|
164
|
+
- 请求路径严格限制为三条固定管理路径 (`/v0/management/auth-files`、`/v0/management/api-call`、`/v0/management/plugins/workbuddy/credits`),禁止任意 URL 拼接。
|
|
165
|
+
- 严格出站白名单 (`allowedHosts`):非 loopback 来源必须精确命中白名单,非 loopback HTTP 必须显式开启 `allowInsecureHttp`。
|
|
166
|
+
- 强制禁止 HTTP 重定向 (`redirect: 'manual'`, 3xx 状态码坚决拒绝),防止网关重定向劫持或凭据外带。
|
|
167
|
+
- 账号隐私与元数据过滤:auth-files 响应仅提取必需字段,剔除 raw tokens / cookies / ID claims,展示层邮箱自动脱敏掩码 (`s***@domain`)。
|
|
168
|
+
|
|
169
|
+
## 双语界面
|
|
170
|
+
|
|
171
|
+
插件界面(会话徽章、侧边栏余额与预算图框、设置页全部文案)支持**简体中文**与**English**:
|
|
172
|
+
|
|
173
|
+
- 语言可选 **简体中文** / **English** / **跟随浏览器(自动)**;
|
|
174
|
+
- 默认「跟随浏览器」:自动探测浏览器语言(`zh*` → 中文,其余 → 英文),并把探测结果写回配置,服务端消息(余额查询、价格同步等)与界面语言保持一致;
|
|
175
|
+
- 在 **设置 → 费用 → 显示设置 → 界面语言** 中切换,切换后整个插件界面即时生效并自动保存;设置页左侧的分节标签也随之切换(费用 / Cost);
|
|
176
|
+
- 服务端返回的提示(余额刷新、官方价格同步、配置校验错误等)同样按当前语言输出。
|
|
177
|
+
|
|
178
|
+
## 图文演示
|
|
179
|
+
|
|
180
|
+
> 截图均取自真实 DeepSeek Harness 实例,默认以中文界面展示;插件界面本身中英双语,可在设置中切换为 English。
|
|
181
|
+
|
|
182
|
+
### 主页面
|
|
183
|
+
|
|
184
|
+
**侧边栏底部**(自上而下:官方余额 → 额度 / 预算图框 → 设置按钮):
|
|
185
|
+
|
|
186
|
+

|
|
187
|
+
|
|
188
|
+
- 余额行显示官方开放平台总余额,悬停可见赠送/充值拆分;开启「余额进度条」后以三段图框展示(蓝=余额,橙=当日,灰=已用);
|
|
189
|
+
- 自定义 Provider 余额(如 LiteLLM)可配置 HTTP 查询,侧边栏与设置页同图框样式;
|
|
190
|
+
- 未启用预算时,该位置显示「今日 ¥x」徽章。
|
|
191
|
+
|
|
192
|
+
**余额进度条与自定义 Provider 配置**:
|
|
193
|
+
|
|
194
|
+
| 侧边栏进度条 + 显示设置 | 自定义 Provider 余额面板 |
|
|
195
|
+
|---|---|
|
|
196
|
+
|  |  |
|
|
197
|
+
|
|
198
|
+
- 显示设置 →「余额进度条」全局开关;可选「额度上限」覆盖 API 的 `max_budget`;
|
|
199
|
+
- 设置 → 费用 →「自定义 Provider 余额」:展开后编辑 URL / Headers(JSON) / extract(JSON)、中/英名称与币种。
|
|
200
|
+
|
|
201
|
+
**额度 / 预算图框三态**(OpenCode Go 额度与预算各自独立开关,同款圆角图框;两者同时开启时自动**合并为一张卡片**,Go 在上、预算在下,细分隔线、各自保留预警色;「图框详细信息」开关可收起次要行,只保留 标签 + 已用% + 进度条):
|
|
202
|
+
|
|
203
|
+
| 仅 OpenCode Go 额度 | 仅预算 | 两者合并 |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
|  |  |  |
|
|
206
|
+
|
|
207
|
+
- 预算图框显示「预算 · 已用% · 进度条 · 今日费用与占预算% · 已用/额度」,≥80% 预警、≥100% 超支;窄栏(rail)模式收窄为百分比方块;
|
|
208
|
+
- 峰谷计价时段显示 UTC 峰时段 01:00–04:00、06:00–10:00 与当前档位;预算框与今日费用区域显示单行紧凑时段条——细轨道左橙右蓝、标记线指向当前时段,右侧文字为当前时段与距下次切换的倒计时(30 秒刷新),不显示价格;可在设置中单独关闭,并在「峰谷时段条样式」中切换简洁/经典两种样式;rail 窄栏显示同构的竖向时段条,下方横排短词「峰时 / 平价」,倒计时与完整文案悬停可见;
|
|
209
|
+
|
|
210
|
+
**峰时/平价时段条与收起态竖向进度条**:
|
|
211
|
+
|
|
212
|
+
| 设置页峰谷面板(提示开关/样式切换/预览) | 设置页右下角(dock)显示与图框详细信息 |
|
|
213
|
+
|---|---|
|
|
214
|
+
|  |  |
|
|
215
|
+
|
|
216
|
+
时段条与收起态竖向条真实 DSH 侧边栏实拍(现行样式),按 UI 类型分组(图示为峰时):
|
|
217
|
+
|
|
218
|
+
**不收起(展开态)**——预算框 / 今日费用区域显示单行时段条:
|
|
219
|
+
|
|
220
|
+
| 简洁 | 经典 |
|
|
221
|
+
|---|---|
|
|
222
|
+
|  |  |
|
|
223
|
+
|
|
224
|
+
- 简洁:细轨道左橙右蓝、标记线指向当前时段,右侧短文案「峰时 · N小时后进入平价」;
|
|
225
|
+
- 经典:同款轨道与标记线,右侧完整文案「峰时 · 距平价 HH:MM:SS」倒计时(30 秒刷新),不显示价格。
|
|
226
|
+
|
|
227
|
+
**收起(rail 窄栏)**——侧边栏底部堆叠竖向时段条,与百分比方块居中对齐:
|
|
228
|
+
|
|
229
|
+
| 简洁 | 经典 |
|
|
230
|
+
|---|---|
|
|
231
|
+
|  |  |
|
|
232
|
+
|
|
233
|
+
- 简洁:竖向条下方仅横排短词「峰时 / 平价」;
|
|
234
|
+
- 经典:竖向条下方竖排完整文案,含距下次切换的倒计时;两种样式下完整文案均悬停可见。
|
|
235
|
+
|
|
236
|
+
- 提示遵循 `peakNotice` / `peakEnabled` / `peakEffectiveAt` / `peakWindows` 门控,按 UTC 峰时窗口显示;
|
|
237
|
+
- 设置 → 费用 → 峰谷计价 下可单独开关「峰时高价时段显著提示」,关闭后展开态时段条与收起态竖向条同时隐藏;
|
|
238
|
+
- 上方第一张为设置页峰谷面板截图(提示开关、样式切换与实时预览);时段条与收起态竖向条的实拍效果见上述分组配图;右下角(dock)各项开关与图框详细信息开关见第二张截图。
|
|
239
|
+
|
|
240
|
+
- Go 图框按主档位(默认滚动 5 小时,可在显示设置切换周/月)显示已用% 与进度条,下方一行展示其余两档与重置时间:
|
|
241
|
+
|
|
242
|
+

|
|
243
|
+
|
|
244
|
+
**右下角(dock)额度 / 预算 chips**(显示设置中开启,四项独立开关:5h / 周 / 月额度 + 预算已用%):
|
|
245
|
+
|
|
246
|
+
| 右下角实际显示 | 显示设置(开关位置) |
|
|
247
|
+
|---|---|
|
|
248
|
+
|  |  |
|
|
249
|
+
|
|
250
|
+
**本会话费用**(两个位置,可在设置中切换):
|
|
251
|
+
|
|
252
|
+
| 输入区下方 | 会话标题栏 |
|
|
253
|
+
|---|---|
|
|
254
|
+
|  |  |
|
|
255
|
+
|
|
256
|
+
> 上图:本会话 ¥5.5939 · 输入 321K · 缓存 119M · 输出 235K;右图:标题栏徽章「费用 ¥6.1606」(真实会话截图)
|
|
257
|
+
|
|
258
|
+

|
|
259
|
+
|
|
260
|
+
### 设置 → 费用
|
|
261
|
+
|
|
262
|
+
**概览**(OpenCode Go 额度 → 预算 → 余额 → 汇总卡片 → 今日会话 → 历史记录 → 显示设置 → 价格表 → 数据与同步):
|
|
263
|
+
|
|
264
|
+

|
|
265
|
+
|
|
266
|
+
**OpenCode Go 额度面板**(设置页最顶部:三档进度条,主档位高亮,手动刷新;未订阅时为中性提示,可一键关闭):
|
|
267
|
+
|
|
268
|
+

|
|
269
|
+
|
|
270
|
+
**预算面板**(含自定义日期区间):
|
|
271
|
+
|
|
272
|
+

|
|
273
|
+
|
|
274
|
+
**余额面板**(总余额/赠送/充值 + 手动刷新):
|
|
275
|
+
|
|
276
|
+

|
|
277
|
+
|
|
278
|
+
**显示设置**(Go 主档位与 Key、右下角 chips、图框详细信息等):
|
|
279
|
+
|
|
280
|
+

|
|
281
|
+
|
|
282
|
+
**汇总卡片**:
|
|
283
|
+
|
|
284
|
+

|
|
285
|
+
|
|
286
|
+
**Token 用量统计**(历史累计总量 + 类 Codex 的 26 周方格热图,横向铺满设置页宽度;无用量日为半透明玻璃格):
|
|
287
|
+
|
|
288
|
+

|
|
289
|
+
|
|
290
|
+
**今日会话 / 历史记录**(输入、缓存、输出 token 分列):
|
|
291
|
+
|
|
292
|
+
 
|
|
293
|
+
|
|
294
|
+
**价格表**(谷时/峰时两档,支持 input/output 简写,美元 / 1M tokens):
|
|
295
|
+
|
|
296
|
+

|
|
297
|
+
|
|
298
|
+
**数据与同步**(配置即时自动保存 + 官方价格同步 + 清除历史):
|
|
299
|
+
|
|
300
|
+

|
|
301
|
+
|
|
302
|
+
## 安装
|
|
303
|
+
|
|
304
|
+
> 需求:Node.js ≥ 20 + DeepSeek Harness(带 `dsh plugin` 命令的版本,`npm install -g @deepseek-ai/dsh`)+ **DSH 进程的 PATH 中可找到 pnpm**;通过 npm 包名或插件市场安装也需要 pnpm。下方固定的 pnpm 11 需要 Node.js ≥ 22.13;Node.js 20 可使用 pnpm 10。
|
|
305
|
+
|
|
306
|
+
### 一键安装(推荐)
|
|
307
|
+
|
|
308
|
+
**macOS / Linux 首次安装准备:**在启动 DSH 的终端安装 pnpm(Windows 也可执行相同命令):
|
|
309
|
+
|
|
310
|
+
```sh
|
|
311
|
+
npm install -g pnpm@11.21.0
|
|
312
|
+
pnpm --version
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Node.js 20 请改用 `npm install -g pnpm@10`。版本要求见 [pnpm 官方安装说明](https://pnpm.io/installation)。
|
|
316
|
+
|
|
317
|
+
**npm 包名安装**(已发布到 npm registry,始终跟随最新版本;无需 git):
|
|
318
|
+
|
|
319
|
+
```sh
|
|
320
|
+
dsh plugin --profile web add dsh-cost-meter
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**PowerShell 一键脚本**(复制整行粘贴回车;自动补齐 pnpm、自动探测 git,无需克隆仓库;安装链**固定到发布 tag `v1.8.3`**,建议先下载审阅再运行):
|
|
324
|
+
|
|
325
|
+
```powershell
|
|
326
|
+
irm https://raw.githubusercontent.com/Han-1413141/dsh-cost-meter/v1.8.3/install.ps1 | iex
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**或直接命令行**(机器上需已有 pnpm 与 git;同样固定到 tag):
|
|
330
|
+
|
|
331
|
+
```sh
|
|
332
|
+
dsh plugin --profile web add github:Han-1413141/dsh-cost-meter#v1.8.3
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
没有 git 时可用 GitHub tag 打包直链:
|
|
336
|
+
|
|
337
|
+
```sh
|
|
338
|
+
dsh plugin --profile web add https://github.com/Han-1413141/dsh-cost-meter/archive/refs/tags/v1.8.3.tar.gz
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
安装后**重启** `dsh web`(插件行、Typert 清单与客户端 bundle 均在启动时扫描):
|
|
342
|
+
|
|
343
|
+
```sh
|
|
344
|
+
dsh web
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### 安装排障:pnpm was not found(macOS / Linux)
|
|
348
|
+
|
|
349
|
+
报错 `dsh: pnpm was not found; install pnpm and make it available on PATH.` 表示 DSH 无法启动包管理器,此时尚未加载插件。使用 npm 包名安装同样依赖 pnpm。
|
|
350
|
+
|
|
351
|
+
完成上方准备后,在启动 DSH 的**同一终端、同一系统用户**下检查:
|
|
352
|
+
|
|
353
|
+
```sh
|
|
354
|
+
command -v node
|
|
355
|
+
command -v pnpm
|
|
356
|
+
command -v dsh
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
如果 npm 已安装 pnpm,但终端仍找不到命令,将 npm 全局可执行文件目录加入当前终端的 PATH,然后重试:
|
|
360
|
+
|
|
361
|
+
```sh
|
|
362
|
+
export PATH="$(npm prefix -g)/bin:$PATH"
|
|
363
|
+
pnpm --version
|
|
364
|
+
dsh plugin --profile web add dsh-cost-meter@latest
|
|
365
|
+
dsh web
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
重启前先停止原 DSH 进程。插件市场运行于 DSH 内,继承的是该进程的 PATH;只刷新浏览器不会更新 PATH。使用 nvm/fnm 时,先选择 DSH 使用的 Node.js 版本,再安装 pnpm。若 npm 报 `EACCES`,按 pnpm 文档使用当前用户可写的 Node.js 安装目录或全局安装前缀,再检查 PATH。需要长期生效时,将可执行文件目录写入相应 shell 配置。重启 DSH 后出现插件,才表示在该机器上安装成功。
|
|
369
|
+
|
|
370
|
+
### 安装排障:ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION
|
|
371
|
+
|
|
372
|
+
症状:`dsh plugin --profile web add` 阶段安装失败,pnpm 报 `[ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION] N lockfile entries failed verification`。
|
|
373
|
+
|
|
374
|
+
原因:你的环境(pnpm 配置或上层安装器自带策略)启用了「最小发布年龄」供应链保护——lockfile 中**发布时间距今小于阈值**的包一律拒绝。插件引入依赖精确锁版之前的历史版本,生产依赖是浮动区间,首次安装会解析到当时最新发布版(实测 `^0.1.0-rc.6` 漂到仅发布一周左右的 rc.8),在该策略下即被拒绝。
|
|
375
|
+
|
|
376
|
+
处理:
|
|
377
|
+
|
|
378
|
+
1. **升级插件并使用宿主插件安装器**:独立运行依赖 `zod` 保持精确锁版;`@deepseek-ai/dsh-credentials`、`@deepseek-ai/dsh-home-paths` 改由宿主通过 peer dependency 提供,避免另装旧版宿主包触发依赖预检(issue #106)。精确锁版能防止版本漂移,但不能保证满足任意年龄阈值;
|
|
379
|
+
2. 若仍出现年龄限制,可等待该版本达到阈值,或在核实报错中的具体包与版本后,由你决定是否在 profile 的 `pnpm-workspace.yaml`(默认 `$DSH_HOME/profiles/web/pnpm-workspace.yaml`)加入单项排除:
|
|
380
|
+
|
|
381
|
+
```yaml
|
|
382
|
+
minimumReleaseAgeExclude:
|
|
383
|
+
- '<报错中的包名>@<版本>'
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
DSH `0.2.0-rc.1` 已通过安装包安装、Web 启动、模块复用、合成计费、RPC 和完整回归。此前宿主适配验证覆盖 DSH `0.1.2-rc.1`、`0.1.3-alpha.2`、`0.1.5-alpha.1` 的安装、启动、模块复用和卸载;`0.1.3-alpha.1` 在此前核查中无可获取的官方 npm 版本,暂标记为未知。验证环境及边界见[兼容记录](docs/host-compatibility.md)。
|
|
387
|
+
|
|
388
|
+
如果插件市场仅显示 `diagnostics: .../.plugin-manager/logs/operation-.../pnpm.log`,这行信息无法指出失败的包或命令。请打开所指的 `pnpm.log`,反馈其中第一条实际错误;分享前删去凭据及私人路径。DSH `0.2.0-rc.1` 的 Git 地址和 npm 包名安装已在隔离 Windows 环境通过;特定机器上的失败仍需要该机器的诊断日志。
|
|
389
|
+
|
|
390
|
+
账号模式下余额返回 HTTP 401:请在「设置 → 费用 → 官方账户余额」保存独立的开放平台 API Key。凭据优先级和存储说明见[余额专用凭据](docs/balance-credentials.md)。
|
|
391
|
+
|
|
392
|
+
### 更新 / 卸载
|
|
393
|
+
|
|
394
|
+
```sh
|
|
395
|
+
# 更新:发布新版后用新版 install.ps1 重跑(脚本内固定版本随之更新)
|
|
396
|
+
dsh plugin --profile web remove dsh-cost-meter # 卸载
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
安装报错或重装后仍被禁用,见[排障说明](docs/install-troubleshooting.md)。
|
|
400
|
+
|
|
401
|
+
### 开发者本地调试
|
|
402
|
+
|
|
403
|
+
```sh
|
|
404
|
+
git clone https://github.com/Han-1413141/dsh-cost-meter.git
|
|
405
|
+
cd <克隆目录的父目录>
|
|
406
|
+
dsh plugin --profile web add link:./dsh-cost-meter # 符号链接,改 lib/client.js 后刷新页面即生效
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## 计费规则
|
|
410
|
+
|
|
411
|
+

|
|
412
|
+
|
|
413
|
+
- 价格单位与官方文档一致:**美元 / 1M tokens**;
|
|
414
|
+
- 成本 = 未命中输入 × cache-miss + 输出 × output + (缓存读 + 缓存写) × cache-hit(缓存写沿用官方历史规则按命中价计费);
|
|
415
|
+
- **纯峰谷两档计价**(2026-08 起官方方案):峰时段(01:00–04:00、06:00–10:00 UTC)按峰时价,其余按谷时价(谷时价 = 峰时价的一半);基础档与谷时档同价,未启用峰谷时按谷时价计;设置页实时显示当前档位(峰时段/谷时段);预算与今日费用区域显示峰时/平价时段条(当前/下一时段与倒计时),收起态显示竖向峰谷进度条;
|
|
416
|
+
- **周末与法定假日全天谷价**:自 2026-08-23 北京时间 00:00 起,周六、周日全天谷价,调休上班的周末也不例外。中国法定假日同样全天谷价。`peakHolidays` 为 `YYYY-MM-DD` 北京日期数组,默认预置 2026 年峰谷规则生效后的中秋和国庆日期;以后可在 设置 → 费用 → 峰谷计价 中修改。时段条单独标注假日并倒计时至下一次实际价格变化。历史 DeepSeek 金额升级时从完整会话日志一次性重算;日志不完整的记录保留原金额;
|
|
417
|
+
- **历史计费正确性**:2026-08-16 16:00 UTC(峰谷时代分界)之前的调用按当时的基础价计费,之后的调用按峰谷两档;
|
|
418
|
+
- 账本金额恒以**美元**存储,币种/汇率仅影响显示(默认 1 USD = 7.2 CNY,可改);
|
|
419
|
+
- 会话徽章与当日/月度/累计、预算一样,按每次调用的**实际时刻精确计费**(宿主导出的逐次成本);
|
|
420
|
+
- 计费来源为通过宿主 `llm/stream` 上报的 usage 块,包含隔离 LLM 服务中的子代理、压缩、标题等辅助调用。子会话按自己的 `sessionId` 记录,不并入父会话徽章;无 `sessionId` 的后台调用只计入日/月/累计总额。记忆等插件若直接请求外部 API、未向宿主上报 usage,本插件无法统计该部分消耗;
|
|
421
|
+
- **峰谷档位按请求发起时刻判定**:流式调用可能跨峰谷边界整点,以完成时刻归档会把数分钟前发起的请求算进另一个峰位;
|
|
422
|
+
- **峰谷生效时刻锚定**:官方价格页已不再标注生效时间,价格同步不再把峰谷生效时刻重置为「同步时刻」——历史重算(会话投影回放 / 按模型回填)一律按 2026-08-16 16:00 UTC 分界判档,峰时历史事件不再被按谷价半价重算;此前被污染的存量账本升级时自动钳制修复(幂等迁移);
|
|
423
|
+
- **币种切换即全量换基准**:「价格币种」切换并同步后,历史账目按新价目在后台整体重算(会话日志覆盖完整的日子整体替换,日志已清理的会话保持原口径),历史与官方账单同基准,完成后有提示;升级到本版时,此前切换过币种而新旧口径并存的存量账本自动重算一次;
|
|
424
|
+
- **官方账单对齐口径**:① 与官方实时数字存在**分钟级时差**属预期——账本 2 秒防抖落盘,关停瞬间仍在途的流会被服务端照常扣费而 usage 块无人接收(缺口集中在缓存命中列);② reasoning tokens 由 API 单独上报且**不计费**,token 列为五桶合计,与官方「三列」天然对不齐,**对账请以金额为准**;③ 「价格币种」设为人民币时按官方 CNY 价目直计入账,与人民币账单币种一致(CNY 计价账号推荐);设为 USD 时显示金额经固定汇率折算,与 CNY 直计存在结构性细差(两套价目比值非均匀);
|
|
425
|
+
- 预算与超支提示**仅提醒,不阻止调用**。
|
|
426
|
+
- **Plan/API 双轨计费**(issue #64):订阅制渠道(MiniMax / Codex 手动标记等)的调用金额只记「等值」,预算/今日费用/概览卡片等金额展示仅统计按量计费(API)部分;
|
|
427
|
+
- **「含 Plan 总额」开关**:概览页汇总卡片下的快捷开关切换全部金额展示口径——关闭时仅计真金白银(API 渠道),开启后显示含 Plan 等值的总金额;网关路由(provider 缺失)调用的第三方目录模型自动归入对应订阅归类,无模型明细的历史残差计入 API 口径;设置 → 用量 的 Token Plan 统计面板提供每 1% 额度与满窗的 token/等值金额估算与日/周/月曲线;分类可在配置中按厂商或 provider:model 级覆盖。
|
|
428
|
+
- **全仓安全审计修复**:账本退出丢写(close/flush 次序)、发版脚本命令注入、面板空指针崩溃(Go 月窗空值)3 项高危,及路由调用小时桶漏记、官方余额对账告警失效、自定义余额提取失败误显 $0、计费流中断泄漏等 30 余项中低危问题全量修复;账本损坏自动备份、写失败重试、配置补丁原子性、原型链与凭据处理加固。逐项清单见 [CHANGELOG.md](CHANGELOG.md)。
|
|
429
|
+
|
|
430
|
+
## 数据存储
|
|
431
|
+
|
|
432
|
+
- 账本:`$DSH_HOME/storages/cost-meter/ledger.json`(原子写入 + 2 秒防抖;按 `historyDays` 保留,每日最多 200 个会话明细);
|
|
433
|
+
- **API Key 不落盘**:所有密钥(OpenCode Go Key、各 Coding Plan Key、火山 AK/SK)只存入 DSH 凭据库,账本文件与设置页回传均不含明文;设置页输入框为 write-only,保存后不可回显;
|
|
434
|
+
- 所有设置修改**即时自动保存**(600ms 防抖),无需手动保存;
|
|
435
|
+
- 删除账本文件即可清零,或使用设置页「清除全部历史」;
|
|
436
|
+
- 隐私边界:余额/额度类端点(官方余额与各 Coding Plan)**仅在用户显式启用对应 Provider 时**才会出站请求,未启用不产生任何网络流量。
|
|
437
|
+
|
|
438
|
+
## 架构
|
|
439
|
+
|
|
440
|
+

|
|
441
|
+
|
|
442
|
+
```
|
|
443
|
+
dsh-cost-meter
|
|
444
|
+
├── cordis.patch.yml # bundle 补丁:向 web profile 插入 cost-meter 行
|
|
445
|
+
├── install.ps1 # 一键安装/更新脚本(irm … | iex)
|
|
446
|
+
├── .github/workflows/ # CI:install-smoke 一键安装冒烟验证
|
|
447
|
+
├── package.json # dsh.bundle 补丁声明 + dsh.client 浏览器声明
|
|
448
|
+
└── lib/
|
|
449
|
+
├── index.js # 宿主插件:llm/stream 计费包裹、costUsage 会话投影、
|
|
450
|
+
│ # costMeter 服务(手写 typertRemote 绑定)、余额查询
|
|
451
|
+
├── backfill.js # 历史账本按模型回填:回放会话日志重建旧账本缺失的
|
|
452
|
+
│ # byProviderModel(拼接 zstd frame 扫描 + 逐帧解压)
|
|
453
|
+
├── pricing.js # 官方价格表、官方页面 HTML 解析、峰谷计费数学
|
|
454
|
+
├── store.js # 账本持久化与配置管理($DSH_HOME/storages/cost-meter)
|
|
455
|
+
├── typert.host.js # ./typert 导出:Typert 清单(typert-loader 自动注册)
|
|
456
|
+
└── client.js # ./client 导出:浏览器单文件 bundle(徽章/图框/设置页)
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
数据通道:
|
|
460
|
+
|
|
461
|
+
- **本会话费用**:宿主注册 `costUsage` 会话投影(纯 token 桶 + 按模型拆分),浏览器经 `useProjection('costUsage')` 读取并按当前价格表计价;
|
|
462
|
+
- **全局账本 / 预算 / 余额 / 配置**:`costMeter/getState | updateConfig | fetchPrices | refreshBalance | resetHistory`,经 Typert 网关 RPC(`remote.costMeter.*`);
|
|
463
|
+
- **余额**:调用官方 `GET {baseURL}/user/balance`,复用模型请求的同一把 API Key(凭证服务/环境变量),进程内缓存按 `refreshMinutes` 过期。
|
|
464
|
+
|
|
465
|
+
插件不导入 cordis/dsh 的 Service/Context 运行时类(仅 Node 内建模块、zod、dsh-home-paths、dsh-credentials 的纯函数),与宿主共享同一运行时实例,无重复依赖风险。
|
|
466
|
+
|
|
467
|
+
## 官方价格同步原理
|
|
468
|
+
|
|
469
|
+
**人民币对账:**美元价格乘以显示汇率与官方人民币价可能不同。「设置 → 费用 → 价格」提供说明和 CNY 选择按钮;选择后等待自动保存,再同步价格。详见[币种选择、同步与结算延迟](docs/billing-currency.md#中文)。
|
|
470
|
+
|
|
471
|
+
`fetchPrices` 抓取官方定价页(Docusaurus 服务端预渲染;英文页为美元价、中文页为人民币价,由「官方价格币种」设置决定,币种按页面金额符号自动检测,高峰时段中文页按北京时间 −8h 折算为 UTC),解析:
|
|
472
|
+
|
|
473
|
+
1. 基础价格表(转置布局:首行 MODEL + 模型 id,价格行标签后紧跟价格);
|
|
474
|
+
2. 峰谷价格表(每模型两行:OFF-PEAK / PEAK);
|
|
475
|
+
3. 生效时间(take effect at …)与峰时段窗口(Peak hours are …)。
|
|
476
|
+
|
|
477
|
+
解析结果写入价格表并持久化;页面结构变化时同步报错并保留原价格,可手动编辑兜底。
|
|
478
|
+
|
|
479
|
+
## AI 价格同步
|
|
480
|
+
|
|
481
|
+
[docs/AI-PRICE-SYNC-PROMPT.md](docs/AI-PRICE-SYNC-PROMPT.md)(中文)与 [docs/AI-PRICE-SYNC-PROMPT.en.md](docs/AI-PRICE-SYNC-PROMPT.en.md)(English) 提供可直接复制给任意 AI 的提示词:
|
|
482
|
+
AI 自主读取官方定价 → 输出多模型、分时(基础/谷时/峰时 + 生效时间)价格 JSON → 人工核对后应用(设置页 / RPC / 文件三选一)。适合官方价格变动时自主同步。
|
|
483
|
+
|
|
484
|
+
## 开发与验证
|
|
485
|
+
|
|
486
|
+
```sh
|
|
487
|
+
corepack pnpm install # 依赖
|
|
488
|
+
node --check lib/index.js && node --check lib/pricing.js \
|
|
489
|
+
&& node --check lib/store.js && node --check lib/typert.host.js \
|
|
490
|
+
&& node --check lib/client.js # 语法检查
|
|
491
|
+
node test/verify.mjs # 纯模块验证(解析/计费/账本/配置)
|
|
492
|
+
node test/mock-balance.mjs # (可选)本地余额接口模拟:3101
|
|
493
|
+
dsh --profile web --dump-config # 组合树校验
|
|
494
|
+
dsh --profile web --port 3099 # 真机启动(观察启动日志与 UI)
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## 已知限制
|
|
498
|
+
|
|
499
|
+
- 历史按模型回填依赖宿主会话日志仍在盘:日志已被清理的早期调用无法逐模型重建,只能以「未分模型」残差行计入当日合计;
|
|
500
|
+
- 官方页面解析依赖当前页面结构;改版后「从官方文档同步价格」会报错,可手动编辑价格表兜底;
|
|
501
|
+
- 会话徽章在账本数据不可用时的回退估算按「当前时刻」的价格档位给该会话全部调用定价(含 Plan 类会话):跨峰谷时段的会话在峰时会高估其谷时部分,精确费用以账本为准(账本按每次调用的发起时刻逐笔计价);
|
|
502
|
+
- 价格同步会覆盖官方页面列出的同名模型价格,自定义模型条目不受影响;
|
|
503
|
+
- 余额查询需要可访问 api.deepseek.com 的网络与有效 API Key;**API Key 只会发往官方域名**(baseURL 指向非官方域名时余额查询拒绝请求,模型请求不受影响);
|
|
504
|
+
- OpenCode Go 额度接口为 opencode.ai 官方端点(社区文档);接口结构变化时设置页会显示错误,可在显示设置中关闭该显示;
|
|
505
|
+
- Token Plan 统计的「每 1% 额度/满窗」为估算值:各家额度接口只返回百分比且读数存在个位级量化(显示 1% 的真实值可能在 0.5%~1.5%),插件以连续可信段的首尾差分推算以压低量化误差(跨度不足 5 个百分点时标注「读数精度受限」,样本超 7 天回退当前用量折算,窗口边界按小时对齐);服务端百分比统计的是该账号全部用量——同一 Key 在其它机器/CLI 的消耗不在本地账本,估算偏低属预期,仅供跨套餐横向比较;
|
|
506
|
+
- Plan/API 双轨分类基于渠道与配置推断,混合订阅/按量使用同一厂商 Key 的场景(如 Kimi 订阅 + PAYG 混用)可在设置中按 provider:model 手动覆盖。
|
|
507
|
+
- 安装/更新插件后需重启 `dsh web` 生效。
|
|
508
|
+
|
|
509
|
+
## 更新历史
|
|
510
|
+
|
|
511
|
+
各版本更新总览与社区 issue 处理记录见 [docs/UPDATE-HISTORY.md](docs/UPDATE-HISTORY.md);逐条开发记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
512
|
+
|
|
513
|
+
## License
|
|
514
|
+
|
|
515
|
+
[MIT](LICENSE) © 2026 dsh-cost-meter contributors
|