Files

1 line
99 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "annihilater/token-stats", "files": {"README.zh-cn.md": {"8c3b763462688086c9edeece106035e18895a240": {"t": 1785595283.5607522, "n": 71086, "h": "2695474317fdd1c4", "c": "<!-- <CENTERED SECTION FOR GITHUB DISPLAY> -->\n\n<div align=\"center\">\n\n[![Token Stats](./.github/assets/hero-v2.png)](https://token-stats.com)\n\n</div>\n\n> 高性能 CLI 工具和可视化仪表板,用于跟踪多个平台上 AI 编程助手的 Token 使用量和成本。\n\n> [!NOTE]\n>\n> **Token Stats** 是面向 [token-stats.com](https://token-stats.com) 的分支版本,CLI 包为 `@token-stats/cli`。<br />\n> 安装:`bunx @token-stats/cli@latest` · 站点:[token-stats.com](https://token-stats.com) · 仓库:[Annihilater/token-stats](https://github.com/Annihilater/token-stats)\n\n\n\n<div align=\"center\">\n\n[![GitHub Release](https://img.shields.io/github/v/release/Annihilater/token-stats?color=0073FF&labelColor=black&logo=github&style=flat-square)](https://github.com/Annihilater/token-stats/releases)\n[![npm Version](https://img.shields.io/npm/v/%40token-stats%2Fcli?color=0073FF&labelColor=black&style=flat-square&logo=npm)](https://www.npmjs.com/package/@token-stats/cli)\n[![npm Downloads](https://img.shields.io/npm/dt/%40token-stats%2Fcli?color=0073FF&labelColor=black&style=flat-square)](https://www.npmjs.com/package/@token-stats/cli)\n[![GitHub Contributors](https://img.shields.io/github/contributors/Annihilater/token-stats?color=0073FF&labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/graphs/contributors)\n[![GitHub Forks](https://img.shields.io/github/forks/Annihilater/token-stats?color=0073FF&labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/network/members)\n[![GitHub Stars](https://img.shields.io/github/stars/Annihilater/token-stats?color=0073FF&labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/stargazers)\n[![GitHub Issues](https://img.shields.io/github/issues/Annihilater/token-stats?color=0073FF&labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/issues)\n[![License](https://img.shields.io/badge/license-MIT-white?labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/blob/master/LICENSE)\n[![Coverage](https://img.shields.io/badge/coverage-n%2Fa-lightgrey?labelColor=black&style=flat-square)](https://github.com/Annihilater/token-stats/issues/403)\n\n[🇺🇸 English](README.md) | [🇰🇷 한국어](README.ko.md) | [🇯🇵 日本語](README.ja.md) | [🇨🇳 简体中文](README.zh-cn.md)\n\n</div>\n\n<!-- </CENTERED SECTION FOR GITHUB DISPLAY> -->\n\n| Overview | Models |\n|:---:|:---:|\n| ![TUI Overview](.github/assets/tui-overview.png) | ![TUI Models](.github/assets/tui-models.png) | \n\n| Daily Summary | Stats |\n|:---:|:---:|\n| ![TUI Daily Summary](.github/assets/tui-daily.png) | ![TUI Stats](.github/assets/tui-stats.png) | \n\n| Frontend (3D Contributions Graph) | Wrapped 2025 |\n|:---:|:---:|\n| <a href=\"https://token-stats.com\"><img alt=\"Frontend (3D Contributions Graph)\" src=\".github/assets/frontend-contributions-graph.png\" width=\"700px\" /></a> | <a href=\"#wrapped-2025\"><img alt=\"Wrapped 2025\" src=\".github/assets/wrapped-2025-agents.png\" width=\"700px\" /></a> |\n\n> **运行 [`bunx @token-stats/cli submit`](#社交平台命令) 将您的使用数据提交到排行榜并创建公开个人资料!**\n\n## 概述\n\n**Token Stats** 帮助您监控和分析以下平台的 Token 消耗:\n\n| 图标 | 客户端 | 数据位置 |\n|------|----------|---------------|\n| <img width=\"48px\" src=\".github/assets/client-opencode.png\" alt=\"OpenCode\" /> | [OpenCode](https://github.com/sst/opencode) | `~/.local/share/opencode/opencode.db` (1.2+,包含 `opencode-stable.db` 等所有渠道) 或 `~/.local/share/opencode/storage/message/` |\n| <img width=\"48px\" src=\".github/assets/client-claude.jpg\" alt=\"Claude\" /> | [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | `~/.claude/projects/` 和 `~/.claude/transcripts/` |\n| <img width=\"48px\" src=\".github/assets/client-openclaw.jpg\" alt=\"OpenClaw\" /> | [OpenClaw](https://openclaw.ai/) | `~/.openclaw/agents/` (+ 旧版: `.clawdbot`, `.moltbot`, `.moldbot`) |\n| <img width=\"48px\" src=\".github/assets/client-openai.jpg\" alt=\"Codex\" /> | [Codex CLI](https://github.com/openai/codex) | `~/.codex/sessions/` |\n| <img width=\"48px\" src=\".github/assets/client-sakana.png\" alt=\"Sakana Fugu\" /> | [Sakana Fugu](https://sakana.ai/fugu/) | 通过 Codex 追踪 — `~/.codex/sessions/*.jsonl` (`model_provider: sakana`) |\n| <img width=\"48px\" src=\".github/assets/client-copilot.jpg\" alt=\"Copilot\" /> | [GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-the-github-copilot-coding-agent-in-cli) | `~/.copilot/otel/*.jsonl` (+ `COPILOT_OTEL_FILE_EXPORTER_PATH`) |\n| <img width=\"48px\" src=\".github/assets/client-hermes.png\" alt=\"Hermes Agent\" /> | [Hermes Agent](https://github.com/NousResearch/hermes-agent) | `$HERMES_HOME/state.db` 和 `$HERMES_HOME/profiles/*/state.db`(回退:`~/.hermes/...`) |\n| <img width=\"48px\" src=\".github/assets/client-gemini.png\" alt=\"Gemini\" /> | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `$GEMINI_CLI_HOME/tmp/*/chats/*.json`(回退:`~/.gemini/tmp/*/chats/*.json`) |\n| <img width=\"48px\" src=\".github/assets/client-cursor.jpg\" alt=\"Cursor\" /> | [Cursor IDE](https://cursor.com/) | Cursor API 导出缓存于 `~/.config/tokscale/cursor-cache/usage*.csv`(而非 `~/.cursor`) |\n| <img width=\"48px\" src=\".github/assets/client-amp.png\" alt=\"Amp\" /> | [Amp (AmpCode)](https://ampcode.com/) | `~/.local/share/amp/threads/` |\n| <img width=\"48px\" src=\".github/assets/client-codebuff.png\" alt=\"Codebuff\" /> | [Codebuff](https://codebuff.com/) | `~/.config/manicode/`(+ `manicode-dev`、`manicode-staging`;可通过 `CODEBUFF_DATA_DIR` 覆盖) |\n| <img width=\"48px\" src=\".github/assets/client-droid.png\" alt=\"Droid\" /> | [Droid (Factory Droid)](https://factory.ai/) | `~/.factory/sessions/` |\n| <img width=\"48px\" src=\".github/assets/client-pi.png\" alt=\"Pi\" /> | [Pi](https://github.com/badlogic/pi-mono) | `~/.pi/agent/sessions/` 和 `~/.omp/agent/sessions/`([Oh My Pi](https://github.com/can1357/oh-my-pi)) |\n| <img width=\"48px\" src=\".github/assets/client-kimi.png\" alt=\"Kimi\" /> | [Kimi CLI](https://github.com/MoonshotAI/kimi-cli) / [Kimi Code](https://github.com/MoonshotAI/kimi-code) | kimi-cli: `~/.kimi/sessions/` kimi-code: `~/.kimi-code/sessions/`(可通过 `KIMI_CODE_HOME` 覆盖) |\n| <img width=\"48px\" src=\".github/assets/client-qwen.png\" alt=\"Qwen\" /> | [Qwen CLI](https://github.com/QwenLM/qwen-cli) | `~/.qwen/projects/` |\n| <img width=\"48px\" src=\".github/assets/client-roocode.png\" alt=\"Roo Code\" /> | [Roo Code](https://github.com/RooCodeInc/Roo-Code) | `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/` (+ server: `~/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/`) |\n| <img width=\"48px\" src=\".github/assets/client-kilocode.png\" alt=\"Kilo\" /> | [Kilo](https://github.com/Kilo-Org/kilocode) | `~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/` (+ server: `~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks/`) |\n| <img width=\"48px\" src=\".github/assets/client-kilocode.png\" alt=\"Kilo CLI\" /> | [Kilo CLI](https://github.com/nicepkg/kilo) | `~/.local/share/kilo/kilo.db` |\n| <img width=\"48px\" src=\".github/assets/client-mux.png\" alt=\"Mux\" /> | [Mux](https://github.com/coder/mux) | `~/.mux/sessions/` |\n| <img width=\"48px\" src=\".github/assets/client-crush.png\" alt=\"Crush\" /> | [Crush](https://crush.ai/) | `$XDG_DATA_HOME/crush/projects.json`(项目注册表;回退路径:`~/.local/share/crush/projects.json`) |\n| <img width=\"48px\" src=\".github/assets/client-goose.png\" alt=\"Goose\" /> | [Goose](https://github.com/aaif-goose/goose) | `~/.local/share/goose/sessions/sessions.db`(+ macOS Application Support、旧版 Block/goose 路径;可通过 `GOOSE_PATH_ROOT` 覆盖) |\n| <img width=\"48px\" src=\".github/assets/client-antigravity.png\" alt=\"Antigravity\" /> | [Google Antigravity](https://antigravity.google/) | 通过 `token-stats antigravity sync` 缓存到 `~/.config/tokscale/antigravity-cache/sessions/*.jsonl`(使用本地语言服务器 RPC) |\n| <img width=\"48px\" src=\".github/assets/client-antigravity.png\" alt=\"Antigravity CLI\" /> | [Antigravity CLI](https://antigravity.google/) | `~/.gemini/antigravity-cli/conversations/*.db`(可通过 `GEMINI_CLI_HOME` 覆盖 Gemini 主目录;本地 SQLite,直接读取 — 无需 `antigravity sync`) |\n| <img width=\"48px\" src=\".github/assets/client-trae.png\" alt=\"Trae\" /> | [Trae IDE](https://www.trae.ai/) / [Trae Solo](https://www.trae.ai/solo)(国际版) | 通过 `token-stats trae sync` 缓存到 `~/.config/tokscale/trae-cache/sessions/*.json`(来自官方 API 的账号级使用量) |\n| <img width=\"48px\" src=\"https://github.com/warpdotdev.png\" alt=\"Warp\" /> | [Warp](https://www.warp.dev/) / Oz | 通过 `token-stats warp sync` 缓存到 `~/.config/tokscale/warp-cache/usage.json`(仅汇总请求数和消费金额,不含 token 转录) |\n| <img width=\"48px\" src=\"https://github.com/xai-org.png\" alt=\"Grok Build\" /> | Grok Build | `$GROK_HOME/sessions/*/*/updates.jsonl`(回退:`~/.grok/sessions/*/*/updates.jsonl`) |\n| <img width=\"48px\" src=\".github/assets/client-zed.webp\" alt=\"Zed Agent\" /> | [Zed Agent](https://zed.dev/docs/ai/agent-panel) | `~/.local/share/zed/threads/threads.db`(macOS: `~/Library/Application Support/Zed/threads/threads.db`;Windows: `%LOCALAPPDATA%/Zed/threads/threads.db`;仅限托管 Zed 模型,不含外部 ACP 代理) |\n| <img width=\"48px\" src=\"https://github.com/kirodotdev.png\" alt=\"Kiro\" /> | Kiro | `~/.kiro/sessions/cli/*.json`(+ `*.jsonl`)、`~/.local/share/kiro-cli/data.sqlite3`(macOS: `~/Library/Application Support/kiro-cli/data.sqlite3`),以及 Kiro IDE globalStorage 快照(`Kiro/User/globalStorage/kiro.kiroagent`;macOS Application Support、Linux `~/.config/Kiro`、Windows `%APPDATA%\\Kiro`) |\n| <img width=\"48px\" src=\"https://github.com/cline.png\" alt=\"Cline\" /> | [Cline](https://github.com/cline/cline) | VS Code globalStorage 任务(Linux: `~/.config/Code/...`;macOS: `~/Library/Application Support/Code/...`;Windows: `%APPDATA%\\Code\\...`;server: `~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/`) |\n| <img width=\"48px\" src=\"https://github.com/user-attachments/assets/7246e920-f3f8-4b6e-847e-030ae04e86c2\" alt=\"Gajae-Code\" /> | [gajae-code (gjc)](https://github.com/Yeachan-Heo/gajae-code) | `~/.gjc/agent/sessions/`(可通过 `GJC_CODING_AGENT_DIR`、`GJC_CONFIG_DIR`、`PI_CONFIG_DIR` 覆盖;Linux/macOS 上 `$XDG_DATA_HOME/gjc/sessions/` 亦支持) |\n| <img width=\"48px\" src=\".github/assets/client-jcode.png\" alt=\"Jcode\" /> | [Jcode](https://github.com/1jehuang/jcode) | `~/.jcode/sessions/session_*.json` + `session_*.journal.jsonl` sidecar(可通过 `JCODE_HOME` 覆盖) |\n| <img width=\"48px\" src=\"https://github.com/XiaomiMiMo.png\" alt=\"MiMo Code\" /> | [MiMo Code](https://github.com/XiaomiMiMo/MiMo-Code) | `~/.local/share/mimocode/mimocode.db`(XDG 数据目录;SQLite) |\n| <img width=\"48px\" src=\"https://github.com/JetBrains.png\" alt=\"Junie\" /> | [Junie](https://www.jetbrains.com/junie/) | `~/.junie/sessions/*/events.jsonl` |\n| <img width=\"48px\" src=\"https://raw.githubusercontent.com/CommandCodeAI/command-code/main/.github/commandcode/logo/command-code-logo-black-bg.png\" alt=\"Command Code\" /> | [Command Code](https://github.com/CommandCodeAI/command-code) | `~/.commandcode/projects/**/*.jsonl`(Token 使用量按 ~4 字符/Token 从转录估算;不会持久化到磁盘) |\n| <img width=\"48px\" src=\"https://github.com/zai-org.png\" alt=\"ZCode\" /> | [ZCode](https://zcode.z.ai/) | `~/.zcode/cli/db/db.sqlite`(v2 用量数据库)和 `~/.zcode/projects/**/*.jsonl`(旧版记录) |\n| <img width=\"48px\" src=\"https://github.com/alibaba.png\" alt=\"OpenCodeReview\" /> | [OpenCodeReview](https://github.com/alibaba/open-code-review) | `~/.opencodereview/sessions/**/*.jsonl` |\n| <img width=\"48px\" src=\"https://pc3.gtimg.com/softmgr/logo/48/43068_48_1764842447.png\" alt=\"CodeBuddy\" /> | [CodeBuddy](https://www.codebuddy.cn/docs/cli/overview)(CLI、IDE、VS Code 插件) | `~/.codebuddy/projects/**/*.jsonl` + 扩展日志 |\n| <img width=\"48px\" src=\"https://static.workbuddy.cn/web/agents/008054d6beaaf4a83e2d049e982e1244560726dc/assets/share-logo.png\" alt=\"WorkBuddy\" /> | WorkBuddy | `~/.workbuddy/projects/**/*.jsonl` + SQLite 回退 |\n| <img width=\"48px\" src=\".github/assets/client-devin.jpg\" alt=\"Devin CLI\" /> | [Devin CLI](https://devin.ai/) | `~/.local/share/devin/cli/sessions.db`(SQLite) |\n| <img width=\"48px\" src=\".github/assets/client-devin.jpg\" alt=\"Devin Desktop\" /> | [Devin Desktop](https://devin.ai/) | ACP 事件:macOS `~/Library/Application Support/Devin/User/acp-events/`;Linux `~/.config/Devin/User/acp-events/`;Windows `%APPDATA%\\Devin\\User\\acp-events\\` |\n| <img width=\"48px\" src=\".github/assets/client-synthetic.png\" alt=\"Synthetic\" /> | [Synthetic](https://synthetic.new/) | 通过 `hf:` 模型前缀或 `synthetic` provider 从其他来源重归属(+ [Octofriend](https://github.com/synthetic-lab/octofriend): `~/.local/share/octofriend/sqlite.db`) |\n\n使用 [🚅 LiteLLM 的价格数据](https://github.com/BerriAI/litellm)提供实时价格计算,支持分层定价模型和缓存 Token 折扣。\n\n### 为什么叫 \"Token Stats\"?\n\n这个项目的灵感来自 **[卡尔达肖夫指数(Kardashev Scale)](https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%B0%94%E8%BE%BE%E8%82%96%E5%A4%AB%E6%8C%87%E6%95%B0)**,这是天体物理学家尼古拉·卡尔达肖夫提出的一种根据能源消耗来衡量文明技术发展水平的方法。I 型文明利用其行星上所有可用的能源,II 型文明捕获其恒星的全部输出,III 型文明则掌控整个星系的能源。\n\n在 AI 辅助开发的时代,**Token 就是新的能源**。它们驱动我们的思考,提升我们的生产力,推动我们的创造性产出。正如卡尔达肖夫指数在宇宙尺度上追踪能源消耗,Token Stats 在您攀登 AI 增强开发的阶梯时测量您的 Token 消耗。无论您是休闲用户还是每天消耗数百万 Token,Token Stats 都能帮助您可视化从行星级开发者到银河级代码架构师的旅程。\n\n## 目录\n\n- [概述](#概述)\n - [为什么叫 \"Token Stats\"?](#为什么叫-token-stats)\n- [功能](#功能)\n- [安装](#安装)\n - [快速开始](#快速开始)\n - [先决条件](#先决条件)\n - [开发环境设置](#开发环境设置)\n - [构建原生模块](#构建原生模块)\n- [使用方法](#使用方法)\n - [基本命令](#基本命令)\n - [TUI 功能](#tui-功能)\n - [按平台筛选](#按平台筛选)\n - [日期筛选](#日期筛选)\n - [价格查询](#价格查询)\n - [社交平台命令](#社交平台命令)\n - [Autosubmit](#autosubmit)\n - [Cursor IDE 命令](#cursor-ide-命令)\n - [Antigravity 命令](#antigravity-命令)\n - [Trae 命令](#trae-命令)\n - [Warp/Oz 命令](#warpoz-命令)\n - [任务归因报告](#任务归因报告)\n - [订阅使用量](#订阅使用量)\n - [示例输出](#示例输出--light-版本)\n - [配置](#配置)\n - [环境变量](#环境变量)\n- [前端可视化](#前端可视化)\n - [功能](#功能-1)\n - [运行前端](#运行前端)\n- [社交平台](#社交平台)\n - [功能](#功能-2)\n - [GitHub 个人资料嵌入小组件](#github-个人资料嵌入小组件)\n - [GitHub 个人资料徽章](#github-个人资料徽章)\n - [入门](#入门)\n - [数据验证](#数据验证)\n- [Wrapped 2025](#wrapped-2025)\n - [命令](#命令)\n - [包含内容](#包含内容)\n- [开发](#开发)\n - [先决条件](#先决条件-1)\n - [运行方法](#运行方法)\n- [支持的平台](#支持的平台)\n - [原生模块目标](#原生模块目标)\n - [Windows 支持](#windows-支持)\n- [会话数据保留](#会话数据保留)\n- [数据源](#数据源)\n- [定价](#定价)\n- [贡献](#贡献)\n - [开发指南](#开发指南)\n- [致谢](#致谢)\n- [许可证](#许可证)\n\n## 功能\n\n- **交互式 TUI 模式** - 由 Ratatui 驱动的精美终端 UI(默认模式)\n - 6 个交互式视图:概览、模型、每日、每时、统计、代理(可选的 Minutely 视图通过 `minutelyTabEnabled` 启用)\n - 键盘和鼠标导航\n - 支持可配置颜色主题的 GitHub 风格贡献图\n - 实时筛选和排序\n - 零闪烁渲染\n- **多平台支持** - 跟踪 OpenCode、Claude Code、Codex CLI、Copilot CLI、Cursor IDE、Gemini CLI、Amp、Codebuff、Droid、OpenClaw、Hermes Agent、Pi、Kimi CLI、Qwen CLI、Roo Code、Kilo、Mux、Kilo CLI、Crush、Goose、Antigravity、Antigravity CLI、Zed、Kiro、Trae、Warp/Oz、Cline、Gajae-Code、Grok Build、Jcode、MiMo Code、Command Code、Junie、ZCode、OpenCodeReview、CodeBuddy、WorkBuddy、Devin CLI、Devin Desktop 和 Synthetic 的使用情况\n- **实时定价** - 从 LiteLLM 获取当前价格,带 1 小时磁盘缓存;OpenRouter 自动回退和新模型的 Cursor 定价支持\n- **详细分解** - 输入、输出、缓存读写和推理 Token 跟踪\n- **原生 Rust 核心** - 所有解析和聚合在 Rust 中完成,处理速度提升 10 倍\n- **Web 可视化** - 带 2D 和 3D 视图的交互式贡献图\n- **灵活筛选** - 按平台、日期范围或年份筛选\n- **任务归因报告** - 由 LLM 驱动的会话摘要与任务分组,支持多种后端(Apple FM、Claude、Codex、Gemini、Kiro)\n- **导出为 JSON** - 为外部可视化工具生成数据\n- **社交平台** - 分享使用情况、排行榜竞争、查看公开个人资料\n\n## 安装\n\n### 快速开始\n\n```bash\n# 推荐:bunx\nbunx @token-stats/cli@latest\n\n# 或使用 npx\nnpx @token-stats/cli@latest\n\n# 轻量模式(仅表格渲染)\nbunx @token-stats/cli@latest --light\n```\n\n就这样!零配置即可获得完整的交互式 TUI 体验。\n\n> **包结构**:npm 入口为 `@token-stats/cli`(启动器 + 各平台可选原生二进制)。无 scope 的 `token-stats` 因与已有包 `tokenstats` 过于相似,无法在 npm 上发布。\n\n\n### 先决条件\n\n- [Node.js](https://nodejs.org/) 或 [Bun](https://bun.sh/)\n- (可选)从源码构建原生模块的 Rust 工具链\n\n### 开发环境设置\n\n本地开发或从源码构建:\n\n```bash\n# 克隆仓库\ngit clone https://github.com/Annihilater/token-stats.git\ncd token-stats\n\n# 安装 Bun(如果尚未安装)\ncurl -fsSL https://bun.sh/install | bash\n\n# 安装依赖\nbun install\n\n# 开发模式运行 CLI\nbun run cli\n```\n\n> **注意**:`bun run cli` 用于本地开发。通过 `bunx @token-stats/cli` 安装后,命令直接运行。下面的使用部分显示已安装的二进制命令。\n\n### 构建原生模块\n\n原生 Rust 模块是 CLI 操作**必需**的。它通过并行文件扫描和 SIMD JSON 解析提供约 10 倍的处理速度:\n\n```bash\n# 构建原生核心(从仓库根目录运行)\nbun run build:core\n```\n\n> **注意**:通过 `bunx @token-stats/cli@latest` 安装时,原生二进制文件已预构建并包含在内。仅在本地开发时才需要从源码构建。\n\n## 使用方法\n\n### 基本命令\n\n```bash\n# 启动交互式 TUI(默认)\ntoken-stats\n\n# 使用特定标签启动 TUI\ntoken-stats models # 模型标签\ntoken-stats monthly # 每日视图(显示每日分解)\n\n# 使用传统 CLI 表格输出\ntoken-stats --light\ntoken-stats models --light\n\n# 明确启动 TUI\ntoken-stats tui\n\n# 导出贡献图数据为 JSON\ntoken-stats graph --output data.json\n\n# 以 JSON 输出数据(用于脚本/自动化)\ntoken-stats --json # 默认模型视图为 JSON\ntoken-stats models --json # 模型分解为 JSON\ntoken-stats monthly --json # 月度分解为 JSON\ntoken-stats models --json > report.json # 保存到文件\n```\n\n### TUI 功能\n\n交互式 TUI 模式提供:\n\n- **8 个视图**:概览(图表 + 热门模型)、Usage(订阅配额)、模型、每日、每时、统计(贡献图)、代理。按分钟视图(Minutely)默认隐藏,可在 `settings.json` 中通过 `minutelyTabEnabled` 启用 —— 参见[配置](#配置)\n- **键盘导航**:\n - `←/→/Tab/BackTab`:切换视图\n - `↑/↓` 或 `Home/End`:导航列表\n - `Enter`:打开每日详情(Daily 标签)/ 选择图表单元格(Stats 标签)\n - `Esc` 或 `Backspace`:关闭对话框 / 退出详情视图\n - `c/d/t`:按成本/日期/Token 排序\n - `j`:跳转到今天\n - `s`:打开来源选择对话框\n - `g`:打开分组方式选择对话框(模型、客户端+模型、客户端+提供商+模型、工作区+模型、会话+模型、客户端+会话+模型)\n - `h`:切换日/时图表粒度(Overview 标签)\n - `v`:切换表格/Profile 视图(Hourly 标签)\n - `y`:复制选中行到剪贴板\n - `p`:循环颜色主题\n - `r`:刷新数据;`Shift+R` 切换自动刷新;`+`/`-` 调整间隔\n - `e`:导出为 JSON\n - `q` 或 `Ctrl+C`:退出\n- **鼠标支持**:点击标签、按钮和筛选器\n- **主题**:Green、Halloween、Teal、Blue、Pink、Purple、Orange、Monochrome、YlGnBu、Graphite、Lagoon、Dusk\n- **设置持久化**:偏好设置保存到 `~/.config/tokscale/settings.json`(参见[配置](#配置))\n\n### 分组策略\n\n在 TUI 中按 `g` 或在 `--light`/`--json` 模式下使用 `--group-by` 来控制模型行的聚合方式:\n\n| 策略 | 标志 | TUI 默认 | 效果 |\n|------|------|---------|------|\n| **模型** | `--group-by model` | ✅ | 每个模型一行 — 合并所有客户端和提供商 |\n| **客户端 + 模型** | `--group-by client,model` | | 每个客户端-模型对一行 |\n| **客户端 + 提供商 + 模型** | `--group-by client,provider,model` | | 最详细 — 不合并 |\n| **工作区 + 模型** | `--group-by workspace,model` | | 先按工作区键、再按模型对本地使用量分组 |\n| **会话 + 模型** | `--group-by session,model` | | 每个 `session_id` 和模型一行 — 将成本归因到特定的 agent-CLI 会话 |\n| **客户端 + 会话 + 模型** | `--group-by client,session,model` | | 每个客户端、会话和模型一行 — 适用于按 `session_id` 关联的多代理运行器 |\n\n**`--group-by model`**(最精简)\n\n| 客户端 | 提供商 | 模型 | 费用 |\n|--------|--------|------|------|\n| OpenCode, Claude, Amp | github-copilot, anthropic | claude-opus-4-5 | $2,424 |\n| OpenCode, Claude | anthropic, github-copilot | claude-sonnet-4-5 | $1,332 |\n\n**`--group-by client,model`**(CLI 默认)\n\n| 客户端 | 提供商 | 模型 | 费用 |\n|--------|--------|------|------|\n| OpenCode | github-copilot, anthropic | claude-opus-4-5 | $1,368 |\n| Claude | anthropic | claude-opus-4-5 | $970 |\n\n**`--group-by client,provider,model`**(最详细)\n\n| 客户端 | 提供商 | 模型 | 费用 |\n|--------|--------|------|------|\n| OpenCode | github-copilot | claude-opus-4-5 | $1,200 |\n| OpenCode | anthropic | claude-opus-4-5 | $168 |\n| Claude | anthropic | claude-opus-4-5 | $970 |\n\n**`--group-by session,model`**(按会话归因成本)\n\n`token-stats models --json --group-by session,model` 会为每个 `(session_id, model)` 输出一个条目。每个条目都包含顶层的 `sessionId` 字段,以便下游工具(例如多代理 IDE)能将成本数据关联回特定的 agent-CLI 会话:\n\n```json\n{\n \"groupBy\": \"session,model\",\n \"entries\": [\n {\n \"sessionId\": \"019e1e27-af49-7cd1-89b7-7bad1c3f3be2\",\n \"client\": \"codex\",\n \"provider\": \"openai\",\n \"model\": \"gpt-5\",\n \"input\": 25251,\n \"output\": 47,\n \"cacheRead\": 1920,\n \"cacheWrite\": 0,\n \"reasoning\": 40,\n \"messageCount\": 12,\n \"cost\": 0.0123\n }\n ]\n}\n```\n\n当你还需要每行都带有客户端名称时,请使用 `--group-by client,session,model`(一次涵盖全部 20+ 个受支持的 CLI)。\n\n### 按平台筛选\n\n使用 `--client`(短选项 `-c`)将报告范围限定为一个或多个客户端。该选项可重复使用,支持逗号分隔的值,并适用于所有报告命令:\n\n```bash\n# 仅显示 OpenCode 使用量\ntoken-stats --client opencode\n\n# 逗号分隔:同时筛选多个客户端\ntoken-stats --client opencode,claude\n\n# 重复使用:效果相同(与 shell 别名搭配使用很方便)\ntoken-stats -c opencode -c claude\n\n# Cursor IDE 需要先运行 `token-stats cursor login`\ntoken-stats --client cursor\n\n# Synthetic(synthetic.new)从其他 agent 会话中检测\ntoken-stats --client synthetic\n\n# 与其他筛选条件组合\ntoken-stats --client opencode,claude --week --json\n```\n\n可用值:`opencode`、`claude`、`codex`、`copilot`、`gemini`、`cursor`、`amp`、`codebuff`、`droid`、`openclaw`、`hermes`、`pi`、`kimi`、`qwen`、`roocode`、`kilocode`、`kilo`、`mux`、`crush`、`goose`、`antigravity`、`antigravity-cli`、`zed`、`kiro`、`trae`、`warp`、`cline`、`gjc`、`grok`、`jcode`、`micode`、`commandcode`、`junie`、`zcode`、`synthetic`。\n\n> **破坏性变更(v4.0.0)**:单客户端布尔选项(`--opencode`、`--claude`、`--codex` 等)已被移除,现在会直接报错。请改用规范的 `--client`/`-c` 选项——例如 `token-stats --client opencode,claude`。\n\n### 日期筛选\n\n日期筛选器适用于所有生成报告的命令(`token-stats`、`token-stats models`、`token-stats monthly`、`token-stats graph`):\n\n```bash\n# 快速日期快捷方式\ntoken-stats --today # 仅今天\ntoken-stats --yesterday # 仅昨天\ntoken-stats --week # 最近 7 天\ntoken-stats --month # 本月\n\n# 自定义日期范围(包含,本地时区)\ntoken-stats --since 2024-01-01 --until 2024-12-31\n\n# 按年份筛选\ntoken-stats --year 2024\n\n# 与其他选项组合\ntoken-stats models --week --client claude --json\ntoken-stats monthly --month --benchmark\n```\n\n> **注意**:日期筛选器使用本地时区。`--since` 和 `--until` 都是包含的。\n> **v2.2.0 说明**:会话活跃时间的每日分桶也使用本地时区;非 UTC 用户会看到活跃时间日期与本地 token/费用报告日期对齐,而不是 UTC 日边界。\n\n### 价格查询\n\n查询任何模型的实时价格:\n\n```bash\n# 查询模型价格\ntoken-stats pricing \"claude-3-5-sonnet-20241022\"\ntoken-stats pricing \"gpt-4o\"\ntoken-stats pricing \"grok-code\"\n\n# 强制指定提供商来源\ntoken-stats pricing \"grok-code\" --provider openrouter\ntoken-stats pricing \"claude-3-5-sonnet\" --provider litellm\n\n# 查看自定义价格覆盖\ntoken-stats pricing list-overrides\n```\n\n**查询策略:**\n\n价格查询使用多步解析策略:\n\n1. **自定义价格覆盖** - 来自 `~/.config/tokscale/custom-pricing.json` 的用户自定义精确条目\n2. **精确匹配** - 在 LiteLLM/OpenRouter 数据库中直接查找\n3. **别名解析** - 解析友好名称(例如:`big-pickle` → `glm-4.7`)\n4. **层级后缀剥离** - 移除质量层级(`gpt-5.2-xhigh` → `gpt-5.2`)\n5. **版本标准化** - 处理版本格式(`claude-3-5-sonnet` ↔ `claude-3.5-sonnet`)\n6. **提供商前缀匹配** - 尝试常见前缀(`anthropic/`、`openai/` 等)\n7. **Cursor 模型定价** - LiteLLM/OpenRouter 中尚未收录的模型的硬编码定价(例如:`gpt-5.3-codex`)\n8. **模糊匹配** - 部分模型名称的词边界匹配\n\n### 自定义价格覆盖\n\n在 Token Stats 的配置目录中创建 `custom-pricing.json`(macOS/Linux 上默认为 `~/.config/tokscale/custom-pricing.json`;若设置了 `TOKSCALE_CONFIG_DIR`,则为其解析出的同一目录),以覆盖上游价格数据库尚未正确收录的模型 ID 的价格。\n\n```json\n{\n \"$schema\": \"https://token-stats.com/custom-pricing.schema.json\",\n \"models\": {\n \"accounts/fireworks/routers/kimi-k2p6-turbo\": {\n \"input_cost_per_million_tokens\": 2.00,\n \"output_cost_per_million_tokens\": 8.00,\n \"cache_read_input_token_cost_per_million_tokens\": 0.30,\n \"source\": \"https://docs.fireworks.ai/serverless/pricing\",\n \"notes\": \"Fireworks Kimi K2.6 Turbo (preview)\"\n },\n \"accounts/fireworks/models/kimi-k2p6\": {\n \"input_cost_per_million_tokens\": 0.95,\n \"output_cost_per_million_tokens\": 4.00,\n \"cache_read_input_token_cost_per_million_tokens\": 0.16\n },\n \"kimi-k2p6-turbo\": {\n \"input_cost_per_million_tokens\": 2.00,\n \"output_cost_per_million_tokens\": 8.00\n }\n }\n}\n```\n\n覆盖价格以每百万 Token 的美元数输入,这与大多数 API 提供商公布价格的方式一致;Token Stats 会在内部将其转换为每 Token 的费率。`input_cost_per_million_tokens` 或 `output_cost_per_million_tokens` 中至少要有一个存在且为正值,缓存读取/缓存创建字段为可选。为兼容复制粘贴,也接受 LiteLLM 风格的每 Token 字段名,例如 `input_cost_per_token`、`output_cost_per_token` 和 `cache_read_input_token_cost`,但推荐面向用户使用每百万的命名形式。要省略某个层级或缓存价格,直接不写该字段即可;负值或非有限值会被视为无效,并跳过整个模型条目,以免拼写错误悄悄改变统计。可选的 `source` 和 `notes` 字段会被 Token Stats 忽略,可用于您自己的记账。\n\n覆盖是仅精确匹配且不区分大小写的。Token Stats 先检查原始模型 ID,再检查现有的合成 `/models/` 归一化,然后才在没有覆盖匹配时回退到 LiteLLM、OpenRouter、Cursor 定价和模糊匹配。原始精确匹配优先于归一化精确匹配,因此 `accounts/fireworks/routers/kimi-k2p6-turbo` 可以覆盖某个特定网关的模型,而 `kimi-k2p6-turbo` 可以覆盖归一化的 `/models/` 路径。覆盖在启动时仅加载一次;编辑文件后请重启命令。这是在等待上游 LiteLLM 价格更新期间,针对错误模型定价 Bug 的推荐本地修复方案。\n\n**提供商优先级:**\n\n当存在多个匹配时,原始模型创建者优先于经销商:\n\n| 优先(原创) | 次优先(经销商) |\n|---------------------|-------------------------|\n| `xai/`(Grok) | `azure_ai/` |\n| `anthropic/`(Claude) | `bedrock/` |\n| `openai/`(GPT) | `vertex_ai/` |\n| `google/`(Gemini) | `together_ai/` |\n| `meta-llama/` | `fireworks_ai/` |\n\n示例:`grok-code` 匹配 `xai/grok-code-fast-1`($0.20/$1.50)而非 `azure_ai/grok-code-fast-1`($3.50/$17.50)。\n\n### 社交平台命令\n\n```bash\n# 登录 Token Stats(打开浏览器进行 GitHub 认证)\ntoken-stats login\n\n# 无需浏览器认证即可保存已有的 Token Stats API token\ntoken-stats login --token tt_xxx\n\n# 查看当前登录用户\ntoken-stats whoami\n\n# 将已保存的 API token 显示为二维码(便于分享到另一台设备)\n# 编码内容为 {\"token\":\"tt_xxx\",\"username\":\"...\"} —— 可用任意二维码扫描器扫描\ntoken-stats qr\n\n# 提交使用量数据到排行榜\ntoken-stats submit\n\n# 在 CI/无头环境中提交,且不写入凭据\n# 优先级:TOKSCALE_API_TOKEN 环境变量 > 已保存的凭据文件(~/.config/tokscale/credentials.json)。\n# 设置了该环境变量时,本次调用会忽略已保存的文件。\nTOKSCALE_API_TOKEN=tt_xxx token-stats submit\n\n# 撤销 token:访问排行榜站点的 Settings > API Tokens\n#(https://token-stats.com/settings),点击对应 token 行的 \"Revoke\"。\n# 撤销立即生效 —— 之后使用该 token 的请求将收到 HTTP 401 \"Invalid API token\"。\n\n# 带筛选提交\ntoken-stats submit --client opencode,claude --since 2024-01-01\n\n# 预览将要提交的内容(试运行)\ntoken-stats submit --dry-run\n\n# 登出\ntoken-stats logout\n```\n\n<img alt=\"CLI Submit\" src=\"./.github/assets/cli-submit.png\" />\n\n### Autosubmit\n\nAutosubmit 通过操作系统的调度器来安排常规的 `token-stats submit` 流程。它可以让你无需手动运行终端命令即可保持公开资料的最新状态。\n\n```bash\n# 启用定期提交。macOS 使用 launchd,Linux 在可用时使用 systemd 用户定时器\n# (回退到 cron),Windows 使用 Windows 任务计划程序。\ntoken-stats autosubmit enable --interval 24h\n\n# 可以沿用与 submit 相同的客户端/日期筛选参数。\ntoken-stats autosubmit enable --interval 2h --client opencode,claude --week\n\n# 显示已保存的设置以及最近一次运行/错误。\ntoken-stats autosubmit status\ntoken-stats autosubmit status --json\n\n# 即使保存的间隔尚未到达,也立即运行一次。\ntoken-stats autosubmit run --force\n\n# 禁用 autosubmit 并移除调度器条目。\ntoken-stats autosubmit disable\n```\n\n计划任务的运行是非交互式的:它们不会提示 GitHub 认证或点星确认。请先运行一次 `token-stats login --token tt_xxx`,或在调度器环境中设置 `TOKSCALE_API_TOKEN`。Token Stats 会将调度器状态记录在 `settings.json` 中,将日志写入 `~/.config/tokscale/autosubmit/`,并使用锁文件确保调度器的多次触发不会重复提交。\n\n### Cursor IDE 命令\n\nCursor IDE 需要通过会话令牌进行单独认证(与社交平台登录不同):\n\n```bash\n# 登录 Cursor(需要从浏览器获取会话令牌)\n# --name 是可选的,用于之后区分账户的标签\ntoken-stats cursor login --name work\n\n# 检查 Cursor 认证状态和会话有效性\ntoken-stats cursor status\n\n# 列出已保存的 Cursor 账户\ntoken-stats cursor accounts\n\n# 切换活动账户(同步到 cursor-cache/usage.csv 的账户)\ntoken-stats cursor switch work\n\n# 登出指定账户(保留历史,但不再参与合并统计)\ntoken-stats cursor logout --name work\n\n# 登出并删除该账户的缓存\ntoken-stats cursor logout --name work --purge-cache\n\n# 登出所有 Cursor 账户(保留历史,但不再参与合并统计)\ntoken-stats cursor logout --all\n\n# 登出所有账户并删除缓存\ntoken-stats cursor logout --all --purge-cache\n```\n\n**凭据存储**:Cursor 账户保存到 `~/.config/tokscale/cursor-credentials.json`。使用量数据缓存在 `~/.config/tokscale/cursor-cache/`(活动账户使用 `usage.csv`,其他账户使用 `usage.<account>.csv`)。\n\n默认情况下,token-stats 会 **合并统计所有已保存 Cursor 账户的使用量**(`cursor-cache/usage*.csv`)。为保持兼容性,活动账户会同步到 `cursor-cache/usage.csv`。\n\n登出时,token-stats 会将缓存的历史记录移动到 `cursor-cache/archive/`(因此不会参与合并统计)。如需彻底删除缓存,请使用 `--purge-cache`。\n\n**获取 Cursor 会话令牌的方法:**\n1. 在浏览器中打开 https://www.cursor.com/settings\n2. 打开开发者工具(F12)\n3. **选项 A - Network 标签**:在页面上执行任何操作,找到对 `cursor.com/api/*` 的请求,在 Request Headers 中查看 `Cookie` 头,仅复制 `WorkosCursorSessionToken=` 后面的值\n4. **选项 B - Application 标签**:转到 Application → Cookies → `https://www.cursor.com`,找到 `WorkosCursorSessionToken` cookie,复制其值(不是 cookie 名称)\n\n> ⚠️ **安全警告**:像对待密码一样对待您的会话令牌。切勿公开分享或提交到版本控制。该令牌授予对您 Cursor 账户的完全访问权限。\n\n### Antigravity 命令\n\nAntigravity 同步目前仅在 macOS 和 Linux 上受支持。只有在启用了 Antigravity 的编辑器正在运行且本地语言服务器可用时才生效;token-stats 会从该本地语言服务器读取使用量,并将归一化后的产物缓存到本地。\n\n```bash\n# 检查 token-stats 是否能识别正在运行的 Antigravity 语言服务器\ntoken-stats antigravity status\n\n# 将本地 Antigravity 语言服务器中的使用量同步到 token-stats 的缓存\ntoken-stats antigravity sync\n\n# 删除已缓存的 Antigravity 产物\ntoken-stats antigravity purge-cache\n```\n\n**缓存位置**:`~/.config/tokscale/antigravity-cache/`\n\n**工作原理**:`token-stats antigravity sync` 会发现本地的 Antigravity 会话候选项,从本地语言服务器 RPC 获取已确认的使用数据,并以归一化的 JSONL 产物形式存储,供 the Token Stats core parser 后续解析。如果希望报告反映最新的 Antigravity 数据,请在生成报告前先运行同步。\n\n### Trae 命令\n\nTrae([ByteDance 的 AI IDE](https://www.trae.ai/))有两个国际版产品线 —— Trae IDE 和 Trae Solo。它们共享同一份账号级使用量数据(同后端、同 JWT),所以 token-stats 将其统一报告为一个 `trae` 客户端。装一个或两个都可以,token-stats 会自动从任何已安装的桌面端发现凭据。\n\n凭据通过 `--variant` 按桌面端区分:\n\n- **`--variant ide`** —— 来自 Trae IDE 的凭据(`~/Library/Application Support/Trae/`)\n- **`--variant solo`** —— 来自 Trae Solo 的凭据(`~/Library/Application Support/TRAE SOLO/`)\n\n`token-stats trae sync` 每次运行只调用一次官方的 `query_user_usage_group_by_session` API(无论安装了几个桌面端),并将原始 JSON 持久化到本地缓存。\n\n```bash\n# 登录(自动从任意已安装的 Trae 桌面客户端检测凭据)\ntoken-stats trae login\n\n# 手动输入 JWT(适用于无法自动找到 storage.json 的环境,\n# 例如 Linux/Windows 或无头服务器)。在浏览器打开\n# https://www.trae.ai/account-setting#usage,F12 → Network →\n# 过滤 `query_user_usage` → 复制 `Authorization` header 的值。\ntoken-stats trae login --manual --variant solo\n\n# 查看哪些变体已有缓存凭据\ntoken-stats trae status\n\n# 同步使用量(使用第一个可用的凭据来源)\ntoken-stats trae sync --since 30\n\n# 清除某个变体的缓存凭据\ntoken-stats trae logout --variant solo\n```\n\n**缓存位置**:`~/.config/tokscale/trae-cache/`\n\n**工作原理**:token-stats 会解密桌面客户端的 `iCubeAuthInfo://*` blob(`globalStorage/storage.json`)来恢复 JWT,或接受通过 `--manual` 粘贴的 JWT。随后它分页调用 `POST /trae/api/v1/pay/query_user_usage_group_by_session` 并保存原始 JSON。如果希望报告反映最新的 Trae 数据,请在生成报告前先运行同步。\n\n> **中国区版本**:中国区版本(`trae.com.cn`)目前有意不支持。CN 后端暂未暴露按会话查询使用量的官方 API;如果上游提供正式端点,再加入支持。\n\n### Warp/Oz 命令\n\nWarp/Oz 不提供本地 token 转录。Token Stats 仅同步 Warp GraphQL API 返回的汇总请求数和消费计数器,并将其以 `warp` / `aggregate-requests` 行(token 字段均为零)的形式上报。\n\n```bash\n# 保存从已认证的 Warp 请求中复制的 bearer token 或 Cookie 头\ntoken-stats warp login\n\n# 检查凭据/缓存状态和诊断信息\ntoken-stats warp status\n\n# 将汇总请求数和消费同步到 token-stats 本地缓存\ntoken-stats warp sync\n\n# 移除已保存的凭据;添加 --purge-cache 可同时删除已同步的使用数据\ntoken-stats warp logout --purge-cache\n```\n\n**缓存位置**:`~/.config/tokscale/warp-cache/usage.json`\n\n**工作原理**:`token-stats warp sync` 调用 Warp 已认证的 GraphQL API,获取账号和工作区的汇总计数器。Token Stats 将请求数保留为消息计数,将供应商上报的消费金额保留为成本,但不会将请求数转换为合成 token。由于公开排行榜只接受基于 token 归因的使用量,Warp 数据默认不包含在 `submit` 提交内容中。\n\n### 任务归因报告\n\n`report` 命令会生成按任务归因的使用量分解。它使用 LLM 将每个会话总结为一个简短的标题和类别,然后将相关会话归并为高层级的任务集群,从而鸟瞰你的 Token 都花在了哪里。\n\n```bash\n# 基本报告(今天,默认使用 Apple FM 摘要器)。LLM 摘要默认开启。\ntoken-stats report\n\n# 最近 7 天\ntoken-stats report --week\n\n# 使用 Claude Code 作为摘要器后端\ntoken-stats report --week --summarizer claude\n\n# 使用 Codex、Gemini 或 Kiro\ntoken-stats report --summarizer codex\ntoken-stats report --summarizer gemini\ntoken-stats report --summarizer kiro\n\n# 跳过 LLM 摘要(仅显示原始数据);这是退出(opt-out)选项\ntoken-stats report --no-summarize\n\n# 从头重新摘要(重置范围内已缓存的摘要)\ntoken-stats report --week --rebuild\n\n# 以 JSON 输出\ntoken-stats report --week --json\n\n# 按工作区或客户端筛选\ntoken-stats report --workspace my-project --client opencode\n```\n\n**摘要器后端:**\n\n| 后端 | 命令 | 说明 |\n|---------|---------|-------|\n| `apple-fm` | (默认) | 通过原生 Rust FFI 在本地使用 Apple Foundation Models(无需 Python)。已在预构建的 Apple Silicon(macOS arm64)二进制中启用,在开启 Apple Intelligence 的 macOS 26 及以上系统运行;在其他环境(Intel Mac、更旧的 macOS、Linux、Windows)则透明回退至内置 Rust 启发式分类器,因此默认配置可在所有平台正常使用。 |\n| `claude` | `claude -p` | 需要已安装并已认证的 Claude Code CLI。 |\n| `codex` | `codex --quiet` | 需要已安装并已认证的 Codex CLI。 |\n| `gemini` | `gemini -p` | 需要已安装并已认证的 Gemini CLI。 |\n| `kiro` | `kiro --non-interactive` | 需要已安装并已认证的 Kiro CLI。 |\n\n**工作原理:**\n\n1. 扫描会话并将其插入本地 SQLite wiki 数据库(`wiki.db`,位于平台配置目录——Linux 上为 `~/.config/tokscale/`,macOS 上为 `~/Library/Application Support/tokscale/`)\n2. 未摘要的会话分批发送到选定的 LLM 后端,后端为每个会话返回标题、类别、描述和复杂度\n3. 第二轮 LLM 处理将所有已加标题的会话归并为 3–8 个高层级任务集群(例如 \"Kiro Auth\"、\"Token Stats Report\"、\"System Config\")\n4. 结果缓存在 wiki 数据库中 —— 后续运行会跳过已摘要的会话\n\n**示例输出:**\n\n```\n Task Group Sess Tokens Cost\n ───────────────────────────────────────────────────────────────────────\n Token Stats Development 19 4.2B $22.66\n Add task-attributed report command\n Implement wiki DB schema\n Fix pricing lookup for new models\n System Config 28 2.1B $10.06\n Configure OpenCode workspace settings\n Update shell aliases\n Kiro Auth 4 890.5M $3.10\n Implement JWT refresh flow\n```\n\n### 订阅使用量\n\nToken Stats 可以获取并显示您在各 AI 提供商上的实时订阅配额。它会显示您已使用了多少套餐额度,以及限额何时重置。\n\n```bash\n# 显示所有已检测到提供商的订阅使用量\ntoken-stats usage\n\n# 以 JSON 输出(用于脚本)\ntoken-stats usage --json\n\n# 轻量终端输出(无 TUI)\ntoken-stats usage --light\n```\n\n在 TUI 中,切换到 **Usage** 标签即可查看订阅数据。使用 `[Refresh]` 刷新订阅配额。键盘刷新快捷键 `r` 使用相同的刷新路径。\n\n> **注意**:订阅配额和余额均为**供应商上报**——token-stats 调用每个提供商自己的配额端点,并原样呈现其返回结果。这些数字反映的是提供商上报的值(也就是其官方仪表板上显示的值),并未与 token-stats 自身的使用量跟踪进行独立核对。\n\n#### 支持的提供商\n\n| 提供商 | 认证方式 | 指标 | 设置 |\n|----------|-------------|---------|-------|\n| **Claude** | OAuth(凭据文件或 macOS 钥匙串) | Session(5 小时)、Weekly、Opus 配额 | 运行 `claude` 登录 |\n| **Codex**(OpenAI) | OAuth(`~/.config/codex/auth.json`、`~/.codex/auth.json`,或已保存的 Token Stats 账号) | Session、Weekly 配额 | 在 TUI Usage 标签中使用 `[Add Codex]`,运行 `codex` 登录,或用 `token-stats codex import --name work` 导入现有认证 |\n| **Z.ai** | API key(环境变量) | Token 限额、Web Searches | 设置 `ZAI_API_KEY` 或 `GLM_API_KEY` |\n| **Amp** | API key(`~/.local/share/amp/secrets.json`) | 免费额度余额、Credits | 运行 `amp` 登录 |\n| **GitHub Copilot** | GitHub token(钥匙串或 `~/.config/gh/hosts.yml`) | Premium interactions、Chat 配额 | 运行 `gh auth login` |\n| **Grok Build** | OAuth(`~/.grok/auth.json`) | Credits、订阅套餐 | 运行 `grok login` |\n| **Kimi** | OAuth(`~/.kimi/credentials/kimi-code.json`) | Session、Weekly 配额 | 运行 `kimi` 登录 |\n| **MiniMax** | API key(环境变量) | 各模型的 Prompt 配额 | 设置 `MINIMAX_API_KEY` 或 `MINIMAX_API_TOKEN` |\n| **MiniMax Token Plan** | API key(环境变量) | 区间 + 每周剩余百分比配额(按区域:CN minimaxi.com + Global minimax.io) | 设置 `MINIMAX_TOKEN_PLAN_CN_KEY` 和/或 `MINIMAX_TOKEN_PLAN_GLOBAL_KEY` |\n| **Sakana**(Fugu) | 会话 cookie(环境变量或文件)—— 计费控制台 HTML 抓取,无公开 API | 5 小时、Weekly 配额窗口(套餐等级 + 月度价格作为元数据) | 设置 `SAKANA_SESSION_COOKIE`(参见 [docs/providers/sakana.md](docs/providers/sakana.md)) |\n\n提供商会被自动检测——仅显示具有有效凭据的提供商。如果缺少某个提供商,请确认您已登录或设置了所需的环境变量。\n\n#### Codex 多账号使用量\n\nToken Stats 可以保存多个 Codex OAuth 账号用于订阅使用量显示。TUI Usage 标签会将已保存的账号归并到一个 **Codex** 区块下。活动账号以 `*` 标记;非活动账号可通过 `[Use]` 选中;移除账号使用 `[Remove]` 后接 `[Confirm]`。\n\n要在不离开 TUI 的情况下添加账号,请在 Usage 标签中点击 `[Add Codex]`。Token Stats 会用一个临时的 `CODEX_HOME` 启动 `codex login`,在 Usage 标签中显示登录输出,将生成的认证导入 Token Stats 的账号存储,然后刷新使用量。这样可保持登录隔离,且不会切换当前的 Codex 认证;当您希望 Token Stats 将某个已保存账号写入真正的 Codex 认证文件时,点击该账号上的 `[Use]`。\n\nCLI 命令仍然可用于脚本化或手动的账号管理:\n\n```bash\n# 将当前 Codex 认证保存为命名的 Token Stats 账号\ntoken-stats codex import --name work\n\n# 列出已保存的 Codex 账号\ntoken-stats codex accounts\ntoken-stats codex accounts --json\n\n# 切换活动 Codex 账号并写入 Codex auth.json\ntoken-stats codex switch work\n\n# 停止跟踪某个已保存的 Codex 账号(仅从 Token Stats 的存储中移除——\n# codex CLI 自身的 auth.json/登录状态永远不会被改动)\ntoken-stats codex remove personal\n\n# 检查活动账号或指定账号的订阅使用量\ntoken-stats codex status\ntoken-stats codex status --name personal --json\n```\n\n当存在已保存的 Codex 账号时,`token-stats usage --json` 会为每个 Codex 条目包含结构化的账号元数据,TUI 会将这些条目显示在一个 Codex 分组下。若无已保存的账号,Token Stats 会回退到当前的 Codex 认证发现路径(`CODEX_HOME/auth.json`、`~/.config/codex/auth.json`、`~/.codex/auth.json`,然后是 macOS 钥匙串)。\n\n#### 示例输出\n\n```\n╭──────────────────────────────────────────────────────────╮\n│ Session 85% left [=========---] resets in 2h 15m │\n│ Weekly 72% left [========----] resets Fri 3pm │\n│ Plan Max 20x │\n╰──────────────────────────────────────────────────────────╯\n╭──────────────────────────────────────────────────────────╮\n│ Session 40% left [=====-------] resets in 4h 30m │\n│ Weekly 90% left [==========--] resets Mon 12am │\n│ Account user@example.com │\n│ Plan Pro │\n╰──────────────────────────────────────────────────────────╯\n```\n\n### 示例输出(`--light` 版本)\n\n<img alt=\"CLI Light\" src=\"./.github/assets/cli-light.png\" />\n\n### 配置\n\nToken Stats 将设置存储在 `~/.config/tokscale/settings.json`:\n\n```json\n{\n \"colorPalette\": \"blue\",\n \"includeUnusedModels\": false,\n \"defaultClients\": [\"opencode\", \"claude\"],\n \"scanner\": {\n \"extraScanPaths\": {\n \"codex\": [\n \"/Users/me/workspace/project-a/.codex/sessions\",\n \"/Users/me/workspace/project-b/.codex/archived_sessions\"\n ],\n \"hermes\": [\n \"/Users/me/.hermes/profiles/director_planning\",\n \"/Users/me/.hermes/profiles/research/state.db\"\n ]\n }\n }\n}\n```\n\n| 设置 | 类型 | 默认值 | 描述 |\n|---------|------|---------|-------------|\n| `colorPalette` | string | `\"blue\"` | TUI 颜色主题(green、halloween、teal、blue、pink、purple、orange、monochrome、ylgnbu、graphite、lagoon、dusk) |\n| `includeUnusedModels` | boolean | `false` | 在报告中显示零 Token 的模型 |\n| `autoRefreshEnabled` | boolean | `false` | 在 TUI 中启用自动刷新 |\n| `autoRefreshMs` | number | `60000` | 自动刷新间隔(30000-3600000ms) |\n| `nativeTimeoutMs` | number | `300000` | 原生子进程处理最大时间(5000-3600000ms) |\n| `defaultClients` | string[] | `[]` | 未传递 `--client/-c` 选项时应用的客户端筛选。接受与 `--client` 相同的 ID(例如 `[\"opencode\", \"claude\", \"synthetic\"]`)。未知 ID 会被静默丢弃。命令行选项会完全覆盖此列表 — 不会合并。 |\n| `light.writeCache` | boolean | `false` | 为 `true` 时,`token-stats --light` 会在渲染完成后以原子方式覆盖 TUI 缓存。CLI 标志 `--write-cache` / `--no-write-cache` 会按次运行覆盖该设置。 |\n| `minutelyTabEnabled` | boolean | `false` | 在 TUI 中显示按分钟的 Minutely 标签,并在数据加载期间执行分钟级聚合。对大多数用户而言,分钟级粒度是较为小众的诊断视图,而在大数据集上分钟分桶有非平凡的代价,因此默认关闭。 |\n| `scanner.extraScanPaths` | object | `{}` | 针对 Token Stats 默认 home 根位置之外的会话,为各客户端额外指定的扫描根目录 |\n\n使用 `scanner.extraScanPaths` 配置持久化的额外根目录,例如项目级的 `.codex` 目录或导入的 Gemini/OpenClaw 历史。Token Stats 会自动发现 `$HERMES_HOME/profiles/*/state.db` 下的 Hermes 配置文件数据库(未设置 `HERMES_HOME` 时为 `~/.hermes/profiles/*/state.db`)。仅对非标准的 Hermes 配置文件位置使用 `scanner.extraScanPaths.hermes`;Hermes 条目既可以指向包含 `state.db` 的配置文件目录,也可以直接指向 `state.db` 文件。Token Stats 在每次运行时都会将这些路径与默认扫描根目录合并,并按规范路径去重重叠的根目录。\n\n使用 `defaultClients` 固定一个个人默认值 —— 例如,如果您只使用 OpenCode 和 Claude,就将其设为 `[\"opencode\", \"claude\"]`,那么 `token-stats`(不带任何选项)会自动将每个报告的范围限定为它们。在命令行传入 `--client` 可针对单次运行进行覆盖。\n\n#### 启用 Minutely 标签\n\nMinutely 标签按分钟显示 Token 使用情况,最适合用于诊断突发模式、调试单个会话,或与 `autoRefreshEnabled` 配合进行近实时监控。分钟级聚合在数据加载期间会遍历所有已解析的消息,对大多数用户来说带来不必要的 RAM 与 CPU 开销。因此默认情况下它是隐藏的。\n\n要启用它,请在 `~/.config/tokscale/settings.json` 中将 `minutelyTabEnabled` 设为 `true`:\n\n```json\n{\n \"minutelyTabEnabled\": true\n}\n```\n\n重启后,Minutely 标签将出现在标签栏中 Hourly 与 Stats 之间,Tab / BackTab / Left / Right 导航将会在其间循环。把该标志再设为 `false` 可隐藏标签并再次跳过聚合。\n\n#### 缓存目录布局\n\n可再生成的 CLI/TUI/价格/Wrapped 缓存位于 `~/.config/tokscale/cache/` 下(如果设置了 `TOKSCALE_CONFIG_DIR`,则为 `${TOKSCALE_CONFIG_DIR}/cache/`)。集成同步产物保留在各自的客户端缓存目录中,例如 `~/.config/tokscale/antigravity-cache/` 和 `~/.config/tokscale/trae-cache/`:\n\n- `tui-data-cache.json` —— TUI 启动缓存\n- `source-message-cache-v2/` + `source-message-cache.lock` —— 分片源消息缓存与锁文件\n- `pricing-litellm.json` / `pricing-openrouter.json` —— 定价缓存\n- `opencode-migration.json` —— OpenCode 迁移记录\n- `fonts/`、`images/` —— Wrapped 资源缓存\n\n删除该目录是安全的。Token Stats 会在需要时重新创建并重新生成其中的内容。\n\n### 环境变量\n\n环境变量会覆盖配置文件中的值。适用于 CI/CD 或一次性使用:\n\n| 变量 | 默认值 | 描述 |\n|----------|---------|-------------|\n| `TOKSCALE_NATIVE_TIMEOUT_MS` | `300000`(5 分钟) | 覆盖 `nativeTimeoutMs` 配置 |\n| `TOKSCALE_API_TOKEN` | unset | 用于非交互式 `submit` 和 `delete-submitted-data` 运行的 Token Stats 个人 API token。可从 Settings > API Tokens 创建一个,或用 `token-stats login --token tt_xxx` 保存到本地。 |\n| `TOKSCALE_EXTRA_DIRS` | unset | 一次性的额外会话根目录,格式为 `client:/abs/path,client:/abs/path` |\n| `TOKSCALE_CONFIG_DIR` | unset | 覆盖配置目录根(`settings.json`、`star-cache.json`、`cache/`、`antigravity-cache/`、`trae-cache/` 的存放位置)。建议使用绝对路径;相对路径将基于进程 CWD 解析。适用于 CI 沙箱或固定到非默认位置。设置后,token-stats 不会回退到 macOS 旧路径(`~/Library/Application Support/tokscale/`)。 |\n| `TOKSCALE_FM_DEBUG` | unset | 设置后,会将 Apple Foundation Models 的诊断信息(macOS 版本门槛、dlopen dylib 路径、加载/符号错误)打印到 stderr,以说明本机端 apple-fm 为何启用或未启用。 |\n\n```bash\n# 示例:为非常大的数据集增加超时时间\nTOKSCALE_NATIVE_TIMEOUT_MS=600000 token-stats graph --output data.json\n\n# 示例:一次性的额外扫描根目录\nTOKSCALE_EXTRA_DIRS='codex:/Users/me/workspace/project-a/.codex/sessions,gemini:/Users/me/imports/imac/gemini/tmp' token-stats\n\n# 示例:在 CI 中提交,无需交互式浏览器登录\nTOKSCALE_API_TOKEN=tt_xxx token-stats submit\n```\n\n> **注意**:对于持久化的额外根目录,建议在 `~/.config/tokscale/settings.json` 中使用 `scanner.extraScanPaths`。`TOKSCALE_EXTRA_DIRS` 最适合一次性覆盖或 CI/CD。\n\n### Headless 模式\n\nToken Stats 可以聚合来自 **Codex CLI 无头输出**的令牌使用情况,用于自动化、CI/CD 流水线和批处理。\n\n**什么是 Headless 模式?**\n\n当您使用 JSON 输出标志运行 Codex CLI 时(例如 \\`codex exec --json\\`),它会将使用数据输出到 stdout,而不是存储在常规会话目录中。Headless 模式允许您捕获和跟踪这些使用情况。\n\n**存储位置:** \\`~/.config/tokscale/headless/\\`\n\n在 macOS 上,当未设置 \\`TOKSCALE_HEADLESS_DIR\\` 时,Token Stats 也会扫描 \\`~/Library/Application Support/tokscale/headless/\\`。\n\nToken Stats 会自动扫描此目录结构:\n```\n~/.config/tokscale/headless/\n└── codex/ # Codex CLI JSONL 输出\n```\n\n**环境变量:** 设置 \\`TOKSCALE_HEADLESS_DIR\\` 以自定义无头日志目录:\n```bash\nexport TOKSCALE_HEADLESS_DIR=\"$HOME/my-custom-logs\"\n```\n\n**推荐(自动捕获):**\n\n| 工具 | 命令示例 |\n|------|----------|\n| **Codex CLI** | \\`token-stats headless codex exec -m gpt-5 \"implement feature\"\\` |\n\n**手动重定向(可选):**\n\n| 工具 | 命令示例 |\n|------|----------|\n| **Codex CLI** | \\`codex exec --json \"implement feature\" > ~/.config/tokscale/headless/codex/ci-run.jsonl\\` |\n\n**诊断:**\n\n```bash\n# 显示扫描位置和无头计数\ntoken-stats sources\ntoken-stats sources --json\n```\n\n**CI/CD 集成示例:**\n\n```bash\n# 在 GitHub Actions 工作流中\n- name: Run AI automation\n run: |\n mkdir -p ~/.config/tokscale/headless/codex\n codex exec --json \"review code changes\" \\\\\n > ~/.config/tokscale/headless/codex/pr-\\${{ github.event.pull_request.number }}.jsonl\n\n# 稍后跟踪使用情况\n- name: Report token usage\n run: token-stats --json\n```\n\n> **注意**:无头捕获仅支持 Codex CLI。如果直接运行 Codex,必须如上所示将 stdout 重定向到 headless 目录。\n\n## 前端可视化\n\n前端提供 GitHub 风格的贡献图可视化:\n\n### 功能\n\n- **2D 视图**:经典 GitHub 贡献日历\n- **3D 视图**:基于 Token 使用量高度的等距 3D 贡献图\n- **多种颜色调色板**:GitHub、GitLab、Halloween、Winter 等\n- **三态主题切换**:Light / Dark / System(跟随系统设置)\n- **GitHub Primer 设计**:使用 GitHub 官方颜色系统\n- **交互式提示**:悬停查看详细的每日分解\n- **每日分解面板**:点击查看每个来源和模型的详情\n- **年份筛选**:在年份之间导航\n- **来源筛选**:按平台筛选(OpenCode、Claude、Codex、Copilot、Cursor、Gemini、Amp、Codebuff、Droid、OpenClaw、Hermes Agent、Pi、Kimi、Qwen、Roo Code、Kilo、Mux、Kilo CLI、Crush、Goose、Antigravity、Antigravity CLI、Zed、Kiro、Trae、Warp、Cline、Gajae-Code、Grok Build、Jcode、MiMo Code、Command Code、Junie、ZCode、Synthetic)\n- **统计面板**:总成本、Token、活跃天数、连续记录\n- **FOUC 防护**:在 React 水合前应用主题(无闪烁)\n\n### 运行前端\n\n```bash\ncd packages/frontend\nbun install\nbun run dev\n```\n\n打开 [http://localhost:3000](http://localhost:3000) 访问社交平台。\n\n## 社交平台\n\nToken Stats 包含一个社交平台,您可以在其中分享使用数据并与其他开发者竞争。\n\n### 功能\n\n- **排行榜** - 查看所有平台上使用最多 Token 的人\n- **用户资料** - 带贡献图和统计的公开资料\n- **时间段筛选** - 查看所有时间、本月或本周的统计\n- **GitHub 集成** - 使用 GitHub 账户登录\n- **本地查看器** - 无需提交即可私密查看数据\n\n### GitHub 个人资料嵌入小组件\n\n您可以直接在 GitHub 个人资料 README 中嵌入 Token Stats 公开统计数据:\n\n```md\n[![Token Stats Stats](https://token-stats.com/api/embed/<username>/svg)](https://token-stats.com/u/<username>)\n```\n\n将 `<username>` 替换为您的 GitHub 用户名。不带任何查询参数时,渲染默认的 `classic` 卡片;追加下面的任意参数即可自定义设计。\n\n| 参数 | 取值 | 效果 |\n| --- | --- | --- |\n| `template` | `classic`(默认)· `minimal` · `terminal` · `graph` · `orbit` · `vitals` · `blueprint` · `receipt` | 卡片设计 |\n| `color` | `blue` · `green` · `teal` · `purple` · `pink` · `orange` · `monochrome` · `halloween` · `YlGnBu` | 强调色和贡献图配色 |\n| `theme` | `dark`(默认)· `light` | 浅色或深色卡片 |\n| `sort` | `tokens`(默认)· `cost` | 排名取自哪个排行榜 |\n| `tokens`、`cost` | `compact` · `full` | 数字格式,可分别设置 —— `20.9B` 对比 `20,941,000,000` |\n| `rank` | `plain`(默认,`#134`)· `percent`(`top 12%`)· `total`(`#134 / 1,174`) | 排行榜名次的显示方式 |\n| `graph` | `1` 表示追加贡献图(默认关闭) | `classic`、`minimal`、`terminal`、`orbit`、`blueprint`、`receipt` 支持 |\n| `compact` | `1` 表示紧凑布局 | 仅 `classic` |\n\n示例:\n\n```md\n![](https://token-stats.com/api/embed/<username>/svg?template=minimal&color=purple&graph=1)\n![](https://token-stats.com/api/embed/<username>/svg?template=orbit&color=pink&rank=percent)\n![](https://token-stats.com/api/embed/<username>/svg?template=terminal&color=green&theme=light)\n![](https://token-stats.com/api/embed/<username>/svg?template=receipt&color=YlGnBu&graph=1)\n```\n\n### GitHub 个人资料徽章\n\n您还可以使用 shields.io 风格的更紧凑的徽章:\n\n```md\n![Token Stats Tokens](https://token-stats.com/api/badge/<username>/svg)\n```\n\n- 将 `<username>` 替换为您的 GitHub 用户名\n- 可选查询参数:\n - `metric=tokens`(默认)、`metric=cost` 或 `metric=rank`\n - `style=flat`(默认)或 `style=flat-square`\n - `sort=tokens`(默认)或 `sort=cost` 控制排名依据\n - `compact=1` 使用紧凑数字表示(例如 `1.2M`、`$3.4K`)\n - `label=<文本>` 自定义左侧标签\n - `color=<hex>` 自定义右侧背景颜色(例如 `color=ff5733`)\n- 示例:\n - `https://token-stats.com/api/badge/<username>/svg?metric=cost&compact=1`\n - `https://token-stats.com/api/badge/<username>/svg?metric=rank&sort=cost&style=flat-square`\n\n### 入门\n\n1. **登录** - 运行 `token-stats login` 通过 GitHub 认证,或在 Settings 中创建一个 API token 供 CI/无头环境使用\n2. **提交** - 运行 `token-stats submit` 上传使用数据\n3. **查看** - 访问 Web 平台查看您的资料和排行榜\n\n### 数据验证\n\n提交的数据经过一级验证:\n- 数学一致性(总计匹配,无负值)\n- 无未来日期\n- 必填字段存在\n- 重复检测\n\n## Wrapped 2025\n\n![Wrapped 2025](.github/assets/hero-wrapped-2025.png)\n\n生成一张精美的年度回顾图片,总结您的 AI 编程助手使用情况——灵感来自 Spotify Wrapped。\n\n| `bunx @token-stats/cli@latest wrapped` | `bunx @token-stats/cli@latest wrapped --clients` | `bunx @token-stats/cli@latest wrapped --agents --disable-pinned` |\n|:---:|:---:|:---:|\n| ![Wrapped 2025 (Agents + Pin Sisyphus)](.github/assets/wrapped-2025-agents.png) | ![Wrapped 2025 (Clients)](.github/assets/wrapped-2025-clients.png) | ![Wrapped 2025 (Agents + Disable Pinned)](.github/assets/wrapped-2025-agents-disable-pinned.png) |\n\n### 命令\n\n```bash\n# 生成当前年份的 Wrapped 图片\ntoken-stats wrapped\n\n# 生成指定年份的 Wrapped 图片\ntoken-stats wrapped --year 2025\n```\n\n### 包含内容\n\n生成的图片包括:\n\n- **总 Token 数** - 您当年的总 Token 消耗量\n- **热门模型** - 按成本排名的前 3 个最常用 AI 模型\n- **热门客户端** - 前 3 个最常用平台(OpenCode、Claude Code、Cursor 等)\n- **消息数** - AI 交互总数\n- **活跃天数** - 至少有一次 AI 交互的天数\n- **成本** - 基于 LiteLLM 定价的估计总成本\n- **连续记录** - 最长连续活跃天数\n- **贡献图** - 年度活动的可视化热力图\n\n生成的 PNG 已针对社交媒体分享进行优化。与社区分享您的编程之旅!\n\n## 开发\n\n> **快速设置**:如果您只想快速开始,请参阅上面安装部分的[开发环境设置](#开发环境设置)。\n\n### 先决条件\n\n```bash\n# Bun(必需)\nbun --version\n\n# Rust(用于原生模块)\nrustc --version\ncargo --version\n```\n\n### 运行方法\n\n按照[开发环境设置](#开发环境设置)后,您可以:\n\n```bash\n# 构建原生模块(可选但推荐)\nbun run build:core\n\n# 以开发模式运行(启动 TUI)\ncd packages/cli && bun src/index.ts\n\n# 或使用传统 CLI 模式\ncd packages/cli && bun src/index.ts --light\n```\n\n<details>\n<summary>高级开发</summary>\n\n### 项目脚本\n\n| 脚本 | 描述 |\n|--------|-------------|\n| `bun run cli` | 开发模式运行 CLI(使用 Bun 的 TUI) |\n| `bun run build:core` | 构建原生 Rust 模块(发布版) |\n| `bun run build:cli` | 将 CLI TypeScript 构建到 dist/ |\n| `bun run build` | 同时构建 core 和 CLI |\n| `bun run dev:frontend` | 运行前端开发服务器 |\n\n**特定包脚本**(从包目录内):\n- `packages/cli`:`bun run dev`、`bun run tui`\n- `packages/core`:`bun run build:debug`、`bun run test`、`bun run bench`\n\n**注意**:此项目使用 **Bun** 作为开发时的包管理器。\n\n### 测试\n\n```bash\n# 测试原生模块(Rust)\ncd packages/core\nbun run test:rust # Cargo 测试\nbun run test # Node.js 集成测试\nbun run test:all # 两者都\n```\n\n### 原生模块开发\n\n```bash\ncd packages/core\n\n# 调试模式构建(编译更快)\nbun run build:debug\n\n# 发布模式构建(优化版)\nbun run build\n\n# 运行 Rust 基准测试\nbun run bench\n```\n\n### 图表命令选项\n\n```bash\n# 导出图表数据到文件\ntoken-stats graph --output usage-data.json\n\n# 日期筛选(所有快捷方式都有效)\ntoken-stats graph --today\ntoken-stats graph --week\ntoken-stats graph --since 2024-01-01 --until 2024-12-31\ntoken-stats graph --year 2024\n\n# 按平台筛选\ntoken-stats graph --client opencode,claude\n\n# 显示处理时间基准\ntoken-stats graph --output data.json --benchmark\n```\n\n### 基准测试标志\n\n显示处理时间以进行性能分析:\n\n```bash\ntoken-stats --benchmark # 显示默认视图的处理时间\ntoken-stats models --benchmark # 基准测试模型报告\ntoken-stats monthly --benchmark # 基准测试月度报告\ntoken-stats graph --benchmark # 基准测试图表生成\n```\n\n### 为前端生成数据\n\n```bash\n# 导出可视化数据\ntoken-stats graph --output packages/frontend/public/my-data.json\n```\n\n### 性能\n\n原生 Rust 模块提供显著的性能提升:\n\n| 操作 | TypeScript | Rust 原生 | 加速 |\n|-----------|------------|-------------|---------|\n| 文件发现 | ~500ms | ~50ms | **10 倍** |\n| JSON 解析 | ~800ms | ~100ms | **8 倍** |\n| 聚合 | ~200ms | ~25ms | **8 倍** |\n| **总计** | **~1.5 秒** | **~175ms** | **~8.5 倍** |\n\n*约 1000 个会话文件、100k 消息的基准测试*\n\n#### 内存优化\n\n原生模块还通过以下方式提供约 45% 的内存减少:\n\n- 流式 JSON 解析(无完整文件缓冲)\n- 零拷贝字符串处理\n- 使用 map-reduce 的高效并行聚合\n\n#### 运行基准测试\n\n```bash\n# 生成合成数据\ncd packages/benchmarks && bun run generate\n\n# 运行 Rust 基准测试\ncd packages/core && bun run bench\n```\n\n</details>\n\n## 支持的平台\n\n### 原生模块目标\n\n| 平台 | 架构 |\n|----------|--------------|\n| macOS | x86_64 |\n| macOS | aarch64(Apple Silicon) |\n| Linux | x86_64(glibc) |\n| Linux | aarch64(glibc) |\n| Linux | x86_64(musl) |\n| Linux | aarch64(musl) |\n| Windows | x86_64 |\n| Windows | aarch64 |\n\n### Windows 支持\n\nToken Stats 完全支持 Windows。TUI 和 CLI 的工作方式与 macOS/Linux 相同。\n\n**Windows 安装:**\n```powershell\n# 安装 Bun(PowerShell)\npowershell -c \"irm bun.sh/install.ps1 | iex\"\n\n# 运行 token-stats\nbunx @token-stats/cli@latest\n```\n\n#### Windows 上的数据位置\n\nAI 编程工具将会话数据存储在跨平台位置。大多数工具在所有平台上使用相同的相对路径:\n\n| 工具 | Unix 路径 | Windows 路径 | 来源 |\n|------|-----------|--------------|--------|\n| OpenCode | `~/.local/share/opencode/` | `%USERPROFILE%\\.local\\share\\opencode\\` | 使用 [`xdg-basedir`](https://github.com/sindresorhus/xdg-basedir) 实现跨平台一致性([源码](https://github.com/sst/opencode/blob/main/packages/opencode/src/global/index.ts)) |\n| Claude Code | `~/.claude/` | `%USERPROFILE%\\.claude\\` | 所有平台使用相同路径 |\n| OpenClaw | `~/.openclaw/` (+ 旧版: `.clawdbot`, `.moltbot`, `.moldbot`) | `%USERPROFILE%\\.openclaw\\` (+ 旧版路径) | 所有平台使用相同路径 |\n| Codex CLI | `~/.codex/` | `%USERPROFILE%\\.codex\\` | 可通过 `CODEX_HOME` 环境变量配置([源码](https://github.com/openai/codex)) |\n| Copilot CLI | `~/.copilot/otel/` | `%USERPROFILE%\\.copilot\\otel\\` | 需要 OTEL 文件导出;同时自动采集 `COPILOT_OTEL_FILE_EXPORTER_PATH` |\n| Hermes Agent | `~/.hermes/` | `%USERPROFILE%\\.hermes\\` | 可通过 `HERMES_HOME` 环境变量配置([源码](https://github.com/NousResearch/hermes-agent/blob/main/website/docs/developer-guide/session-storage.md)) |\n| Gemini CLI | `~/.gemini/` | `%USERPROFILE%\\.gemini\\` | 可通过 `GEMINI_CLI_HOME` 环境变量配置 |\n| Amp | `~/.local/share/amp/` | `%USERPROFILE%\\.local\\share\\amp\\` | 与 OpenCode 一样使用 `xdg-basedir` |\n| Cursor | API 同步 | API 同步 | 通过 API 获取数据,缓存在 `%USERPROFILE%\\.config\\tokscale\\cursor-cache\\` |\n| Droid | `~/.factory/` | `%USERPROFILE%\\.factory\\` | 所有平台使用相同路径 |\n| Pi | `~/.pi/` and `~/.omp/` | `%USERPROFILE%\\.pi\\` and `%USERPROFILE%\\.omp\\` | 所有平台使用相同路径(支持 Pi 和 [Oh My Pi](https://github.com/can1357/oh-my-pi)) |\n| Kimi CLI | `~/.kimi/` | `%USERPROFILE%\\.kimi\\` | 所有平台使用相同路径 |\n| Kimi Code | `~/.kimi-code/` | `%USERPROFILE%\\.kimi-code\\` | 所有平台使用相同路径 |\n| Qwen CLI | `~/.qwen/` | `%USERPROFILE%\\.qwen\\` | 所有平台使用相同路径 |\n| Roo Code | `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/` | `%USERPROFILE%\\.config\\Code\\User\\globalStorage\\rooveterinaryinc.roo-cline\\tasks\\` | VS Code globalStorage 任务日志 |\n| Kilo | `~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/` | `%USERPROFILE%\\.config\\Code\\User\\globalStorage\\kilocode.kilo-code\\tasks\\` | VS Code globalStorage 任务日志 |\n| Cline | Linux: `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/`;macOS: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/`;server: `~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/` | `%APPDATA%\\Code\\User\\globalStorage\\saoudrizwan.claude-dev\\tasks\\` | VS Code globalStorage 任务日志 |\n| Mux | `~/.mux/sessions/` | `%USERPROFILE%\\.mux\\sessions\\` | 所有平台相同路径 |\n| Codebuff | `~/.config/manicode/projects/`(+ `manicode-dev`、`manicode-staging`) | `%USERPROFILE%\\.config\\manicode\\projects\\` | 通过 `CODEBUFF_DATA_DIR` 环境变量覆盖 |\n| Kilo CLI | `~/.local/share/kilo/` | `%USERPROFILE%\\.local\\share\\kilo\\` | 与 OpenCode 一样使用 `xdg-basedir` |\n| Crush | `$XDG_DATA_HOME/crush/`(回退路径:`~/.local/share/crush/`) | `%USERPROFILE%\\.local\\share\\crush\\`(如果设置了 `%XDG_DATA_HOME%`,则为 `%XDG_DATA_HOME%\\crush\\`) | 使用带回退路径的 XDG 数据目录 |\n| Goose | `~/.local/share/goose/sessions/`(+ macOS Application Support、旧版 Block 路径) | `%USERPROFILE%\\.local\\share\\goose\\sessions\\` | 可通过 `GOOSE_PATH_ROOT` 环境变量配置 |\n| Antigravity | `~/.config/tokscale/antigravity-cache/sessions/` | — | `token-stats antigravity sync` 目前仅支持 macOS / Linux |\n| Zed Agent | `~/.local/share/zed/threads/threads.db` | `%LOCALAPPDATA%\\Zed\\threads\\threads.db` | 仅限托管 Zed 模型的使用量;不含外部 ACP 代理 |\n| Kiro | `~/.kiro/sessions/cli/` 和 `~/.local/share/kiro-cli/data.sqlite3` | `%USERPROFILE%\\.kiro\\sessions\\cli\\` 和 `%USERPROFILE%\\.local\\share\\kiro-cli\\data.sqlite3` | 解析 Kiro 会话文件,以及存在时的 Kiro CLI SQLite 数据库 |\n| Trae | `~/.config/tokscale/trae-cache/sessions/` | `%APPDATA%\\tokscale\\trae-cache\\sessions\\` | 通过 `token-stats trae sync` 同步一次;凭据会从已安装的任意 Trae IDE 或 Trae Solo 桌面端自动发现 |\n| Warp/Oz | `~/.config/tokscale/warp-cache/usage.json` | `%APPDATA%\\tokscale\\warp-cache\\usage.json` | 通过 `token-stats warp sync` 同步;仅汇总请求数和消费金额,不含 token 转录 |\n| Grok Build | `~/.grok/sessions/` | `%USERPROFILE%\\.grok\\sessions\\` | 可通过 `GROK_HOME` 环境变量配置;解析 `updates.jsonl` 会话更新 |\n| Jcode | `~/.jcode/sessions/` | `%USERPROFILE%\\.jcode\\sessions\\` | 可通过 `JCODE_HOME` 环境变量配置;解析 `session_*.json` 快照以及 `session_*.journal.jsonl` sidecar |\n| MiMo Code | `~/.local/share/mimocode/` | `%USERPROFILE%\\.local\\share\\mimocode\\` | 使用 XDG 数据目录;SQLite 数据库 `mimocode.db` |\n| Gajae-Code | `~/.gjc/agent/sessions/` | `%USERPROFILE%\\.gjc\\agent\\sessions\\` | 可通过 `GJC_CODING_AGENT_DIR`(也可用 `GJC_CONFIG_DIR`/`PI_CONFIG_DIR`;Linux/macOS 上 `$XDG_DATA_HOME/gjc/sessions/` 亦支持)配置 |\n| Junie | `~/.junie/sessions/` | `%USERPROFILE%\\.junie\\sessions\\` | 所有平台使用相同的 home 相对路径;解析 `events.jsonl` 使用事件 |\n| ZCode | `~/.zcode/cli/db/db.sqlite` 和 `~/.zcode/projects/` | `%USERPROFILE%\\.zcode\\cli\\db\\db.sqlite` 和 `%USERPROFILE%\\.zcode\\projects\\` | 解析 v2 SQLite 模型用量和旧版 `*.jsonl` 会话记录;Z.ai 的 GLM 模型专用 ADE |\n| OpenCodeReview | `~/.opencodereview/sessions/` | `%USERPROFILE%\\.opencodereview\\sessions\\` | 解析 `*.jsonl` 会话记录;阿里巴巴的 AI 代码审查工具 |\n| CodeBuddy | `~/.codebuddy/projects/` + 扩展日志 | `%USERPROFILE%\\.codebuddy\\projects\\` + CodeBuddy / VS Code 扩展日志 | 解析 CodeBuddy CLI、IDE 和 VS Code 插件的 token 用量 |\n| WorkBuddy | `~/.workbuddy/projects/` + `~/.workbuddy/workbuddy.db` | `%USERPROFILE%\\.workbuddy\\projects\\` + `%USERPROFILE%\\.workbuddy\\workbuddy.db` | 解析 WorkBuddy token 用量,以聚合 SQLite 数据库作为回退 |\n| Synthetic | 从其他来源重归属 | 从其他来源重归属 | 检测 `hf:` 模型前缀 + `synthetic` provider |\n\n> **注意**:在 Windows 上,`~` 扩展为 `%USERPROFILE%`(例如 `C:\\Users\\用户名`)。这些工具故意使用 Unix 风格的路径(如 `.local/share`)而不是 Windows 原生路径(如 `%APPDATA%`),以实现跨平台一致性。\n\n#### Windows 特定配置\n\nToken Stats 将配置存储在:\n- **TUI 设置**: `%APPDATA%\\tokscale\\settings.json`(平台默认值。可用 `TOKSCALE_CONFIG_DIR` 覆盖)\n- **缓存**: `%APPDATA%\\tokscale\\cache\\`(统一缓存根目录)\n- **旧版缓存路径**: 旧版本曾使用 `%USERPROFILE%\\.cache\\tokscale\\` 这类分散路径;在可再生数据写入新路径之前,这些旧路径可能仍然存在。\n- **Cursor 凭据**: `%USERPROFILE%\\.config\\tokscale\\cursor-credentials.json`\n- **Trae 凭据和同步使用量**: `%APPDATA%\\tokscale\\trae-cache\\`\n- **Token Stats 账号凭据**: `%USERPROFILE%\\.config\\tokscale\\credentials.json`\n\n## 会话数据保留\n\n默认情况下,一些 AI 编程助手会自动删除旧的会话文件。为了准确跟踪,请禁用或延长清理周期以保留使用历史。\n\n| 平台 | 默认值 | 配置文件 | 禁用设置 | 来源 |\n|----------|---------|-------------|-------------------|--------|\n| Claude Code | **⚠️ 30 天** | `~/.claude/settings.json` | `\"cleanupPeriodDays\": 9999999999` | [文档](https://docs.anthropic.com/en/docs/claude-code/settings) |\n| Gemini CLI | 禁用 | `$GEMINI_CLI_HOME/settings.json`(回退:`~/.gemini/settings.json`) | `\"general.sessionRetention.enabled\": false` | [文档](https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/session-management.md) |\n| Codex CLI | 禁用 | N/A | 无清理功能 | [#6015](https://github.com/openai/codex/issues/6015) |\n| OpenCode | 禁用 | N/A | 无清理功能 | [#4980](https://github.com/sst/opencode/issues/4980) |\n\n### Claude Code\n\n**默认**:30 天清理周期\n\n添加到 `~/.claude/settings.json`:\n```json\n{\n \"cleanupPeriodDays\": 9999999999\n}\n```\n\n> 设置一个非常大的值(例如 `9999999999` 天 ≈ 2700 万年)实际上会禁用清理。\n\n### Gemini CLI\n\n**默认**:清理已禁用(会话永久保留)\n\n如果您已启用清理并想禁用它,请在 `$GEMINI_CLI_HOME/settings.json`(回退:`~/.gemini/settings.json`)中删除或设置 `enabled: false`:\n```json\n{\n \"general\": {\n \"sessionRetention\": {\n \"enabled\": false\n }\n }\n}\n```\n\n或设置非常长的保留期:\n```json\n{\n \"general\": {\n \"sessionRetention\": {\n \"enabled\": true,\n \"maxAge\": \"9999999d\"\n }\n }\n}\n```\n\n### Codex CLI\n\n**默认**:无自动清理(会话永久保留)\n\nCodex CLI 没有内置会话清理。`~/.codex/sessions/` 中的会话无限期保留。\n\n> **注意**:有一个关于此功能的请求:[#6015](https://github.com/openai/codex/issues/6015)\n\n### OpenCode\n\n**默认**:无自动清理(会话永久保留)\n\nOpenCode 没有内置会话清理。`~/.local/share/opencode/storage/` 中的会话无限期保留。\n\n> **注意**:参见 [#4980](https://github.com/sst/opencode/issues/4980)\n\n---\n\n## 数据源\n\n### OpenCode\n\n位置:`~/.local/share/opencode/opencode.db` (v1.2+) 或 `storage/message/{sessionId}/*.json` (旧版)\n\nOpenCode 1.2+ 将会话存储在 SQLite 中。Token Stats 优先从 SQLite 读取,旧版本则回退到旧版 JSON 文件。\n\nOpenCode 根据构建时的发布渠道决定数据库文件名:`latest`/`beta` 渠道使用 `opencode.db`,其他渠道使用 `opencode-<channel>.db`(例如 `opencode-stable.db`、`opencode-nightly.db`)。Token Stats 会扫描所有这些文件,因此同时使用多个渠道的用户也能获得统一的视图。\n\n如果您用 `OPENCODE_DB` 指向 `~/.local/share/opencode` 之外的文件来启动 opencode,请将该绝对路径添加到 `~/.config/tokscale/settings.json`,以便 token-stats 每次运行都能找到它:\n\n```json\n{\n \"scanner\": {\n \"opencodeDbPaths\": [\n \"/custom/location/opencode.db\",\n \"/another/location/opencode-stable.db\"\n ]\n }\n}\n```\n\n这些路径会与自动发现结果合并,按规范路径去重,不存在的条目会被静默跳过(因此过时的配置不会让扫描中断)。`opencode.db-wal`、`opencode.db-shm` 及其他 SQLite sidecar 会被拒绝。\n\n如果您将会话保存在 Token Stats 默认 home 根位置之外,也可以为各客户端持久化额外的扫描根目录:\n\n```json\n{\n \"scanner\": {\n \"extraScanPaths\": {\n \"codex\": [\n \"/Users/me/workspace/project-a/.codex/sessions\",\n \"/Users/me/workspace/project-b/.codex/archived_sessions\"\n ],\n \"gemini\": [\"/Users/me/imports/imac/gemini/tmp\"],\n \"hermes\": [\n \"/Users/me/.hermes/profiles/director_planning\",\n \"/Users/me/.hermes/profiles/research/state.db\"\n ],\n \"openclaw\": [\"/Users/me/imports/imac/openclaw/agents\"]\n }\n }\n}\n```\n\n这对于项目级的 `.codex` 目录、导入的历史,以及默认 `$HERMES_HOME/state.db` 或 `~/.hermes/state.db` 位置之外的 Hermes 配置文件数据库都很有用。Token Stats 仍会扫描其默认根目录,然后在其上合并 `scanner.extraScanPaths` 和 `TOKSCALE_EXTRA_DIRS`,并按规范路径去重。它不会自动发现您的整个工作区。\n\n每个消息包含:\n```json\n{\n \"id\": \"msg_xxx\",\n \"role\": \"assistant\",\n \"modelID\": \"claude-sonnet-4-20250514\",\n \"providerID\": \"anthropic\",\n \"tokens\": {\n \"input\": 1234,\n \"output\": 567,\n \"reasoning\": 0,\n \"cache\": { \"read\": 890, \"write\": 123 }\n },\n \"time\": { \"created\": 1699999999999 }\n}\n```\n\n### Claude Code\n\n位置:`~/.claude/projects/{projectPath}/*.jsonl` 和 `~/.claude/transcripts/*.jsonl`\n\n包含使用数据的助手消息的 JSONL 格式:\n```json\n{\"type\": \"assistant\", \"message\": {\"model\": \"claude-sonnet-4-20250514\", \"usage\": {\"input_tokens\": 1234, \"output_tokens\": 567, \"cache_read_input_tokens\": 890}}, \"timestamp\": \"2024-01-01T00:00:00Z\"}\n```\n\n`~/.claude/transcripts/` 下的包装转录文件仅在包含真实 Claude 使用量元数据时才会被统计。包含用户/工具事件但没有 `usage` 块的文件会被跳过,而不会进行估算。\n\nToken Stats 的 `claude` 客户端统计的是 Claude Code 的 Token,而非 Claude Desktop 聊天。Claude Desktop 会将应用数据存储在 `~/Library/Application Support/Claude` 等位置,但 Anthropic 并未为消费级桌面聊天或聊天历史导出提供文档化、稳定的本地按消息 Token 账本。当存在 Claude Desktop 数据但只有 Claude Code JSONL 根目录可扫描时,运行 `token-stats clients` 可看到一条诊断信息。`token-stats usage` 可以根据 Claude Code 凭据尽力显示 Claude 订阅配额条,而组织/API 使用量属于 Anthropic 的 Admin Usage 和 Cost API,与本地转录扫描有意分离。\n\n### Codex CLI\n\n位置:`~/.codex/sessions/*.jsonl`\n\n带 `token_count` 事件的事件驱动格式:\n```json\n{\"type\": \"event_msg\", \"payload\": {\"type\": \"token_count\", \"info\": {\"last_token_usage\": {\"input_tokens\": 1234, \"output_tokens\": 567}}}}\n```\n\n### Copilot CLI\n\n位置:`~/.copilot/otel/*.jsonl` 或 `COPILOT_OTEL_FILE_EXPORTER_PATH` 中指定的显式路径\n\nCopilot 支持读取文件导出的 OpenTelemetry JSONL。在运行 Copilot 之前启用它:\n\n```bash\nexport COPILOT_OTEL_ENABLED=true\nexport COPILOT_OTEL_EXPORTER_TYPE=file\nmkdir -p \"$HOME/.copilot/otel\"\nexport COPILOT_OTEL_FILE_EXPORTER_PATH=\"$HOME/.copilot/otel/copilot-otel-$(date +%Y%m%d-%H%M%S).jsonl\"\n```\n\nPowerShell:\n\n```powershell\n$otelDir = \"$HOME/.copilot/otel\"\nNew-Item -ItemType Directory -Force -Path $otelDir | Out-Null\n$env:COPILOT_OTEL_ENABLED = \"true\"\n$env:COPILOT_OTEL_EXPORTER_TYPE = \"file\"\n$env:COPILOT_OTEL_FILE_EXPORTER_PATH = Join-Path $otelDir (\"copilot-otel-{0}.jsonl\" -f (Get-Date -Format \"yyyyMMdd-HHmmss\"))\n```\n\n建议使用带时间戳的文件名,这样每个 Copilot 会话都会写入新文件,而不是累积到一个巨大的 OTEL 日志中。\n\nToken Stats 将 `chat` span 作为 Token 统计的真实来源,并在第一阶段忽略工具 span 和累积指标:\n\n```json\n{\"type\":\"span\",\"name\":\"chat gpt-5.4-mini\",\"attributes\":{\"gen_ai.operation.name\":\"chat\",\"gen_ai.response.model\":\"gpt-5.4-mini\",\"gen_ai.conversation.id\":\"session-id\",\"gen_ai.usage.input_tokens\":1234,\"gen_ai.usage.output_tokens\":567,\"gen_ai.usage.cache_read.input_tokens\":890,\"gen_ai.usage.reasoning.output_tokens\":123}}\n```\n\n> Copilot 的 OTEL 负载目前不暴露稳定的工作区元数据,因此 Copilot 行可能不会显示工作区属性。Token Stats 尽可能根据报告的模型为这些行定价,不会直接信任 `github.copilot.cost`。\n\n### Gemini CLI\n\n位置:`$GEMINI_CLI_HOME/tmp/{projectHash}/chats/*.json`(回退:`~/.gemini/tmp/{projectHash}/chats/*.json`)\n\n包含消息数组的会话文件:\n```json\n{\n \"sessionId\": \"xxx\",\n \"messages\": [\n {\"type\": \"gemini\", \"model\": \"gemini-2.5-pro\", \"tokens\": {\"input\": 1234, \"output\": 567, \"cached\": 890, \"thoughts\": 123}}\n ]\n}\n```\n\n### Cursor IDE\n\n位置:`~/.config/tokscale/cursor-cache/usage*.csv`(通过 Cursor API 同步)\n\nCursor 数据使用您的会话令牌从 Cursor API 获取并本地缓存。Token Stats 读取这些缓存文件来生成报告;它不会解析本地的 `~/.cursor` 会话数据。设置说明请参阅 [Cursor IDE 命令](#cursor-ide-命令)。\n\n### Antigravity\n\n位置:`~/.config/tokscale/antigravity-cache/sessions/*.jsonl`(通过本地 Antigravity 语言服务器 RPC 同步)\n\nAntigravity 数据不会被根命令自动获取。请在启用了 Antigravity 的编辑器打开时运行 `token-stats antigravity sync` 来刷新本地缓存,然后对缓存的 JSONL 产物使用常规的 token-stats 报告和筛选。\n\n### Trae\n\n位置:`~/.config/tokscale/trae-cache/sessions/*.json`(通过官方使用量 API 同步)\n\nTrae 数据不会被根命令自动获取。先运行一次 `token-stats trae login`,然后在生成报告前运行 `token-stats trae sync`。Token Stats 会将同步得到的 API dump 解析为会话级记录,并保留 Trae 返回的成本总额。\n\n### Warp/Oz\n\n位置:`~/.config/tokscale/warp-cache/usage.json`(通过已认证的 GraphQL API 同步)\n\nWarp/Oz 数据不会被根命令自动获取。先运行 `token-stats warp login`,然后在生成报告前运行 `token-stats warp sync`。由于 Warp 不暴露基于 token 归因的本地转录,Token Stats 仅记录汇总的请求数和消费金额。\n\n### Grok Build\n\n位置:`$GROK_HOME/sessions/*/*/updates.jsonl`(回退:`~/.grok/sessions/*/*/updates.jsonl`)\n\nGrok Build 数据直接从本地会话更新解析。当前日志只公开累积 `totalTokens` 计数器,没有稳定的 input/output 拆分,因此 Token Stats 将每个 turn 的正向增量记录为 input token。`grok-composer-2.5-fast` 会临时映射到 Composer 2.5 Fast 价格 override,直到专用公开价格可用。\n\n### Jcode\n\n位置:`$JCODE_HOME/sessions/session_*.json`(回退:`~/.jcode/sessions/session_*.json`)以及匹配的 `session_*.journal.jsonl` sidecar。\n\nJcode 数据直接从本地会话快照解析。Token Stats 读取助手消息的 `messages[].token_usage` 字段(`input_tokens`、`output_tokens`、`cache_read_input_tokens`、`cache_creation_input_tokens` 和 `reasoning_output_tokens`),不会伪造其他客户端的身份。匹配的 journal sidecar 会在去重前合并进同一会话流,因此在 Jcode 将其检查点写入快照之前,最近追加的消息也会被包含进来。去重使用稳定的消息 ID 进行重放去重;缺少 ID 的畸形/自定义记录则使用作用域内的回退 key。\n\n### OpenClaw\n\n位置:`~/.openclaw/agents/*/sessions/sessions.json`(也扫描旧版路径:`~/.clawdbot/`、`~/.moltbot/`、`~/.moldbot/`)\n\n指向 JSONL 会话文件的索引文件:\n```json\n{\n \"agent:main:main\": {\n \"sessionId\": \"uuid\",\n \"sessionFile\": \"/path/to/session.jsonl\"\n }\n}\n```\n\n包含 model_change 事件和助手消息的会话 JSONL 格式:\n```json\n{\"type\":\"model_change\",\"provider\":\"openai-codex\",\"modelId\":\"gpt-5.2\"}\n{\"type\":\"message\",\"message\":{\"role\":\"assistant\",\"usage\":{\"input\":1660,\"output\":55,\"cacheRead\":108928,\"cost\":{\"total\":0.02}},\"timestamp\":1769753935279}}\n```\n\n### Hermes Agent\n\n位置:`$HERMES_HOME/state.db`(回退:`~/.hermes/state.db`),以及位于 `$HERMES_HOME/profiles/*/state.db` 的标准配置文件数据库(当 `HERMES_HOME` 指向活动配置文件时,则为同级的 `~/.hermes/profiles/*/state.db`)\n\nHermes 将会话级使用量存储在 SQLite `sessions` 表中。Token Stats 导入 `model` 存在且 token 或费用合计非零的行,使用 `started_at` 作为时间戳,保留 `message_count`,并优先使用 `actual_cost_usd` 而非 `estimated_cost_usd`。\n\n### Pi\n\n位置:`~/.pi/agent/sessions/<encoded-cwd>/*.jsonl` 和 `~/.omp/agent/sessions/<encoded-cwd>/*.jsonl`([Oh My Pi](https://github.com/can1357/oh-my-pi))\n\n包含会话头和消息条目的 JSONL 格式:\n```json\n{\"type\":\"session\",\"id\":\"pi_ses_001\",\"timestamp\":\"2026-01-01T00:00:00.000Z\",\"cwd\":\"/tmp\"}\n{\"type\":\"message\",\"id\":\"msg_001\",\"timestamp\":\"2026-01-01T00:00:01.000Z\",\"message\":{\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet\",\"provider\":\"anthropic\",\"usage\":{\"input\":100,\"output\":50,\"cacheRead\":10,\"cacheWrite\":5,\"totalTokens\":165}}}\n```\n\n### Kimi CLI\n\n位置:`~/.kimi/sessions/{GROUP_ID}/{SESSION_UUID}/wire.jsonl`\n\n包含 StatusUpdate 消息的 wire.jsonl 格式:\n```json\n{\"type\": \"metadata\", \"protocol_version\": \"1.3\"}\n{\"timestamp\": 1770983426.420942, \"message\": {\"type\": \"StatusUpdate\", \"payload\": {\"token_usage\": {\"input_other\": 1562, \"output\": 2463, \"input_cache_read\": 0, \"input_cache_creation\": 0}, \"message_id\": \"chatcmpl-xxx\"}}}\n```\n\n### Kimi Code\n\n位置: `~/.kimi-code/sessions/{WORKDIR}/{SESSION_UUID}/agents/{AGENT}/wire.jsonl`\n```json\n{\"type\":\"usage.record\",\"model\":\"kimi-code/kimi-for-coding\",\"usage\":{\"inputOther\":1163,\"output\":352,\"inputCacheRead\":22272,\"inputCacheCreation\":0},\"usageScope\":\"turn\",\"time\":1780410897480}\n```\n\n### Qwen CLI\n\n位置:`~/.qwen/projects/{PROJECT_PATH}/chats/{CHAT_ID}.jsonl`\n\n格式:JSONL — 每行一个JSON对象,每个对象包含 `type`、`model`、`timestamp`、`sessionId`、`usageMetadata` 字段。\n\n令牌字段(来自 `usageMetadata`):\n- `promptTokenCount` → 输入令牌\n- `candidatesTokenCount` → 输出令牌\n- `thoughtsTokenCount` → 推理/思考令牌\n- `cachedContentTokenCount` → 缓存输入令牌\n\n### Roo Code\n\n位置:\n- 本地:`~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/{TASK_ID}/ui_messages.json`\n- 服务器(尽力而为):`~/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/{TASK_ID}/ui_messages.json`\n\n每个任务目录可能还包含 `api_conversation_history.json`,其中包含用于模型/代理元数据的 `<environment_details>` 块。\n\n`ui_messages.json` 是一个 UI 事件数组。Token Stats 仅计算:\n- `type == \"say\"`\n- `say == \"api_req_started\"`\n\n`text` 字段是包含 Token/成本元数据的 JSON:\n```json\n{\n \"type\": \"say\",\n \"say\": \"api_req_started\",\n \"ts\": \"2026-02-18T12:00:00Z\",\n \"text\": \"{\\\"cost\\\":0.12,\\\"tokensIn\\\":100,\\\"tokensOut\\\":50,\\\"cacheReads\\\":20,\\\"cacheWrites\\\":5,\\\"apiProtocol\\\":\\\"anthropic\\\"}\"\n}\n```\n\n### Kilo\n\n位置:\n- 本地:`~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/{TASK_ID}/ui_messages.json`\n- 服务器(尽力而为):`~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks/{TASK_ID}/ui_messages.json`\n\nKilo 使用与 Roo Code 相同的任务日志格式。Token Stats 应用相同的规则:\n- 仅计算 `ui_messages.json` 中的 `say/api_req_started` 事件\n- 从 `text` JSON 中解析 `tokensIn`、`tokensOut`、`cacheReads`、`cacheWrites`、`cost` 和 `apiProtocol`\n- 在可用时从相邻的 `api_conversation_history.json` 中丰富模型/代理元数据\n\n### Cline\n\n位置:\n- Linux 桌面版 VS Code:`~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json`\n- macOS 桌面版 VS Code:`~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json`\n- Windows 桌面版 VS Code:`%APPDATA%\\Code\\User\\globalStorage\\saoudrizwan.claude-dev\\tasks\\{TASK_ID}\\ui_messages.json`\n- 服务器(尽力而为):`~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json`\n\nCline 是 Roo Code 和 Kilo 从中 fork 的上游项目,因此使用相同的 VS Code globalStorage 任务日志格式。Token Stats 应用相同的规则:\n- 仅计算 `ui_messages.json` 中的 `say/api_req_started` 事件\n- 从 `text` JSON 中解析 `tokensIn`、`tokensOut`、`cacheReads`、`cacheWrites`、`cost` 和 `apiProtocol`\n- 在可用时从相邻的 `api_conversation_history.json` 中丰富模型/代理元数据\n\n### Mux\n\n位置:\n `~/.mux/sessions/{WORKSPACE_ID}/session-usage.json`\n\nMux 在 `session-usage.json` 文件中存储每个会话的累计 Token 使用量。每个文件包含一个 `byModel` 映射,其中包含每个模型的 Token 细分:\n `input`、`cached`(缓存读取)、`cacheCreate`(缓存写入)、`output`、`reasoning`\n 模型名称使用 `provider:model` 格式(例如 `anthropic:claude-opus-4-6`)— token-stats 会去除 provider 前缀以识别模型\n 子代理使用量由 Mux 自动汇总到父会话中,因此不存在重复计算\n\n### Kilo CLI\n\n位置:`~/.local/share/kilo/kilo.db`\n\nKilo CLI 在类似于 OpenCode 的 SQLite 数据库中存储会话数据。每条消息行包含每条消息的 Token 细分(输入、输出、缓存读取/写入、推理)以及模型和提供商归属。\n\n### Crush\n\n位置:通过 `$XDG_DATA_HOME/crush/projects.json` 发现的项目级 SQLite 数据库(回退路径:`~/.local/share/crush/projects.json`)\n\nCrush 在项目级 SQLite 数据库(`crush.db`)中存储使用量。由于 Crush 不提供可靠的每条消息或每个模型的 Token 统计,Token Stats 仅导入根会话的会话级成本总计。记录显示为 `model=session-total`,Token 细分为零。\n\n### Goose\n\n位置:`~/.local/share/goose/sessions/sessions.db`(同时扫描 `~/Library/Application Support/goose/`、`~/Library/Application Support/Block/goose/`、`~/.local/share/Block/goose/`;可通过 `GOOSE_PATH_ROOT` 覆盖)\n\nGoose 在 SQLite 的 `sessions.db` 中按会话保存使用量。Token Stats 从 `model_config_json` 提取模型,从 `provider_name` 提取提供商,并按会话累加输入/输出 Token 总数。当推理 Token 列有数据时也会被推断出来。\n\n### Codebuff\n\n位置:`~/.config/manicode/projects/<project>/chats/<chatId>/chat-messages.json`(同时扫描 `manicode-dev` 和 `manicode-staging` 频道;可通过 `CODEBUFF_DATA_DIR` 覆盖)\n\nCodebuff(前身 Manicode)按聊天写入 JSON 文件。Token Stats 从 `metadata.usage`、`metadata.codebuff.usage` 以及 run-state 中的 `messageHistory[*].providerOptions` 回退路径解析 Token 使用量,并以反向顺序遍历历史,避免部分更新的较新条目遮蔽实际承载 Token 数的较早条目。当消息时间戳缺失时,会回退到 chat-id 目录名,最后回退到文件 mtime。\n\n### Gajae-Code (gjc)\n\n位置:`~/.gjc/agent/sessions/<project-slug>/*.jsonl`(可通过 `GJC_CODING_AGENT_DIR` 覆盖 agent 目录;也会解析 `GJC_CONFIG_DIR`/`PI_CONFIG_DIR` 拼接 `agent/sessions`,以及 Linux/macOS 上展平的 `$XDG_DATA_HOME/gjc/sessions/` 重定向路径)。深度为 2 的逐次子代理转录(`<slug>/<session>/N-*.jsonl`)也会被发现。\n\n包含会话头和消息条目的 JSONL 格式。Token Stats 仅处理 assistant 消息,并在存在时优先使用 gjc 的权威性每条消息 `usage.cost.total`(USD),仅在缺失时才从 token 数重新计算:\n```json\n{\"type\":\"session\",\"id\":\"S1\",\"timestamp\":\"2026-01-01T00:00:00.000Z\",\"cwd\":\"/work/proj\"}\n{\"type\":\"message\",\"id\":\"M1\",\"timestamp\":\"2026-01-01T00:00:01.000Z\",\"message\":{\"role\":\"assistant\",\"model\":\"claude-sonnet-4\",\"provider\":\"anthropic\",\"usage\":{\"input\":1000,\"output\":500,\"cacheRead\":0,\"cacheWrite\":0,\"totalTokens\":1500,\"cost\":{\"input\":0.1,\"output\":0.2,\"total\":0.3}}}}\n```\n\n### Synthetic (synthetic.new)\n\nSynthetic 通过后处理重归属其他来源的消息。当检测到 `hf:` 前缀模型 ID 或 `synthetic` / `glhf` / `octofriend` provider 时,消息会被归类为 `synthetic` 来源。\n\nToken Stats 还会检测 `~/.local/share/octofriend/sqlite.db`,并在可用时解析包含 token 数据的记录。\n\n### MiMo Code\n\n位置:`~/.local/share/mimocode/mimocode.db`(XDG 数据目录)\n\nMiMo Code 将会话数据存储在 SQLite 数据库中。Token Stats 查询 `message` 表并关联 `session` 表获取工作区上下文:\n\n```sql\nSELECT m.id, m.session_id, m.data, NULLIF(s.directory, '') AS workspace_root\nFROM message m\nLEFT JOIN session s ON s.id = m.session_id\nWHERE json_extract(m.data, '$.role') = 'assistant'\n AND json_extract(m.data, '$.tokens') IS NOT NULL\n```\n\n`data` 列为 JSON 格式,包含以下 token 相关字段:\n```json\n{\n \"role\": \"assistant\",\n \"modelID\": \"claude-sonnet-4\",\n \"providerID\": \"anthropic\",\n \"cost\": 0.0032,\n \"tokens\": {\n \"input\": 1200,\n \"output\": 450,\n \"reasoning\": 0,\n \"cache\": { \"read\": 800, \"write\": 0 }\n },\n \"time\": { \"created\": 1780410897000, \"completed\": 1780410912000 },\n \"agent\": \"micode\",\n \"path\": { \"root\": \"/Users/me/project\" }\n}\n```\n\nToken Stats 使用时间戳、模型、provider、token 计数、成本和 agent 名称的指纹对跨 fork 会话的消息进行去重。\n\n## 定价\n\nToken Stats 从 [LiteLLM 的价格数据库](https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json)获取实时价格。\n\n**动态回退**:对于 LiteLLM 中尚未收录的模型(例如最近发布的模型),Token Stats 会自动从 [OpenRouter 的端点 API](https://openrouter.ai/docs/api/api-reference/endpoints/list-endpoints) 获取定价。这确保您无需等待 LiteLLM 更新,就能从模型的作者提供商(例如 glm-4.7 的 Z.AI)获得准确的价格。\n\n**Cursor 模型定价**:对于 LiteLLM 和 OpenRouter 中都尚未收录的最新模型(例如 `gpt-5.3-codex`),Token Stats 使用从 [Cursor 模型文档](https://cursor.com/en-US/docs/models)获取的硬编码定价。这些覆盖在所有上游来源之后、模糊匹配之前检查,因此当真正的上游定价可用时会自动让步。\n\n**Sakana Fugu 定价**:Fugu Ultra 的成本根据 Sakana 公布的按量付费(pay-as-you-go)费率估算;`fugu` 路由模型有意不定价,因为它的成本就是其所编排的底层模型的浮动费率。\n\n**缓存**:价格数据以 1 小时 TTL 缓存到磁盘,确保快速启动:\n- LiteLLM 缓存:`~/.config/tokscale/cache/pricing-litellm.json`\n- OpenRouter 缓存:`~/.config/tokscale/cache/pricing-openrouter.json`(缓存支持提供商的模型作者定价信息)\n\n定价包括:\n- 输入 Token\n- 输出 Token\n- 缓存读取 Token(折扣)\n- 缓存写入 Token\n- 推理 Token(用于 o1 等模型)\n- 模型专属的分层定价(例如 200k 或 272k Token 以上)\n\n## 贡献\n\n欢迎贡献!请按照以下步骤操作:\n\n1. Fork 仓库\n2. 创建功能分支(`git checkout -b feature/amazing-feature`)\n3. 进行更改\n4. 运行测试(`cd packages/core && bun run test:all`)\n5. 提交更改(`git commit -m 'Add amazing feature'`)\n6. 推送到分支(`git push origin feature/amazing-feature`)\n7. 打开 Pull Request\n\n### 开发指南\n\n- 遵循现有代码风格\n- 为新功能添加测试\n- 根据需要更新文档\n- 保持提交集中和原子化\n\n## 致谢\n\n- 感谢 [ccusage](https://github.com/ryoppippi/ccusage)、[viberank](https://github.com/sculptdotfun/viberank) 和 [Isometric Contributions](https://github.com/jasonlong/isometric-contributions) 提供的灵感\n- [Ratatui](https://github.com/ratatui/ratatui) 终端 UI 框架\n- [Solid.js](https://www.solidjs.com/) 响应式渲染\n- [LiteLLM](https://github.com/BerriAI/litellm) 价格数据\n- [napi-rs](https://napi.rs/) Rust/Node.js 绑定\n- [github-contributions-canvas](https://github.com/sallar/github-contributions-canvas) 2D 图表参考\n\n## 许可证\n\n<p align=\"center\">\n <a href=\"https://github.com/Annihilater\">\n <img src=\".github/assets/labtocat-on-spaceship.png\" width=\"540\">\n </a>\n</p>\n\n<p align=\"center\">\n <strong>MIT © <a href=\"https://github.com/Annihilater\">Junho Yeo</a></strong>\n</p>\n\n如果您觉得这个项目有趣,**请考虑给它一个星标 ⭐** 或 [在 GitHub 上关注我](https://github.com/Annihilater) 加入旅程(已有 1.1k+ 人加入)。我全天候编程,定期发布令人惊叹的东西——您的支持不会白费。\n"}}}}