本地 Agent 用量与费用仪表盘。
在本机读取各编码助手留下的会话 / 日志,汇总 Token、缓存与估算费用,并可选查询多家 API 中转 / 订阅的余额。
默认界面语言为简体中文,可在「设置」中切换 English。
# 安装前端依赖
npm install
# 开发模式(热更新 + 桌面窗口)
npm run tauri dev生产构建:
npm run tauri build-
首次启动
若本地用量库为空,应用会自动做一次全量扫描。也可随时点工具栏 「扫描」 / 「全量扫描」。 -
概览
看总记录数、会话数、费用与 Token 汇总;按日图表;按 Agent / 按模型表格(支持缓存命中率)。 -
记录
按 Agent、模型、时间、项目筛选明细;分页浏览。 -
余额
配置多家 Provider(可多 Key),查询额度 / 余额;结果会写入 SQLite 时序快照。
支持按间隔自动刷新(在「设置」里配置)。 -
设置
- 启用 / 关闭某个 Agent 数据源,并可选覆盖数据路径
- 余额 / 用量自动刷新间隔
- 模型价格覆盖(手动指定单价)
- 界面语言
- 「同步价格」:从公开模型目录拉取单价缓存
-
主题
标题栏可切换浅色 / 深色 / 跟随系统。
应用数据(SQLite 用量库、设置、价格缓存)一般在:
| 系统 | 路径 |
|---|---|
| Windows | %APPDATA%\com.zhiyir.agent-statistics\ |
| 主要文件 | usage.db、settings.json、prices.json |
用量本身来自各 Agent 自己的本机目录,本应用默认只读扫描,不会改写对方会话文件。
-
增量扫描(「扫描」)
按源文件 mtime / 大小判断:未变则跳过;JSONL 仅追加则 tail 读取;缩小或重写则整文件重扫。 -
全量扫描(「全量扫描」)
清空该 Agent 在库中的旧行后重建。前端会清空用量视图并显示进度,避免一直显示过期数字。
扫描在后台线程执行;界面用进度事件 + 节流刷新,避免写库时高频全表聚合把 UI 卡死。
| ID | 名称 | 默认路径(可被设置覆盖) | 主要格式 |
|---|---|---|---|
claude |
Claude Code | ~/.claude/projects |
会话 JSONL |
codex |
OpenAI Codex | ~/.codex/sessions |
rollout-*.jsonl(token_count) |
kimi |
Kimi Code | ~/.kimi-code/sessions,并兼容 ~/.kimi/sessions、%APPDATA%\Kimi Code\sessions |
wire.jsonl + session_index.jsonl + config.toml 模型映射 |
opencode |
OpenCode | $XDG_DATA_HOME/opencode/opencode.db,未设置时为 ~/.local/share/opencode/opencode.db |
SQLite |
zcode |
ZCode | 项目内约定路径 | SQLite 等 |
zed |
Zed Agent | Windows:%LOCALAPPDATA%\Zed\threads\threads.db |
zstd/JSON 线程库 |
各 Collector 实现见 src-tauri/src/collectors/。
不同产品对「Input / Cache」定义不一致,汇总时需要注意:
-
Codex / OpenAI 风格
input_tokens通常已包含缓存部分;cached_input_tokens ⊆ input。
命中率按cache_read / input计算。 -
Claude / Anthropic 风格
Input 多为 fresh;cache read / creation 单独字段,统计上可与 Input 相加。 -
Kimi Code
现代usage.record为顶层字段;只计usageScope == "turn"(session为累计快照,计入会翻倍)。
会用config.toml的[models."…"]把显示名 / 表键解析为model字段(Model ID),不会读取或保存 API Key。 -
按模型汇总
同一model可能来自多个provider,汇总按 model 合并,避免只显示其中一个 Provider 切片。
- 价格来自同步的公开目录缓存(
prices.json)+ 设置里的模型覆盖。 - 计费时会把 cache read / write / reasoning 与 fresh input 分开(若有单价)。
- 界面费用默认展示到小数点后两位;仅为估算,以账单为准。
余额 Tab 通过 HTTP 查询你配置的中转 / 订阅接口(Bearer Token 等)。
密钥只保存在本地 settings.json;快照写入 usage.db 的 balance_snapshots 表。
| 层级 | 技术 |
|---|---|
| 桌面壳 | Tauri 2 |
| 前端 | React 19 + TypeScript + Vite + Tailwind / shadcn 风格组件 |
| 图表 | Recharts |
| 后端 | Rust:采集、SQLite、定价、余额请求 |
| 本地库 | rusqlite(WAL) |
.
├── src/ # 前端
│ ├── App.tsx # 主界面:概览 / 记录 / 设置与扫描状态
│ ├── components/ # 余额页、标题栏、主题、表格与 UI 原语
│ ├── i18n/ # 轻量国际化(默认 zh-CN)
│ ├── lib/api.ts # 调用 Tauri commands
│ └── types.ts # 前后端共享类型(TS 侧)
├── src-tauri/
│ ├── src/
│ │ ├── lib.rs # commands、扫描线程、启动逻辑
│ │ ├── collectors/ # 各 Agent 采集器
│ │ ├── db.rs # usage.db schema 与查询
│ │ ├── pricing.rs # 价格缓存与 cost 计算
│ │ ├── balance.rs # 余额 Provider 适配
│ │ ├── models.rs # 序列化结构
│ │ └── state.rs # 应用状态与数据目录
│ ├── prices.json # 打包/默认价格数据
│ └── tauri.conf.json
├── LICENSE # GNU AGPL v3 全文
└── README.md
- Rust:只读扫描本机文件 / DB、写自己的
usage.db、拉价格、查余额。 - 前端:展示、筛选、编辑设置与余额配置、触发扫描 / 同步。
- 通信:Tauri
invoke+ 事件(scan-progress、scan-finished、price-sync-*、balance-refreshed等)。
# 仅前端(无桌面壳时可用 Vite)
npm run dev
# Rust 检查
cd src-tauri && cargo check
# 部分单元测试(例如 Kimi 解析)
cd src-tauri && cargo test --lib贡献代码时请保持改动范围克制:优先修采集口径与汇总正确性,避免无关重构。
本项目以 GNU Affero General Public License v3.0(AGPL-3.0-only)发布。
package.json 与 src-tauri/Cargo.toml 中的 license 字段与此一致。
- 你可以自由使用、学习、修改和再分发本软件。
- 如果你分发修改版(或包含本项目代码的衍生作品),必须以 AGPL v3 开源,并提供完整对应源代码。
- 如果你把修改版跑在网络服务上,让别人通过网络使用它,AGPL 还要求你向这些用户提供对应源代码的获取方式(这是 AGPL 相对普通 GPL 的关键加强点)。
- 软件按「现状」提供,不附带任何担保;详情见许可证第 15、16 节。
完整法律文本见仓库根目录 LICENSE(与 GNU 官方 AGPL-3.0 文本 一致)。
若你计划闭源商用、嵌入专有 SaaS 或与不兼容许可证组合,请先自行阅读全文或咨询法律顾问。
本应用会链接 / 打包大量开源第三方组件。它们各自保留原许可证;本仓库源码以 AGPL-3.0-only 授权,并不改变这些依赖的原有条款。再分发二进制时,请一并保留其版权与许可声明(完整清单可用 npx license-checker、cargo metadata 等生成)。
| 组件 | 许可证 | 说明 |
|---|---|---|
| React、React DOM、Recharts、Radix UI、clsx、tailwind-merge、shadcn、tw-animate-css 等 | MIT | 宽松许可 |
| class-variance-authority | Apache-2.0 | 需保留 NOTICE/版权声明(若附带) |
| lucide-react | ISC | 宽松许可 |
| @tauri-apps/api | Apache-2.0 OR MIT | 双许可,任选其一遵守 |
| @tauri-apps/plugin-opener | MIT OR Apache-2.0 | 同上 |
| @fontsource-variable/geist(Geist 字体) | OFL-1.1 | 可随软件嵌入与分发;不得单独出售字体文件;须保留 OFL 声明 |
| 组件 | 许可证 | 说明 |
|---|---|---|
| tauri、tauri-build、tauri-plugin-opener | Apache-2.0 OR MIT | 双许可 |
| serde、serde_json、chrono、anyhow、thiserror、regex、dirs、reqwest 等 | MIT OR Apache-2.0 | 双许可 |
| rusqlite、zstd | MIT | 宽松许可 |
| walkdir | Unlicense / MIT | 宽松许可 |
| 类型 | 示例 | 对再分发的影响 |
|---|---|---|
| MPL-2.0 | cssparser、selectors 等(经 UI/CSS 相关 crate 引入) | 文件级弱 copyleft;修改这些 MPL 文件时需按 MPL 公开对应修改 |
| LGPL 可选条款 | 如 r-efi(MIT OR Apache-2.0 OR LGPL-2.1-or-later) |
可选 MIT/Apache,按宽松条款使用即可 |
| CC-BY-4.0 | caniuse-lite(browserslist 数据,多见于构建链) | 内容许可,保留署名即可 |
| OFL-1.1 | Geist 字体(见上) | 见字体条款 |
| Unicode / Zlib / BSD / ISC / BlueOak / 0BSD / CDLA-Permissive / CC0 等 | 大量传递 crate / 数据 | 宽松或公共领域类,按各自文本保留声明 |
当前直接与传递依赖中未发现 SSPL、BUSL、Elastic License 等与 AGPL 组合通常有问题的专有 / 强限制许可证。依赖会随版本变化,发布前建议再跑一遍许可证扫描。
以上说明便于合规自查,不构成法律意见。
Agent Statistics —— 把散落在本机的 Agent 用量收拢到一张表里。