Repository navigation
Releases: zduu/cpa-usage-plugin
Release list
v2.7.7
v2.7.7 - 2026-10-20
本版本修复热更新后旧插件实例在退出时覆盖新快照、导致历史请求、花费和周额度统计回退的问题。无需新增配置,存储快照格式保持 v3。
修复
- 实现
plugin.quiesce:热替换前等待已开始的调用和兜底入账结束,排空持久化队列、保存快照并释放数据目录。暂停后拒绝新的业务调用,重复 shutdown 不再写出旧快照。 - 为持久化目录增加操作系统独占写入锁
.writer.lock,覆盖加载、写入和分片清理。其他实例占用目录时停止当前实例的持久化,并通过存储状态及健康告警报告错误,避免两个实例互相覆盖数据。锁随正常交接或进程退出自动释放,无需删除锁文件。 - 支持热替换失败后,由宿主通过
plugin.reconfigure重新启用已暂停的旧实例并从磁盘恢复统计。
首次升级步骤
从 v2.7.6 及更早版本首次升级到 v2.7.7,必须停服替换,不能直接在运行中的旧实例上热更新。 旧二进制不支持暂停和写入锁,新版无法约束已驻留的旧代码。
- 停服前先做完整用量导出,另备份存储目录和模型价格文件;事件筛选导出不能替代完整用量备份。
- 停止 CPA 服务或容器,再替换对应平台的插件文件并启动,保留原持久化路径。
- 核对总请求数、token、花费及
/health的存储错误。若停服时已驻留的旧实例覆盖了快照,导入停服前的完整用量备份恢复记录。
已支持此交接协议的版本之间可由宿主在热替换前暂停旧实例并移交写入权。多实例部署仍应分别使用独立数据目录。排除写入锁冲突后需重新配置或重启,以恢复持久化。
本修复防止后续覆盖,无法补回已经丢失且没有备份的历史请求与花费。回退到旧版前应保留当前完整导出及数据目录,并使用升级前的备份恢复旧版。
Full Changelog: v2.7.6...v2.7.7
v2.7.6
v2.7.6 - 2026-10-18
本版本修复 Antigravity Gemini 额度观测及重置时间与 CPA 不一致的问题。无需新增配置,存储快照仍为 v3,可从 v2.7.x 升级。
修复
- Antigravity 查询使用与 CPA quota 管理相同的
antigravity/hub/2.23.0 darwin/arm64客户端标识,优先使用 daily 和 daily sandbox。仅当两者都没有有效窗口时才回退正式环境;daily 有部分有效窗口时保留这些读数,不会因正式环境返回窗口更多就切换到另一组额度周期。缺失窗口继续使用同来源已保存的历史,不混合不同环境数据。 - 按
hub-daily和hub-production分开保存 Antigravity 额度历史。更换来源不会被误判为使用重置卡;已纠正来源生效后,错误来源的周期不再影响当前显示,请求事实及备份中的旧历史仍保留。 - 未使用的 Antigravity 窗口不再把上游每次返回的「查询时间 + 窗口长度」占位值显示成周期起止和倒计时,改为显示「重置时间待确认」及观测时间;固定重置时间的窗口继续正常显示。
- 回退到 v2.7.5 或更早的不含来源支持的版本时,须同时恢复升级前的数据目录;旧版本无法校验新增的来源周期标识。
验证
- Dashboard 前端 208 项测试通过,覆盖 daily 部分窗口优先、仅在 daily 和 sandbox 都无有效数据时回退正式环境、来源隔离及未确认的滚动重置时间。
go test -race ./...、go vet ./...、Dashboard 前端 208 项测试、发布更新器测试和 stock CPA v7.2.152 SDK ABI 检查均通过;GitHub Actions 将执行多平台 release 构建验证。
Full Changelog: v2.7.5...v2.7.6
v2.7.5
v2.7.5 - 2026-10-15
本版本为 Antigravity 凭证按 Google 模型池拆分额度窗口,并修复被遮蔽模型名导致的展示与计价错误。无需新增配置,存储快照仍为 v3,可直接从 v2.7.x 升级。
新增
- Antigravity 额度面板按 Google 的模型组展示额度池,每个池内可切换 5 小时和周窗口,各自保留用量、起止时间及本期/上期历史,不再把两个窗口的统计合并在一条时间线上。
- 核对 Google 原始摘要后确认模型归属:
Gemini Models的gemini-5h/gemini-weekly对应 Gemini,Claude and GPT models的3p-5h/3p-weekly对应 Claude 和 GPT-OSS。仅这些精确的组名、bucket 标识与窗口组合会按gemini-、claude-、gpt-oss-前缀计入请求、token、花费和金额推算;已升级的旧快照无需重新观测即可识别同一标识。其他额度池继续显示归属未知,不把整份凭证的请求重复计入每个池。 dashboard-api-detail的credential_quota_cycles中,Antigravity 每组改为返回group_id、name和windows数组,每个窗口含window_seconds、current、previous;其他提供商沿用原结构。
修复
- 模型名被遮蔽时看板的模型表和价格查找失效:CPA 会把非 Claude 的目录模型改写为
claude-fable-5-dd-加反转的原始 ID,客户端请求名落入用量记录后既隐藏真实模型,也因价格按上游模型名索引而查不到价格。现在记录、去重指纹和额度事实统一还原真实模型名,加载旧快照时也会一并修复,model(value)形式的思考后缀保持原样。 - 未使用的 Antigravity 窗口每次查询都把截止时间返回为「当前时间 + 窗口长度」,此前会被当作重置卡,把空的上期反复归档并重启本期。现在截止时间后移只在刚结束的有效片段确实消耗过额度时才视为重置。
- 已归档的空白上期不再显示为「上一个周期」,加载旧快照时会清除这类占位归档。
升级与回退
- 升级方向兼容:从 v2.7.x 升级到本版本无需额外操作。但已映射的 Antigravity 窗口带有新的组标识,v2.7.4 及更早版本的校验会以
invalid quota group拒绝整份快照并关闭持久化。回退到 v2.7.4 及更早版本时,必须同时恢复升级前的数据目录。
验证
go test -race ./...通过(94.7 秒);go vet ./...通过。- Dashboard 前端测试 203 项通过,覆盖两个模型池的窗口切换与各自的本期/上期状态保留。
Full Changelog: v2.7.4...v2.7.5
v2.7.4
v2.7.4 - 2026-10-11
本版本修复从 v2.7.1 及更早版本升级后显示「持久化异常」(invalid quota period)、持久化被停用的问题。v2.7.3 未覆盖这一情形,请直接升级到本版本。无需新增配置,存储快照仍为 v3。
修复
- v2.7.1 及更早版本压缩额度观测时,每期最多可能保留 65 条,超过加载时 64 条的上限;快照写入时不校验,之后启动加载即被拒绝。现在加载快照、导入备份和回放日志时会重新排序并压缩到 64 条,周期及其统计完整保留;v2.7.2 起运行时压缩已严格限制为 64 条。
- 已出现该提示的实例:升级前先在看板做一次完整导出,升级重启后再导入,可保留停用期间仅在内存中的记录。
Full Changelog: v2.7.3...v2.7.4
v2.7.1
v2.7.1 - 2026-10-09
本版本修复额度周期把已用比例的正常抖动误判为重置卡的问题。无需新增配置,存储格式不变;可直接从 v2.7.0 升级。
修复
- 周额度等窗口不再因已用比例小幅下降而从中途重新累计。此前任意下降(如 21% → 20%)都会被当作重置卡,导致「本周期」只统计下降之后的少量请求,实际花费偏低、推算总额度失真。
- 响应头额度观测改按请求开始时间排序。上游在接收请求时计算这些值,此前按完成时间排序会让长流式请求的旧读数排到之后的请求后面,形成假下降;Codex 相对重置时间也不再因流式时长而后移。
重置卡判断
- 到期时间后移:重置卡让窗口重新计时,仍带旧到期时间的观测视为重置前观测。新到期时间减去窗口时长即重置时刻,落在前后观测之间时从该时刻重新累计,两次观测之间的请求也会计入。
- 已用比例明显下降:比重置以来的最高值下降超过 2 个百分点,或从大于 0 降到 0%,且下一条观测仍接近下降后的值,才按重置处理。仅有一次下降、尚无后续观测时暂不判定。
- 升级后统计在查询时重新计算,已保存的观测会按新规则重新判断。详见额度周期说明。
Full Changelog: v2.7.0...v2.7.1
v2.7.0
v2.7.0 - 2026-10-08
本版本新增 CPA v8 凭证额度周期统计。存储快照升级为 v3,旧版插件无法读取,升级前请备份数据目录。普通用量统计在 CPA v7 与 v8 上均可使用;额度周期需要 CPA v8。
升级须知
- 升级前停用插件,备份整个
storage_path目录与模型价格文件。升级后核对总请求数、token、成本,以及/health中的存储错误。 - 首次以本版本关闭或定时快照后,快照版本变为 3。回退到 v2.6.6 时必须同时恢复升级前的数据目录;旧插件不能直接读取 v3 快照。实验性 SQLite 迁移工具会拒绝 v3 快照,避免丢弃额度数据。
- macOS 构建会将插件动态库保留到 CPA 进程退出;更新或覆盖插件文件后请重启 CPA,以释放旧映像。
- 无需新增配置。
凭证额度周期(新增,需要 CPA v8)
- 上游接口详情新增可折叠的「额度周期」面板,位于来源分布与错误统计之间,默认收起,刷新时保留展开状态。仅显示上游实际提供的窗口:Claude 5h/7d、Codex 主/次及附加窗口、Devin 日/周,以及 Antigravity 独立额度组的 5h/周。
- 本期与上期分别展示请求、总 token(M)、实际花费、上游已用比例、实时重置倒计时和模型分布。达到 100% 时显示按已记录花费计算的「真实总额度」;未用满时显示「推算总额度 = 本周期实际花费 ÷ 已用比例」及预计剩余。检测到已用比例下降时按重置处理,从新观测重新累计。
- 模型表显示请求、成功、失败、花费、费用占比、缓存命中率,以及「仅用此模型预计总 token = 推算总额度 × 该模型总 token ÷ 该模型实际花费」。金额或价格未知时显示
—,显式零价保持为 0。 - Claude/Codex 优先读取原生 usage 响应头;看板复用管理鉴权读取 v8 凭证列表并提交观测。Antigravity 通过管理鉴权的上游查询读取,只在展开当前接口时自动查询,间隔至少 5 分钟,支持手动刷新。上游未提供模型归属时,只显示比例、重置时间和周期历史,不分摊请求或推算金额。
- 额度按凭证统计所有客户端的请求,不受页面时间范围和客户端筛选截断。空闲任意时长后仍保留最近一次已完成的上期。
- 周期事实和观测纳入 JSONL、v3 存储快照、完整备份与导入;事件明细上限和普通保留期不会删除仍被本期/上期使用的记录。导入删除标记同时回退主账与额度统计,乱序观测与备份合并保留最近的完整上期。
- 新增管理接口
POST /dashboard-quota-observations:校验宿主凭证身份后保存观测,返回接受、跳过、拒绝数量及被拒绝条目的下标rejected_indexes,不增加请求计数。/dashboard-api-detail增加可选的credential_quota_cycles与quota_credentials。详见额度周期说明。
修复
- 超长模型名或记录 ID 不再写入额度事实和删除标记,修复重启加载快照失败后关闭持久化的问题。
- Codex 相对重置时间提前几分钟时保留并对齐上期;周期切换后迟到的漂移观测归入已结束的上期,不再清空其样本。
- 重启后重新提交的相同观测不再重复保存;看板只对被拒绝的观测等待 5 分钟后重试,不再每次轮询重发整批。
- Antigravity 查询中途折叠面板或切换接口时,保留之前的「额度读取失败」提示。
- Antigravity 额度解析不再把布尔值、数组等异常输入当作 0%/100%;跳过空条目与无效额度池,保留同一响应中的有效额度池。
- 重置卡改变到期时间后,合并重置前后的备份不再丢失重置边界或将重置前花费计入当前统计。
- 升级后 Antigravity 历史请求没有额度事实时,从所选接口保留的请求记录发现凭证,允许首次查询。
- 先到达的窗口撤销标记在周期历史过期后仍保留,防止迟到观测重新显示已撤销额度;未满额的比例不会四舍五入显示为 100%。
- 插件重新启用后不再复用旧条件缓存,ETag 包含实例标识;浏览器会重新提交内存模式下的额度观测。
- 修复 macOS 动态库卸载时 Go 运行时仍存活导致的退出卡住;重新启用时重建已关闭的统计与导出服务。
- 修复移动端额度模型表被压缩成逐字竖排的问题。
验证
- 完整
go test -race、go vet与 201 项前端测试通过。 - 未修改的 stock CPA v7.2.152 镜像上完整 HTTP 验收通过,覆盖管理鉴权、匿名资源别名拒绝、导入去重、改价、冻结导出、完整备份、优雅重启与 SIGKILL 恢复。
- 从正式发布的 v2.6.6 升级:明细被截断的数据目录升级后累计值不重复,升级后新增请求正常入账,再次重启保持稳定。
- CPA v8.0.8 源码夹具上额度周期 HTTP 验收通过,包括两次重启后的恢复。
- 在 CPA v8.0.8 上使用一份 6652 条请求的真实数据副本,从旧插件升级并连续重启 3 次,请求、成功/失败、token 与花费均保持一致,快照为 v3,无插件错误日志。
已知边界
- 金额推算以本插件记录的花费为基础;中途开始记录、缺失记录、凭证在其他地方使用或上游观测延迟,都会使推算偏差。上游比例可能存在取整或非美元计费规则,推算仅供参考。
- 读取 v8 凭证列表失败后,看板等待 5 分钟再重试,以免在 CPA v7 上持续请求不存在的接口。
- 浏览器关闭期间,原生 usage 继续入账;仅存在于宿主凭证列表中的新观测要等看板再次打开后才能保存。
- 内存和磁盘开销随额度周期保留的真实请求数增长。
Full Changelog: v2.6.6...v2.7.0
v2.6.6
v2.6.6 - 2026-09-26
看板
- 上游接口统计面板新增「隐藏成功率 0%」开关:开启后从表格里隐藏成功率确实为 0 的上游接口,并显示已隐藏数量。开关状态保存在浏览器 localStorage 中,只过滤这张表格;上游接口详情下拉、导出和 API Key 联动仍保留全部上游,被隐藏的接口依然可以选中查看。请求数为 0 或成功计数未知的上游不受影响,极低但非零的成功率显示为「<0.1%」。当前数据没有 0% 接口时按钮置灰,已开启的按钮保持可点。
Full Changelog: v2.6.5...v2.6.6
v2.6.5
v2.6.5 - 2026-09-14
本版本修复了一处匿名数据泄露和一处升级重复入账缺陷,并交付范围查询优化、完整用量备份和更省分配的账本写入。它不是"整体低资源"版本:SQLite 仍未接管运行时历史存储,内存仍随有效历史增长,边界见文末。
安全
- 修复匿名资源路由泄露数据:stock CPA 的
/v0/resource/plugins/不校验管理密钥,此前统计、事件、价格、健康状态和导出接口都可被未授权读取。现在该入口只提供静态看板页,处理器同时拒绝宿主缓存的旧资源别名(即使请求自带 Authorization 头),所有数据请求统一走/v0/management/plugins/管理鉴权。升级后请刷新看板页面;调用旧资源数据别名的外部脚本需要同步改为管理 URL。
升级数据正确性
- 修复从 v2.6.4 升级后累计请求、token 和费用重复入账:旧版快照只保存被
max_details_per_model截断后的可见明细,超出部分仅存在于汇总计数中,而当天 JSONL 仍包含这些请求,恢复时它们无法按去重键命中,被当作新请求再加一次。现在恢复会按接口/模型记录「已计入但不可寻址」的残差,重放当天日志时只消耗残差、不再累加;请求时间晚于快照生成时间的新请求不受影响,仍正常入账,重复重启保持稳定。 - 该缺陷在 v2.6.4 自身重启时同样存在(同一模型当日请求数超过明细上限即触发),旧版本无法修复;升级到本版本后,恢复该形态的数据不再重复入账,之后每次重启也保持稳定。
查询与写入
- 范围摘要与接口详情复用有预算的精确块汇总,边界记录仍逐条计算;追加、裁剪、修复、排序和改价正确失效,缓存满后的清理扫描每次查询最多一次。10 万条 7 天摘要从 54.30 ms 降到 1.45 ms,接口详情从 6.30 ms 降到 0.34 ms(本机 Apple M1 组件基准,非 p95/p99)。
- 明细达到上限后保留精简逐请求账本,维持范围统计、按请求时间重新计价及到期扣减;分块账本复用底层空间,单条写入分配从 2043 B/op 降到 256 B/op。
- 修复同时间戳最近事件的选择,以及只排序、不淘汰时的块缓存失效;统计同频排序保持稳定。
- 增量事件索引、只读筛选、查询内价格复用减少查询耗时。
完整用量备份(新增)
- 新增
/usage/export-jobs系列管理接口和看板按钮:冻结账本块、计数与配置后逐条写出 v1 JSON,包含归档账本与残差,不受事件筛选或条数上限截断;支持 gzip 和最多 256 KiB 的有校验分块下载、CRC32、取消和任务回收。 - 支持原生解压流的浏览器自动压缩传输,校验压缩数据及解压长度,旧浏览器回退未压缩分块;看板直接保存文件字节,保留大整数精度。
- 修复同一实例回导备份时客户端 hash 被提前清除导致的重复计数;重复导入跳过已存在的完整指纹,保留跨实例导入规则及不同请求。
其他修复
- 快照无法读取或解码时停止目标目录写入,防止关闭覆盖恢复源;归档导入记录携带 JSONL 归档标记,避免重启后重新进入可见事件列表。
- 分块导出使用不受宿主 HTML 转义影响的版本标识,同时兼容旧客户端的 ETag。
- 防止前端旧异步响应覆盖新筛选和缓存;修复数组导出协商后的整包下载回退。
- 工具链升至 Go 1.26.6;发布包携带 SQLite 驱动通知;宿主 ABI 校验支持构建版本并覆盖实际分块下载。
2026-09-14 复审修复
- 配置热更新串行管理后台任务生命周期;非存储配置更新不再创建额外 writer,避免遗留线程和并发重配交错。超出
time.Duration范围的保留期、去重窗口及存储/价格刷新间隔会被忽略,不再溢出成负时长。 - 无新请求时,摘要、事件、接口详情、快照和备份读取也会扣除已过期用量,并同步失效 ETag 与查询缓存;未到最早过期时间时不扫描历史。
- 价格文件首次读取失败、之后恢复时,同步重建费用并失效缓存;前端拒绝非法、负数、溢出和浏览器无法解析的价格输入,不再悄悄保存为零价。
- 错误文本中的查询凭证参数按大小写无关方式逐一脱敏,覆盖重复参数、短密钥及编码的等号,同时保留后续参数与 JSON 结构。
- 同一脱敏标签出现多个不同客户端 hash 时,旧无 hash 记录保持独立;摘要返回精确筛选值,避免接口详情、事件和范围统计交叉计数。唯一 hash 的兼容合并及旧筛选值继续支持。
- 旧无 hash 记录与唯一客户端身份合并时,同步累加客户端及其模型的已计费用,修复启用时段价格后请求/token 正确但客户端费用偏低的问题,包含被裁剪到归档账本的记录。
- 看板兼容浏览器禁用/损坏的本地存储;关闭价格搜索后丢弃迟到结果;从兼容模式或错误状态恢复收到 304 时重新渲染正确摘要。
- 兼容全量数据的前端统计纳入归档账本,补齐范围、健康、来源和客户端聚合;取消事件导出时,等待统计锁不再持续占用后台任务名额。
验证
- 修复前的反证:同一台未修改的 stock CPA 容器里,
v2.6.4写入 1200 条请求(明细上限 100,快照只留下 200 条逐请求记录),v2.6.5恢复后累计变成 2200;修复后为 1200。升级后新增 40 条为 1240,再次重启仍为 1240。 - 全量验证:未修改的 stock CPA 镜像上 198 项真实 HTTP 检查通过,覆盖管理鉴权、匿名资源别名拒绝、导入去重、范围/筛选、改价、冻结导出与分块下载、完整备份、优雅重启与已同步增量的 SIGKILL 恢复;真实 Chrome 153 验证筛选、翻页、分块重试与下载文件内容。
- 回归:完整
go test -race、go vet、163 项前端测试、发布更新脚本测试,以及 Linux/macOS 共享库的 stock CPA v7.2.152 SDK 装载校验全部通过。 - 2026-09-14 复审:Go 1.26.6 下 CGO 与
sqlite_purego两套驱动的完整-race -shuffle=on -count=1测试通过;关键新增回归连续运行 10 次通过,go vet、169 项前端测试、JS/Shell 语法检查和发布更新脚本测试通过。 - 本轮集成复验:最新 macOS arm64 共享库通过 stock CPA v7.2.152 SDK 装载及分块导出校验;Chrome 152 验证 12,000 条记录的筛选、翻页、下载重试和 JSON/CSV 内容,并验证浏览器禁用本地存储时看板仍可加载和切换范围,无页面异常。SQLite 迁移投影额外进行 30 秒模糊测试,7,818 次输入未发现新失败。
已知边界
- SQLite 尚未接管运行时。schema 已推进到 7,具备事务化记录/状态/进度提交、一致性备份与受控恢复、磁盘语义投影和大记录分块,但运行时历史存储仍是内存 + JSONL + 快照,没有可启用的数据库配置。
- 冻结导出、完整备份和有效历史仍有随数据量增长的内存开销;组件分配量不代表容器 RSS,本版本没有达成"RSS 降低 25%、CPU 降低 15%"的目标,也没有 24 小时稳态数据。
- 10 万条历史的存活堆高于 v2.6.4,这是保留完整逐请求账本的功能成本,不是回归。
- 旧浏览器未压缩分块下载慢于旧的整包下载路径;gzip 生成约为未压缩流式路径的 2.85 倍 CPU。
- 降级不是无损的:本版本的快照新增了
accounting语义,v2.6.4无法回写。升级与回退步骤见部署说明。 - 升级建议:先停用插件、备份整个
storage_path目录与模型价格文件,升级后核对总请求数、token、成本、可见明细数及/health存储错误。
Full Changelog: v2.6.4...v2.6.5
v2.6.4
v2.6.4 - 2026-09-07
本版本在插件内部补齐旧宿主原生用量缺失的端点与流式标记,不需要修改或重编译 CPA。接口以未修改的 CPA v7.2.152 为准。
- 使用已有请求拦截与完成回调获取真实路径及流式状态;原生 usage 仍是唯一用量计数来源
- 保持响应拦截和流式分片拦截关闭,不恢复实时兜底,不修改请求或响应内容
- 并发候选冲突时保留未知值,不覆盖原生明确上报的字段;缓存有容量和时间上限
- 删除旧 v2.6.4 中要求修改 CPA 的补丁及说明
- 修复管理接口状态码的宿主 ABI 拼写兼容,确保 304 和错误状态能被 CPA 正确读取
- 回归覆盖 Responses、Chat Completions、Messages、Gemini、取消/失败请求、重试、并发歧义、原生字段优先、快照与 JSONL 恢复
旧宿主的 usage 不含请求 ID,无法对所有并发场景保证端点补齐;未提供请求回调或缺少必要信息时保持未知。具体边界见部署文档。
Full Changelog: v2.6.3...v2.6.4
v2.6.3
v2.6.3 - 2026-09-06
本版本关闭响应拦截实时兜底,改为依赖新版 CPA 原生用量上报,并修复统计明细保留路径的 CPU 与内存分配开销。
- 关闭
response_interceptor与response_stream_interceptor能力,避免流式请求重复传输请求体、历史分片和维护延迟匹配状态 - 明细达到保留上限时按当前模型裁剪并清理底层引用,避免每次写入复制整个明细窗口
- 延后过期明细和 dedup 索引的全局扫描,仅在最早到期时间执行
- 保留旧版兜底数据导入、恢复及去重修复能力
- 通过 Go race、
go vet、共享库构建和 Dashboard 前端测试
Full Changelog: v2.6.2...v2.6.3