Skip to content

Releases: feiyang-dev/dsh-usage-plugin

v1.18.0

Choose a tag to compare

@feiyang-dev feiyang-dev released this 24 Sep 13:41

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 两列;list API 新增 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.json contributors):新增 @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

Choose a tag to compare

@feiyang-dev feiyang-dev released this 29 Aug 15:03

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 显示当月已用/预算进度。新增 setBudget API,list 附带 budget 字段(向后兼容)。
  • 说明信息收进可折叠抽屉:原本首屏固定展示的「本地统计与官方后台的差异 / 高峰·空闲时段说明 / 计价说明」三段说明收进「▸ 帮助与说明」按钮(默认收起),有中断记录时按钮带数量角标;首屏直接展示数据。
  • 底部工具条重组:导出 CSV / JSON / PNG / 打开目录 / 选择文件导入 / 帮助与说明 合并为一行,导出目标目录输入独立一行。

修复 / Fixed

  • 概览页 Hero 高峰时段徽章颜色修正(高峰 = 橙色)。

说明 / Notes

  • 所有新 UI 文案均已补充英文词典(__T_EN),英文界面即时可用。
  • 未引入新 npm 依赖;现有测试 30/30 全部通过。

v1.14.1

Choose a tag to compare

@feiyang-dev feiyang-dev released this 29 Aug 10:26

v1.14.1 (2026-08-29)

修复 / Fixed

  • 中断调用兜底记录,使「调用次数」与 DeepSeek 官方后台对齐(lib/index.js):harness 在流被中断(aborted / error / timeout / 用户停止生成)时不会产出 usage chunk(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/api list 输出、JSON 导出一致。

测试 / Tests

  • 新增 test/interrupt.test.js:验证中断兜底仅记录真实模型调用(DeepSeek 官方 / 第三方真实 provider),内部 fake/dsh* 占位调用永不兜底记录。
  • 全部 30/30 通过。

v1.14.0

Choose a tag to compare

@feiyang-dev feiyang-dev released this 27 Aug 14:48

v1.14.0 (2026-08-27)

新增 / New

  • 消息底部「本轮 token」弹窗(两层统计):多轮完成后,助手消息底部操作行(复制 / 点赞 / 点踩 / 回复 那一排)新增「本轮 token」按钮,点击弹出 Token 明细:
    • 对话累计:整场对话(当前会话)的 总 token / 总消耗 / 耗时 / 缓存命中率;
    • 本轮明细:本次输出 / 本轮 token / 本轮消耗 / 本轮耗时 / 本轮缓存命中率 / 缓存命中长条图(命中部分单独绿色渲染 + 百分比)/ 按模型卡片(每模型:模型名 + 总成本,一行 输入·未命中 / 缓存命中 / 输出(+推理),有费用再一行 峰 / 谷);
    • 时长统一按「X分Y秒」(英文 Xm Ys)显示;本轮窗口取该消息实际产出所在 step 的起止,本轮命中率与对话累计各自独立统计。
  • 宿主记录带会话标识:llm/stream 捕获每条记录时新增 sessionId(优先 options.sessionId,缺失回退当前 agent 会话);新增 tokenForMessage API——按「会话 + 时间窗」返回本轮明细与对话累计两层聚合。
  • 内部/工具调用单独分组: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

Choose a tag to compare

@feiyang-dev feiyang-dev released this 27 Aug 10:07

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.json contributors):新增 @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

Choose a tag to compare

@feiyang-dev feiyang-dev released this 23 Aug 11:39

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

Choose a tag to compare

@feiyang-dev feiyang-dev released this 23 Aug 03:05

v1.11.1 (2026-08-23)

  • 修复:数据加载后页面空白:加载动画三目分支误用逗号表达式,只返回最后一个表达式值(null),导致加载完成后各子视图全部不渲染;改为将四个子视图作为容器 div 的并列子元素,加载完成后正常显示。
  • 计费说明改为面板级固定显示:「高峰 / 空闲时段说明」固定在用量面板子页签下方,概览、用量日历、缓存命中列表、价格表四个页面切换时始终可见(含数据加载期间)。
  • 当前时段精确显示:用量面板顶部徽标与价格表页顶部新增「当前 · 工作日高峰时段 / 工作日空闲时段 / 周末空闲时段」动态状态并附说明文字;周末(自 2026-08-23 起)全天按空闲价计费,规则生效前仍按原规则区分。

v1.11.0

Choose a tag to compare

@feiyang-dev feiyang-dev released this 23 Aug 02:54

v1.11.0 (2026-08-23)

  • 高峰 / 空闲时段说明:概览、用量日历、缓存命中列表、价格表四个页面顶部统一新增「高峰 / 空闲时段说明」,清楚区分工作日高峰(周一至周五 9:00–12:00、14:00–18:00)、工作日空闲(其余时间)与周末全天空闲(自 2026-08-23 起按空闲价,此前仍按原规则)。
  • 加载动画:用量面板首次进入、数据仍在加载时显示转圈加载动画与提示文字,避免白屏无反馈;余额查询加载中同步使用加载动画。
  • 表格适配:所有表格改为宽度自适应容器(width:100%),单元格内容按需换行,不再因内容超宽出现横向滚动条;极窄窗口下容器保留横向滚动兜底。窗口缩放、不同分辨率下查看更舒适。

v1.10.0

Choose a tag to compare

@feiyang-dev feiyang-dev released this 23 Aug 02:45

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

Choose a tag to compare

@feiyang-dev feiyang-dev released this 20 Aug 11:43

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),无需手动处理。