Repository navigation
Releases: feiyang-dev/dsh-usage-plugin
Releases · feiyang-dev/dsh-usage-plugin
Release list
v1.18.0
v1.18.0 (2026-09-24)
修复 / Fixed
- 价格表改动不再改写历史费用(
lib/index.js、lib/records.js):此前costFor()在计算任何记录时都读当前价格表,所以在价格表页保存一次新价、或直接改pricing.json后重启,全部历史费用都会被按新价重算——而过去那些调用的真实账单早已按当时的价结清。现在每条记录在落盘时冻结当时生效的三个单价(新增记录字段unit:{ hit, miss, out },DigitalOcean 另带fx),auto档计费一律优先读该快照;同时新增字段pricingTime(计费时刻),历史回填 / 导入的记录也能借此冻结取价时点。旧记录缺这两个字段时行为不变(退回按当前价格表计算),概览页与价格页会提示这类记录的条数。 - 新增显式重算入口:价格表页新增「用当前价格表重算全部历史」按钮;API 新增
repriceAll动作(setPrices也可传reprice: true)。这是唯一会改写历史费用的入口,日常改价不再有副作用。 - 「缓存写入」不再用未命中数冒充(
lib/index.js):DeepSeek 系 provider 不上报cacheWriteTokens(官方计费里缓存写入按未命中价计、不单列),旧实现在记录层用inputTokens兜底,等于伪造一笔与未命中相等的缓存写入——四桶合计因此系统性多算一笔,插件「总 token」永远比宿主状态栏大一截。现在记录层只存上游真实上报值,「缓存写入」列显示—,展示层也不再用其它字段冒充。 - 「总 token」不再重复计入 reasoning(
lib/client.js):宿主outputTokens就是上游的completion_tokens,reasoningTokens是它的子集。概览页、会话消耗排行、消息底部 Token 弹窗此前都把reasoning再加一遍,现已统一为四桶互斥求和。 - 同毫秒记录不再互相覆盖(
lib/records.js):导入 / 初始化 / 旧数据迁移此前一律按time去重,同一毫秒的两条不同请求会吞掉一条。改为按记录身份去重:新记录用recordId,旧记录用「会话 + 时刻 + 模型 + 用途 + 四桶用量 + 结束原因」的复合指纹。 - 用量文件改为原子写 + 损坏保护(
lib/storage.js):此前直接覆盖写入,且解析失败会被静默 catch 成空数组(随后用空数组覆盖整份历史)。现在写入走「临时文件 → 刷盘 → 原子替换」,失败不触碰原文件;读取时只有「文件不存在」才返回空,解析失败则把原件改名保留为usage-records.json.corrupt-<时间戳>.json并继续启动,插件不会因此不可用。
新增 / New
- DeepSeek 搜索后端(
web_search)计次与下限估算(lib/index.js):web-search-deepseek在 Harness 内用原生fetch直连官方接口并绕过ctx.llm,上游只持久化请求、丢弃响应 usage,这部分真实计费此前在插件里完全不可见(搜索密集场景下实测差额可达 15 倍,见 issue #12)。现在通过ctx.on('session/event')接住web/deepseek-search-llm-request:精确记录调用次数,并按请求体给出输入侧下限估算,记录一律带origin: 'search-backend'与estimated: true;输出侧不猜。概览页新增「统计口径:web_search 搜索后端未纳入精确统计」说明块,列出次数与估算下限,并提示以官方账单为准。 - 统计口径声明:
README.md/README.zh.md新增「Metering scope / 统计口径声明」章节,逐项说明已精确统计与未纳入统计的来源、原因与处理方式。 - 导出 CSV 新增
origin、estimated两列;listAPI 新增legacyPricingCount(没有冻结单价的记录数)。
测试 / Tests
- 新增
test/records.test.js:归一化兼容性(旧记录不补假字段)、不再伪造缓存写入、身份去重、四桶求和排除 reasoning。 - 新增
test/storage.test.js:原子写替换、不留临时文件、写入失败不触碰原文件、损坏文件抛错而非返回空。 - 新增
test/price-freeze.test.js:冻结单价与当前价格表解耦、复现官方计费公式、旧记录回落、快照归一化往返。 test/client-i18n.test.js新增用例:统计口径与历史价格相关文案中英双语齐全。- 全部 64/64 通过。
兼容性 / Compatibility
- 数据文件不需要迁移:
usage-records.json的新字段(recordId/pricingTime/origin/estimated/unit)全部可选,旧记录按缺省处理,可原样读取。 - 数据目录解析顺序未变。
- 新增行为:损坏的数据文件会被改名保留(见上),插件继续可用。
文档 / Docs
- 补全贡献者名单(
package.jsoncontributors):新增 @zhiqiangme(PR #14)。 - README 新增「统计口径声明 / Metering scope」章节:逐项列出已精确统计与未纳入统计的来源、原因与处理方式。
- README 致谢补充:@zhiqiangme(PR #14 的三项口径定位)、@mumuer1024(新增 issue #12 的取证贡献)。
致谢 / Acknowledgements
- @zhiqiangme:提交大型 PR #14。其中「
cacheWriteTokens兜底导致四桶双计」「同毫秒记录按time去重会互相覆盖」「用量文件非原子写入且解析失败被静默清零」三项定位,成为本版计费口径修复的核心依据(本版为手工移植其修复,提交已附Co-authored-by署名)。 - @mumuer1024:报告 issue #12,用官方账单交叉验证定位了 DeepSeek 搜索后端调用未计入统计、费用被低估约 15 倍的问题,直接促成本版的搜索后端计次与统计口径声明。
v1.16.5
v1.16.5 (2026-08-29)
新增 / New
- 概览页 Hero 主指标卡:顶部新增「本月已消耗」渐变大数字卡 + 当前计费时段徽章;设置月度预算后同卡显示预算使用进度条(≥80% 黄色提醒,≥100% 红色超支告警并显示超支金额)。
- 核心指标卡片分层:原 7 张等大统计卡改为「3 大主卡(总消耗 / 调用次数 / 缓存命中率)+ 4 小辅助卡(输入·未命中 / 输出 / 高峰消耗 / 空闲消耗)」,关键指标视觉权重突出。
- 近 30 天消耗趋势图(canvas 堆叠柱状):概览页新增按日消耗趋势,高峰(橙)/ 空闲(蓝)堆叠着色,悬停显示当日高峰/空闲/总消耗与调用数。
- 模型消耗占比环形图:概览页新增各模型消耗占比环形图 + 图例(模型名 + 百分比)。
- 会话消耗排行 Top 10:概览页新增按会话(sessionId)聚合的消耗排行,显示调用次数与消耗、相对进度条,便于定位「最烧钱」的对话。
- 缓存命中列表关键字搜索:新增搜索框,按 模型 / 服务商 / 会话ID / 用途 实时过滤,与日期筛选叠加生效。
- 月度预算设置与超支预警(
lib/index.js+lib/client.js):价格表页新增「月度预算」区块(输入金额保存 / 清除),持久化到数据目录budget.json;概览页 Hero 显示当月已用/预算进度。新增setBudgetAPI,list附带budget字段(向后兼容)。 - 说明信息收进可折叠抽屉:原本首屏固定展示的「本地统计与官方后台的差异 / 高峰·空闲时段说明 / 计价说明」三段说明收进「▸ 帮助与说明」按钮(默认收起),有中断记录时按钮带数量角标;首屏直接展示数据。
- 底部工具条重组:导出 CSV / JSON / PNG / 打开目录 / 选择文件导入 / 帮助与说明 合并为一行,导出目标目录输入独立一行。
修复 / Fixed
- 概览页 Hero 高峰时段徽章颜色修正(高峰 = 橙色)。
说明 / Notes
- 所有新 UI 文案均已补充英文词典(
__T_EN),英文界面即时可用。 - 未引入新 npm 依赖;现有测试 30/30 全部通过。
v1.14.1
v1.14.1 (2026-08-29)
修复 / Fixed
- 中断调用兜底记录,使「调用次数」与 DeepSeek 官方后台对齐(
lib/index.js):harness 在流被中断(aborted / error / timeout / 用户停止生成)时不会产出usagechunk(usage 只在收到[DONE]哨兵后才由 adapter yield),导致这类调用此前完全不被插件记录——而官方后台仍会把该次请求计入「API 请求次数」并按实际 token 计费,于是插件统计的调用次数长期低于官方(如 8 月 27 日 985 vs 1033)。现在无 usage 但确为真实模型调用(通过isRealCall,排除内部dsh2shell-*/fake)的流,会在observe()的finally里补记一条 0-token 的「中断调用」(新增interrupted: true字段,finishReason如实标记aborted/error/timeout)。token 与费用均为 0,不会虚增消耗;调用次数与官方口径一致。 - 面板透明展示中断调用(
lib/client.js):- 概览「调用次数」卡片新增
· 中断 N(未计费)提示; - 缓存命中列表与用量日历当日明细中,中断调用行在模型名旁显示红色「中断」徽标、结束原因红色标注、消耗列显示
—; - PNG 导出报告同样在模型名旁标注「中断」、消耗列显示
—; - 结束原因新增
aborted → 已中断 / Interrupted、timeout → 超时 / Timeout映射(中英双语)。 - 用量面板顶部新增「本地统计与官方后台的差异」提示横幅:说明本面板统计的是插件本地捕获的调用(官方价格 + 峰谷时段),与官方后台(platform.deepseek.com 用量页)相比金额可能更低——① 中断/出错/超时的调用官方仍按实际 token 计费而插件按 0 记录;② 账号下其他 API Key(其它应用/脚本)的调用不经过 DeepSeek Harness,官方包含而插件不包含;③ 精确对账可导出官方月度账单 CSV 对比。检测到中断调用时额外显示「当前记录中有 N 次中断调用(未计费)」红字提示。
- 概览「调用次数」卡片新增
- 持久化与 API 透传
interrupted(lib/index.js):normalizeRecord/projectRecord均保留该字段,重启恢复、/usage/apilist 输出、JSON 导出一致。
测试 / Tests
- 新增
test/interrupt.test.js:验证中断兜底仅记录真实模型调用(DeepSeek 官方 / 第三方真实 provider),内部fake/dsh*占位调用永不兜底记录。 - 全部 30/30 通过。
v1.14.0
v1.14.0 (2026-08-27)
新增 / New
- 消息底部「本轮 token」弹窗(两层统计):多轮完成后,助手消息底部操作行(复制 / 点赞 / 点踩 / 回复 那一排)新增「本轮 token」按钮,点击弹出
Token 明细:- 对话累计:整场对话(当前会话)的 总 token / 总消耗 / 耗时 / 缓存命中率;
- 本轮明细:本次输出 / 本轮 token / 本轮消耗 / 本轮耗时 / 本轮缓存命中率 / 缓存命中长条图(命中部分单独绿色渲染 + 百分比)/ 按模型卡片(每模型:模型名 + 总成本,一行 输入·未命中 / 缓存命中 / 输出(+推理),有费用再一行 峰 / 谷);
- 时长统一按「X分Y秒」(英文
Xm Ys)显示;本轮窗口取该消息实际产出所在 step 的起止,本轮命中率与对话累计各自独立统计。
- 宿主记录带会话标识:
llm/stream捕获每条记录时新增sessionId(优先options.sessionId,缺失回退当前 agent 会话);新增tokenForMessageAPI——按「会话 + 时间窗」返回本轮明细与对话累计两层聚合。 - 内部/工具调用单独分组:
list同时返回toolCalls(model为 fake/unknown/空 或dsh*内部路由,如dsh2shell-*/fake),概览「消耗明细」下方新增可折叠的「工具调用(内部)」分组(默认收起,显示 服务商·模型 / 调用数 / 总消耗),与真实模型调用分开。 - 语言跟随系统设置:移除「用量与消耗」头部的中英文切换按钮,语言完全跟随宿主「通用设置 → 语言」,切换即时生效(
locale服务subscribe+locale/change);不再写localStorage(dsh-usage-lang),旧残留值不再覆盖系统语言;「会话 / 设置」标签页名改为按渲染时读取的 thunk,随语言切换实时更新。 - 移动端适配:表格在 ≤900px 贴合屏宽(
min-width:0 !important)、不再出现横向滑条;宽表折叠中间列;弹窗统计卡与按模型卡片随宽度自适应;弹窗滚动条外观隐藏(仍可滚轮滚动)。 - 英文适配补全:「高峰 / 空闲时段说明」整块与 19 个遗漏键(当前 · 工作日/周末时段、工作日高峰卡片提示、用量日历悬停提示、价格表两段长说明等)补上英译。
修复 / Fixes
- 弹窗不可见:对话树祖先的 transform 会破坏
position: fixed,改用react-dom平台种子的createPortal把弹窗挂到document.body。 - 整场会话聚合:按
messageId查找消息完成时间改为读取data.finalNode.messageId/data.closing.finalNode.messageId,时间窗正确生效(不再把整场对话圈进来)。 - 语言切换失效:不再持久化语言选择,宿主设置切回中文即时恢复、无需刷新。
- 表格显示:宽表
width:max-content,列按内容撑开、外层容器横向滚动,数字不再被压到换行/重叠。
测试 / Tests
- 周末计费规则回归测试(issue #9):宿主
isPeakAt(新增test/period.test.js)+ 客户端isPeakNow/periodNow(test/client-i18n.test.js),覆盖 issue 的 5 个时刻向量、生效时间边界、峰段窗口左右端点。 - i18n 测试改为覆盖「跟随宿主语言服务实时切换」「旧 localStorage 值不再覆盖宿主语言」。
- 全部 27/27 通过。
v1.13.0
v1.13.0 (2026-08-23)
新增 / New
- 英文界面(i18n 层)(社区贡献,@ayleen,PR #7):Web 面板全部 UI 文案接入轻量 i18n——以原中文文案为键、内置英译词典;按浏览器语言自动选择(中文浏览器保持中文,其余默认英文),「用量与消耗」头部新增切换按钮,即时生效并保存于 localStorage。余额查询改为语义化字段(host 不再返回中文展示文案),缺失凭据错误不再泄漏内部键;日期 / 星期本地化(中文
2026年8月22日,英文Aug 22, 2026与 Mo–Su 表头);瞬态提示与客户端校验错误渲染时翻译。 - 百炼(Qwen)Token Plan 配额查询(社区贡献,@wuhuqif176,PR #8):「剩余余额查询」新增「百炼 Token Plan」子页签——复用百炼 CLI(
bl)的控制台 OAuth token(~/.bailian/config.json),无需阿里云 AccessKey;展示本周配额已用百分比(进度条 +已用 xx.x%)与本周开始 / 结束日期(连续线段,今天节点随日期动态移动)。新增依赖undici。 - 本地改进:消耗明细表顶部与底部各渲染一份分页条(长列表翻页更顺手);DeepSeek 系 provider 未单独上报
cacheWriteTokens时,「缓存写入」列改用未命中 token 数(inputTokens)兜底显示,避免长期为空。
文档 / Docs
- 补全贡献者名单(
package.jsoncontributors):新增 @ayleen(PR #7 英文界面)与 @wuhuqif176(PR #8 百炼配额)。 - 新增
.mailmap:把 PR #7 提交作者Ruslan R. Musakalimov <gitlab@letsweb.me>映射到 GitHub 账号 @ayleen,使仓库 Contributors 图与 git blame 正确归属历史提交。
致谢 / Acknowledgements
- @ayleen:实现英文界面与响应式语言切换(PR #7)。
- @wuhuqif176:实现百炼 Token Plan 配额查询(PR #8)。
v1.12.2
v1.12.2 (2026-08-23)
修复 / Fixed
- 移动端宽表仍会逐字竖排(兜底加固)(
lib/client.js):v1.12.1 的修复依赖运行时向document.head注入全局样式表(.dsh-usage-table{min-width:720px}+@media (max-width:540px)折叠中间列)。在部分移动端运行环境(如经 mobile-remote 进出的手机页面)下该样式表因加载时序 / CSP 未生效,导致 9–11 列宽表每列被压到约 1 字符宽、标题与单元格逐字竖排、数据无法阅读。本版把min-width:720px直接写进表格的内联样式(内联样式必然生效),窄屏时表格保持 720px、外层overflow-x容器横向滑动,彻底不再依赖样式表注入;原有注入样式表与 ≤540px 折叠逻辑保留,作为进一步优化的增强项。
v1.11.1
v1.11.1 (2026-08-23)
- 修复:数据加载后页面空白:加载动画三目分支误用逗号表达式,只返回最后一个表达式值(
null),导致加载完成后各子视图全部不渲染;改为将四个子视图作为容器div的并列子元素,加载完成后正常显示。 - 计费说明改为面板级固定显示:「高峰 / 空闲时段说明」固定在用量面板子页签下方,概览、用量日历、缓存命中列表、价格表四个页面切换时始终可见(含数据加载期间)。
- 当前时段精确显示:用量面板顶部徽标与价格表页顶部新增「当前 · 工作日高峰时段 / 工作日空闲时段 / 周末空闲时段」动态状态并附说明文字;周末(自 2026-08-23 起)全天按空闲价计费,规则生效前仍按原规则区分。
v1.11.0
v1.11.0 (2026-08-23)
- 高峰 / 空闲时段说明:概览、用量日历、缓存命中列表、价格表四个页面顶部统一新增「高峰 / 空闲时段说明」,清楚区分工作日高峰(周一至周五 9:00–12:00、14:00–18:00)、工作日空闲(其余时间)与周末全天空闲(自 2026-08-23 起按空闲价,此前仍按原规则)。
- 加载动画:用量面板首次进入、数据仍在加载时显示转圈加载动画与提示文字,避免白屏无反馈;余额查询加载中同步使用加载动画。
- 表格适配:所有表格改为宽度自适应容器(
width:100%),单元格内容按需换行,不再因内容超宽出现横向滚动条;极窄窗口下容器保留横向滚动兜底。窗口缩放、不同分辨率下查看更舒适。
v1.10.0
v1.10.0 (2026-08-23)
- 新增 DeepSeek 官方模型
deepseek-v4-flash-vision-exp(DeepSeek-V4-Flash-Vision-Exp):官方价格表、概览「按模型」表、按 API 服务商 × 模型明细、用量日历、缓存命中列表与 PNG 报告均自动按该模型计价;「价格表」页新增该模型一行,modelKey识别优先匹配vision(避免被误归入deepseek-v4-flash)。 - 价格(元 / 百万 tokens,与官方最新公布一致):空闲时段 缓存命中 0.05 / 输入未命中 1.5 / 输出 4.5;高峰时段 缓存命中 0.10 / 输入未命中 3.0 / 输出 9.0(与
deepseek-v4-flash同价)。 - 核对确认:
deepseek-v4-flash/deepseek-v4-pro的峰谷价与官方最新公布完全一致,无价格变动;发送给该模型的图片按其尺寸换算成 token,与文本 token 一并计费。 - 周末统一按空闲(低谷)价计费(2026-08-23 00:00 起):新规则生效后,周末(周六、周日)全天不再区分峰谷时段,统一按空闲价计费;工作日仍按北京时间 9:00–12:00、14:00–18:00 高峰分段。新规则生效前的调用仍按原规则结算。插件的高峰时段判定、面板「当前时段」徽标、概览 / 日历 / 缓存列表的高峰与空闲分列统计、PNG 报告均按新规则自动判断。
v1.9.4
v1.9.4 (2026-08-20)
- 持久化不再落到工作目录(修复「数据又进了工作区」的反馈):之前插件的落盘走的是模型侧沙箱化的
fs服务,在workspace-write模式下会被限制只能写工作区;当系统/用户目录因沙箱不可写时,数据会兜底写进<工作区>/dsh-usage,于是切换工作区又出现「数据没了」的现象(即 issue #4 的本质)。 - 改动:持久化改为由插件宿主进程自身的
node:fs直接完成,完全绕过workspace-write沙箱约束。数据根解析优先级变为DSH_USAGE_DATA_DIR>%LOCALAPPDATA%\dsh-usage-plugin(或%APPDATA%)>~/dsh-usage-data,工作区降级为绝对最后的兜底,正常桌面环境下数据稳定落在 AppData / 用户主目录,与当前工作区无关,切换工作区不再丢失历史。导出、价格表、.keep等写操作同样改为宿主进程node:fs,不再依赖受沙箱子进程。 - 数据迁移:原有 4558 条历史记录位于
<工作区>/dsh-usage/usage-records.json,首次以新版本启动时会被自动去重合并进新的固定数据根(%LOCALAPPDATA%\dsh-usage-plugin\dsh-usage\usage-records.json),无需手动处理。