token-tracker 0.4.1__tar.gz → 0.4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {token_tracker-0.4.1/src/token_tracker.egg-info → token_tracker-0.4.3}/PKG-INFO +62 -72
  2. token_tracker-0.4.3/README.md +180 -0
  3. {token_tracker-0.4.1 → token_tracker-0.4.3}/pyproject.toml +1 -1
  4. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/analyzer/cost.py +83 -0
  5. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/cli.py +4 -7
  6. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/config.py +4 -3
  7. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/i18n.py +4 -10
  8. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/format.py +43 -14
  9. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/heatmap.py +25 -26
  10. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/status.py +2 -5
  11. {token_tracker-0.4.1 → token_tracker-0.4.3/src/token_tracker.egg-info}/PKG-INFO +62 -72
  12. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_aggregator.py +0 -11
  13. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_cost.py +118 -0
  14. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_hooks.py +13 -38
  15. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_status.py +6 -8
  16. token_tracker-0.4.1/README.md +0 -190
  17. {token_tracker-0.4.1 → token_tracker-0.4.3}/LICENSE +0 -0
  18. {token_tracker-0.4.1 → token_tracker-0.4.3}/setup.cfg +0 -0
  19. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/__init__.py +0 -0
  20. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/__init__.py +0 -0
  21. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/claude.py +0 -0
  22. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/codex.py +0 -0
  23. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/rate_limits.py +0 -0
  24. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/registry.py +0 -0
  25. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/types.py +0 -0
  26. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/adapters/util.py +0 -0
  27. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/analyzer/__init__.py +0 -0
  28. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/analyzer/aggregator.py +0 -0
  29. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/analyzer/blocks.py +0 -0
  30. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/hooks.py +0 -0
  31. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/__init__.py +0 -0
  32. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/console.py +0 -0
  33. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/panels.py +0 -0
  34. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/tables.py +0 -0
  35. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/theme.py +0 -0
  36. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/ui/themes.py +0 -0
  37. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker/wizard.py +0 -0
  38. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker.egg-info/SOURCES.txt +0 -0
  39. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker.egg-info/dependency_links.txt +0 -0
  40. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker.egg-info/entry_points.txt +0 -0
  41. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker.egg-info/requires.txt +0 -0
  42. {token_tracker-0.4.1 → token_tracker-0.4.3}/src/token_tracker.egg-info/top_level.txt +0 -0
  43. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_blocks.py +0 -0
  44. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_cli.py +0 -0
  45. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_codex.py +0 -0
  46. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_heatmap.py +0 -0
  47. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_tables.py +0 -0
  48. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_theme.py +0 -0
  49. {token_tracker-0.4.1 → token_tracker-0.4.3}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: token-tracker
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: Track token usage across local AI agents (Claude Code, Codex)
5
5
  Author-email: stormzhang <stormzhang.dev@gmail.com>
6
6
  License: MIT License
@@ -61,15 +61,32 @@ Dynamic: license-file
61
61
 
62
62
  [English](README_EN.md)
63
63
 
64
+ ![Token Tracker Daily](assets/screenshot-daily.png)
65
+
66
+ ## 功能亮点
67
+
68
+ - **多 Agent 统一追踪** — Claude Code + Codex 统一读取,多 Agent 按来源分组
69
+ - **状态栏集成** — Claude Code 用官方 StatusLine 接口;**Codex 业界首创伪 statusline 方案**(hook 注入两行真彩色状态栏,把官方未开放的能力在 Codex 里做了出来)
70
+ - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
71
+ - **多维成本分析** — 会话 / 日 / 周 / 月多维报表,等效成本统计
72
+ - **定价识别** — litellm 在线定价 + 内置官方价双层兜底,覆盖 Claude / OpenAI / Gemini / Grok 及国产主流(Kimi / GLM / Qwen / 豆包 / DeepSeek / MiniMax / MiMo);新模型自动套用同系列定价、不静默归零
73
+ - **会话洞察** — 项目、模型、时长、消息数一览
74
+ - **多主题统一配色** — 6 套主题(Catppuccin 全家 + Nord + Dracula),CLI 报表 / CC 状态栏 / Codex 伪 statusline **三者同源**,`tt theme` 一键切换
75
+ - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
76
+ - **隐私安全** — 数据纯本地存储,不采集、不上传
77
+
64
78
  ## StatusLine 状态栏
65
79
 
66
- 自动为 Claude Code 和 Codex 配置状态栏,`tt setup` 一键配置,脚本更新时自动升级。
80
+ `tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
81
+
82
+ ### Claude Code(官方接口)
67
83
 
68
- **Claude Code**:基于官方自定义 StatusLine 接口,数据完全来自本地 Claude,准确无任何推测
84
+ 基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
69
85
 
70
86
  ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
71
87
 
72
- 状态栏共四行,从左到右:
88
+ <details>
89
+ <summary>四行布局字段详解</summary>
73
90
 
74
91
  | 行 | 字段 | 说明 |
75
92
  |----|------|------|
@@ -88,44 +105,38 @@ Dynamic: license-file
88
105
 
89
106
  > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
90
107
 
91
- **Codex**:官方暂不支持自定义 StatusLine,`tt setup` 通过 Codex `Stop` hook 装一个**伪 statusline**——每次回答完成后在回答尾部追加**两行**彩色 status,仿 Claude Code 状态栏(不再接管 Codex 官方 `status_line`,伪 statusline 信息比官方字段更全):
108
+ </details>
109
+
110
+ ### Codex(伪 statusline,业界首创)
111
+
112
+ Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
92
113
 
93
114
  ![Codex StatusLine](assets/screenshot-statusline-codex.png)
94
115
 
95
- **伪 statusline 两行布局**:
116
+ **两行布局**:
96
117
 
97
118
  - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
98
119
  - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
99
120
 
100
- 通过 `Stop` hook 注入 `systemMessage` 实现,渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
121
+ 渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
101
122
 
102
- ## Daily 概览和 日/周/月 数据报表分析
123
+ ## 报表速览
103
124
 
104
- `tt`(无参)/ `tt daily`:默认入口,GitHub 风格 token 贡献热力图 + 顶部**单一卡片**内拼三段概览(**Last 12 months / This Month / This Week**,粗→细)。
105
- - Last 12 months:橙色 Tokens / Cost / Sessions / Avg/Cost / 活跃天数 + 蓝色 单日峰值 / 当前·最长连续活跃天数
106
- - This Month / This Week:橙色 Tokens / Cost / Avg/Cost / 活跃天数,**带环比**(↑/↓ 上月 / 上周)
125
+ `tt status` 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
107
126
 
108
- `tt status`:聚焦**过去 5 小时**的实时面板——顶部多 Agent **合并**概览(Token / Cost / Sessions / Messages / Top Model),中间 **5h / 7d 订阅额度**进度条(Claude Code / Codex 分开;都没订阅额度时换成 per-agent 的 token/cost/sessions/messages 统计),底部**近期会话**列表(CC + Codex 合并、带 Agent 列、按 Cost 倒序、Cost 前三名高亮)。所有时间按**系统时区**显示,配色跟随当前主题。
127
+ ![Status](assets/screenshot.png)
109
128
 
110
- ![Token Tracker Daily](assets/screenshot-daily.png)
129
+ `tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
111
130
 
112
- ![Token Tracker Status](assets/screenshot.png)
131
+ ![Weekly](assets/screenshot-weekly.png)
113
132
 
114
- ![Token Tracker Weekly](assets/screenshot-weekly.png)
133
+ `tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
115
134
 
116
- ![Token Tracker Monthly](assets/screenshot-monthly.png)
135
+ ![Monthly](assets/screenshot-monthly.png)
117
136
 
118
- ## 功能
137
+ `tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
119
138
 
120
- - **多 Agent 追踪** — Claude Code + Codex 统一面板,左右键切换
121
- - **状态栏集成** — Claude Code statusLine + Codex status_line,首次运行自动配置,脚本更新自动升级
122
- - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
123
- - **成本分析** — 按会话、日、周、月维度的等效成本统计,多 Agent 按来源分组展示
124
- - **定价识别** — litellm 在线定价 + 内置官方价双层兜底;同系列新模型自动套用本档定价(含 Claude Fable 5 / Opus 4.8),全新系列缺价时明确提示,不静默按 $0 统计
125
- - **会话洞察** — 项目、模型、时长、消息数一览
126
- - **多主题统一配色** — 6 套主题(Catppuccin Mocha/Latte/Frappe/Macchiato + Nord + Dracula),CLI 报表、CC 状态栏与 Codex 伪 statusline **三者同源**;`tt theme` 一键切换 / 预览,暗 / 亮终端自动选 Catppuccin,首次运行交互向导引导选择,`TT_THEME` 可覆盖;终端不支持 truecolor 时自动降级到 256 色近似
127
- - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
128
- - **隐私安全** — 数据纯本地存储,不采集、不上传任何用户信息,极轻量无后顾之忧
139
+ ![Sessions](assets/screenshot-sessions.png)
129
140
 
130
141
  ## 安装
131
142
 
@@ -136,38 +147,31 @@ curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/instal
136
147
  脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
137
148
 
138
149
  > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
139
- > **卸载**:先 `tt unsetup` 还原状态栏,再按装法移除(`uv tool uninstall token-tracker` / `pipx uninstall token-tracker` / 删 `~/.local/share/token-tracker` 与 `~/.local/bin/tt`)。
150
+ > **卸载**:`tt unsetup`
140
151
 
141
152
  ## 使用
142
153
 
143
154
  ```bash
144
155
  tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
145
- tt # 过去一年 token 热力图 + 顶部三段概览(Last 12 months / This Month / This Week,= tt daily)
156
+ tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
146
157
  tt daily # 同上(tt 无参即进 daily)
147
- tt status # 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
148
- tt weekly # 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
149
- tt monthly # 按月汇总(多 Agent 分组展示)
150
- tt sessions # 最近 20 条会话明细(按 cost 倒序展示;tt sessions <n> 改条数、--sort 改排序)
158
+ tt status # 过去 5h 实时面板
159
+ tt weekly # 周报
160
+ tt monthly # 月报
161
+ tt sessions # 最近 20 条会话明细(tt sessions <n> 改条数、--sort 改排序)
151
162
  tt theme # 查看 / 切换配色主题(show / list / set / preview)
152
163
  tt unsetup # 卸载并恢复安装前的配置
164
+ tt --version # 查看版本(-v / -V 同义)
153
165
  ```
154
166
 
155
167
  > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
156
168
 
157
- ### 首次运行向导
158
-
159
- 第一次跑 `tt`(或通过 curl 一键安装脚本装完自动启动)会进入**交互式配置向导**,全程上下键选 + 回车确认:
160
-
161
- 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`,之后所有命令跟随)
162
- 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
163
- 3. **启用 Codex 伪 statusline** — Yes/No,默认 Yes(仅检测到 Codex 时)
164
-
165
- 选完给一份键值对齐的配置总结 + 重启 / 下一步提示。CI / 非 tty 环境(Docker / 脚本)自动按默认全装:**语言跟随系统设置**(读系统语言、不被 CLI 的 `LANG` 误导)、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可(终端里每次 `tt setup` 都进向导)。
166
-
167
- ### 配色主题
169
+ ## 配色主题
168
170
 
169
171
  内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
170
172
 
173
+ ![支持的主题](assets/screenshot-themes.png)
174
+
171
175
  | 主题 | 说明 |
172
176
  |------|------|
173
177
  | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
@@ -182,9 +186,20 @@ tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
182
186
  tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
183
187
  ```
184
188
 
185
- - **首次运行**(终端内、非 AI 会话)会进入交互向导引导选主题;CI / 脚本 / 会话内自动跳过、静默用默认。
186
- - 切换持久化到 `~/.config/token-tracker/config.json`(主题 + 语言 + 组件意图统一存这一个文件);优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动(`--theme` 和 `TT_THEME` 都只临时生效、不写配置)。
187
- - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到当前主题的 **256 色近似**,8 色老终端不再适配。
189
+ - 切换持久化到 `~/.config/token-tracker/config.json`;优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动。
190
+ - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到 **256 色近似**。
191
+
192
+ ## 高级
193
+
194
+ ### 首次运行向导
195
+
196
+ 第一次跑 `tt`(或在独立终端跑 `tt setup`)会进入**交互式配置向导**,全程上下键选 + 回车确认:
197
+
198
+ 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`)
199
+ 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
200
+ 3. **启用 Codex 伪 statusline** — Yes/No(仅检测到 Codex 时)
201
+
202
+ CI / 非 tty 环境(Docker / 脚本 / `curl|bash`)自动按默认全装:**语言跟随系统设置**、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可。
188
203
 
189
204
  ### 报告排序
190
205
 
@@ -197,17 +212,6 @@ tt sessions --sort tokens --asc # 按 token 升序
197
212
 
198
213
  可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
199
214
 
200
- ### Dashboard 快捷键
201
-
202
- | 按键 | 功能 |
203
- |------|------|
204
- | `←` `→` | 切换 Agent |
205
- | `↑` `↓` | 滚动内容 |
206
- | `s` | 切换排序字段(时间 → Token → 等效成本 → 消息数) |
207
- | `r` | 反转排序方向 |
208
- | `+` / `-` | 调整会话显示条数(±10,最少 10 条) |
209
- | `q` | 退出 |
210
-
211
215
  ## 数据来源
212
216
 
213
217
  | Agent | 路径 | 格式 |
@@ -215,7 +219,7 @@ tt sessions --sort tokens --asc # 按 token 升序
215
219
  | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
216
220
  | Codex | `~/.codex/sessions/` | JSONL + SQLite |
217
221
 
218
- 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`(如 `C:\Users\xxx\.claude`)。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
222
+ 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
219
223
 
220
224
  Token Tracker 对 Agent 数据**只读**,不做任何修改。
221
225
 
@@ -224,20 +228,6 @@ Token Tracker 对 Agent 数据**只读**,不做任何修改。
224
228
  - Python 3.11+
225
229
  - [Rich](https://github.com/Textualize/rich)(自动安装)
226
230
 
227
- ## 开发
228
-
229
- ```bash
230
- git clone https://github.com/stormzhang/token-tracker && cd token-tracker
231
- uv run --extra dev pytest # 运行测试
232
- uv run --extra dev ruff check src tests # Lint
233
- ```
234
-
235
- 包采用标准 src layout(`src/token_tracker/`):发行名 `token-tracker`,导入名 `token_tracker`(0.4.0 起)。
236
-
237
- ## TODO
238
-
239
- 未来持续增加更多数据报表,多维度分析。
240
-
241
231
  ## License
242
232
 
243
233
  Copyright (c) 2026 stormzhang. MIT License.
@@ -0,0 +1,180 @@
1
+ # Token Tracker (tt)
2
+
3
+ 本地 AI Agent Token 消耗追踪/分析工具,支持 **Claude Code** 和 **Codex** 。
4
+
5
+ 自定义 StatusLine 状态栏 + CLI Dashboard,实时查看 token 用量、等效成本、限额状态。
6
+
7
+ ![Python](https://img.shields.io/badge/python-3.11+-blue) ![CI](https://github.com/stormzhang/token-tracker/actions/workflows/ci.yml/badge.svg) ![License](https://img.shields.io/badge/license-MIT-green)
8
+
9
+ [English](README_EN.md)
10
+
11
+ ![Token Tracker Daily](assets/screenshot-daily.png)
12
+
13
+ ## 功能亮点
14
+
15
+ - **多 Agent 统一追踪** — Claude Code + Codex 统一读取,多 Agent 按来源分组
16
+ - **状态栏集成** — Claude Code 用官方 StatusLine 接口;**Codex 业界首创伪 statusline 方案**(hook 注入两行真彩色状态栏,把官方未开放的能力在 Codex 里做了出来)
17
+ - **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
18
+ - **多维成本分析** — 会话 / 日 / 周 / 月多维报表,等效成本统计
19
+ - **定价识别** — litellm 在线定价 + 内置官方价双层兜底,覆盖 Claude / OpenAI / Gemini / Grok 及国产主流(Kimi / GLM / Qwen / 豆包 / DeepSeek / MiniMax / MiMo);新模型自动套用同系列定价、不静默归零
20
+ - **会话洞察** — 项目、模型、时长、消息数一览
21
+ - **多主题统一配色** — 6 套主题(Catppuccin 全家 + Nord + Dracula),CLI 报表 / CC 状态栏 / Codex 伪 statusline **三者同源**,`tt theme` 一键切换
22
+ - **零配置** — 自动检测已安装的 Agent,直接读取本地数据
23
+ - **隐私安全** — 数据纯本地存储,不采集、不上传
24
+
25
+ ## StatusLine 状态栏
26
+
27
+ `tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
28
+
29
+ ### Claude Code(官方接口)
30
+
31
+ 基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
32
+
33
+ ![Claude Code StatusLine](assets/screenshot-statusline-cc.png)
34
+
35
+ <details>
36
+ <summary>四行布局字段详解</summary>
37
+
38
+ | 行 | 字段 | 说明 |
39
+ |----|------|------|
40
+ | 1 | `[项目](分支 +12 -3)` | 项目名(加粗)+ Git 分支(未提交修改标 `*`),括号内附工作区相对 HEAD 的增删行数 |
41
+ | 1 | `Total: 1.2M` | 本次会话累计消耗 token(输入+输出+cache,解析 transcript 得出) |
42
+ | 1 | `Cost: $35.51` | 本次会话等效成本(Claude Code 自带,按官方计费,准确) |
43
+ | 1 | `Code: +208 -8` | 本会话 Claude 写 / 删的代码行数(`+` 绿 `-` 红,与 git 变动同配色) |
44
+ | 2 | `Limit: 5h: ██░ 31% (1h19m)` | 5 小时滑动窗口配额(仅订阅模式;括号内重置倒计时) |
45
+ | 2 | `7d: ██░ 11% (5d8h)` | 7 天滑动窗口配额 |
46
+ | 2 | `1.0M Ctx: ██░ 20%` | 上下文窗口总大小及已用占比 |
47
+ | 3 | `Tokens: in 392k, out 937, cache 388k` | **当前上下文窗口**的 token 构成(注意:非会话累计,会随 compact 变化) |
48
+ | 3 | `Out TPS: 60 tokens/s` | 本轮 output token 生成速度(含 thinking;空闲帧保留上次值) |
49
+ | 4 | `Model: Opus 4.8/xhigh/nofast` | 模型名 / reasoning 级别 / 是否 fast 模式 |
50
+ | 4 | `Duration: 1h33m` | 当前会话已持续时间 |
51
+ | 4 | `Remote: github` | 代码仓库 host(去顶级域) |
52
+
53
+ > 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
54
+
55
+ </details>
56
+
57
+ ### Codex(伪 statusline,业界首创)
58
+
59
+ Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
60
+
61
+ ![Codex StatusLine](assets/screenshot-statusline-codex.png)
62
+
63
+ **两行布局**:
64
+
65
+ - **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
66
+ - **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
67
+
68
+ 渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
69
+
70
+ ## 报表速览
71
+
72
+ `tt status` — 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
73
+
74
+ ![Status](assets/screenshot.png)
75
+
76
+ `tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
77
+
78
+ ![Weekly](assets/screenshot-weekly.png)
79
+
80
+ `tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
81
+
82
+ ![Monthly](assets/screenshot-monthly.png)
83
+
84
+ `tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
85
+
86
+ ![Sessions](assets/screenshot-sessions.png)
87
+
88
+ ## 安装
89
+
90
+ ```bash
91
+ curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/install.sh | bash
92
+ ```
93
+
94
+ 脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
95
+
96
+ > **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
97
+ > **卸载**:`tt unsetup`
98
+
99
+ ## 使用
100
+
101
+ ```bash
102
+ tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
103
+ tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
104
+ tt daily # 同上(tt 无参即进 daily)
105
+ tt status # 过去 5h 实时面板
106
+ tt weekly # 周报
107
+ tt monthly # 月报
108
+ tt sessions # 最近 20 条会话明细(tt sessions <n> 改条数、--sort 改排序)
109
+ tt theme # 查看 / 切换配色主题(show / list / set / preview)
110
+ tt unsetup # 卸载并恢复安装前的配置
111
+ tt --version # 查看版本(-v / -V 同义)
112
+ ```
113
+
114
+ > 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
115
+
116
+ ## 配色主题
117
+
118
+ 内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
119
+
120
+ ![支持的主题](assets/screenshot-themes.png)
121
+
122
+ | 主题 | 说明 |
123
+ |------|------|
124
+ | `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
125
+ | `nord` | Nord |
126
+ | `dracula` | Dracula |
127
+
128
+ ```bash
129
+ tt theme # 显示当前主题及来源
130
+ tt theme list # 列出全部主题 + 色块预览
131
+ tt theme preview nord # 预览某主题(CLI 样例 + 状态栏样例行)
132
+ tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
133
+ tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
134
+ ```
135
+
136
+ - 切换持久化到 `~/.config/token-tracker/config.json`;优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动。
137
+ - 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到 **256 色近似**。
138
+
139
+ ## 高级
140
+
141
+ ### 首次运行向导
142
+
143
+ 第一次跑 `tt`(或在独立终端跑 `tt setup`)会进入**交互式配置向导**,全程上下键选 + 回车确认:
144
+
145
+ 1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`)
146
+ 2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
147
+ 3. **启用 Codex 伪 statusline** — Yes/No(仅检测到 Codex 时)
148
+
149
+ CI / 非 tty 环境(Docker / 脚本 / `curl|bash`)自动按默认全装:**语言跟随系统设置**、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可。
150
+
151
+ ### 报告排序
152
+
153
+ 所有报告命令支持 `--sort` 和 `--asc/--desc` 参数:
154
+
155
+ ```bash
156
+ tt weekly --sort cost --desc # 按成本降序
157
+ tt sessions --sort tokens --asc # 按 token 升序
158
+ ```
159
+
160
+ 可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
161
+
162
+ ## 数据来源
163
+
164
+ | Agent | 路径 | 格式 |
165
+ |-------|------|------|
166
+ | Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
167
+ | Codex | `~/.codex/sessions/` | JSONL + SQLite |
168
+
169
+ 路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
170
+
171
+ Token Tracker 对 Agent 数据**只读**,不做任何修改。
172
+
173
+ ## 环境要求
174
+
175
+ - Python 3.11+
176
+ - [Rich](https://github.com/Textualize/rich)(自动安装)
177
+
178
+ ## License
179
+
180
+ Copyright (c) 2026 stormzhang. MIT License.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "token-tracker"
7
- version = "0.4.1"
7
+ version = "0.4.3"
8
8
  description = "Track token usage across local AI agents (Claude Code, Codex)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -28,6 +28,21 @@ _FAMILY_FALLBACK = (
28
28
  ("claude-haiku", "claude-haiku-4-5-20251001"),
29
29
  ("claude-fable", "claude-fable-5"),
30
30
  ("codex-", "gpt-5.5"),
31
+ # 国产模型系列兜底:出新版本(如 GLM-4.8、Kimi K3)litellm 未收录时退回该系列最新已知价
32
+ ("kimi", "kimi-k2.6"),
33
+ ("moonshot-v", "moonshot-v1-128k"),
34
+ ("glm-4", "glm-4.6"),
35
+ ("qwen3-coder", "qwen3-coder-plus"),
36
+ ("qwen3-max", "qwen-max"),
37
+ ("doubao-seed", "doubao-seed-1-6"),
38
+ ("doubao-1-5-pro", "doubao-1-5-pro-256k"),
39
+ ("deepseek", "deepseek-v4-flash"),
40
+ ("minimax", "MiniMax-M2"),
41
+ ("mimo", "mimo-v2.5"),
42
+ # Grok:退役 slug 按官方路由兜底(grok-code-* → build-0.1;grok-4-fast/4.1-fast/grok-3 等 → grok-4.3)
43
+ ("grok-code", "grok-build-0.1"),
44
+ ("grok-4", "grok-4.3"),
45
+ ("grok", "grok-4.3"),
31
46
  )
32
47
 
33
48
  # 解析不到定价的模型只提示一次,避免聚合时每条 entry 刷屏
@@ -195,6 +210,31 @@ _FABLE_PRICING = {
195
210
  "cache_read_input_token_cost": 1.0e-6,
196
211
  }
197
212
 
213
+ # 国产模型多以人民币计价,统一折 USD 入表,与 CC/Codex 同口径(2026-06 近似汇率)
214
+ _CNY_PER_USD = 7.1
215
+
216
+
217
+ def _cny(input_m: float, output_m: float, cache_read_m: float | None = None) -> dict:
218
+ """人民币「元 / 百万 tokens」→ USD per token(÷汇率 ÷1e6)。国产模型按中国站人民币价折算。"""
219
+ info = {
220
+ "input_cost_per_token": input_m / _CNY_PER_USD * 1e-6,
221
+ "output_cost_per_token": output_m / _CNY_PER_USD * 1e-6,
222
+ }
223
+ if cache_read_m is not None:
224
+ info["cache_read_input_token_cost"] = cache_read_m / _CNY_PER_USD * 1e-6
225
+ return info
226
+
227
+
228
+ def _usd(input_m: float, output_m: float, cache_read_m: float | None = None) -> dict:
229
+ """美元「$ / 百万 tokens」→ USD per token(÷1e6)。用于只有官方国际站 USD 价的模型。"""
230
+ info = {
231
+ "input_cost_per_token": input_m * 1e-6,
232
+ "output_cost_per_token": output_m * 1e-6,
233
+ }
234
+ if cache_read_m is not None:
235
+ info["cache_read_input_token_cost"] = cache_read_m * 1e-6
236
+ return info
237
+
198
238
 
199
239
  def _fallback_pricing() -> dict:
200
240
  return {
@@ -249,4 +289,47 @@ def _fallback_pricing() -> dict:
249
289
  "output_cost_per_token": 6e-6,
250
290
  "cache_read_input_token_cost": 0.375e-6,
251
291
  },
292
+ # ---- 国产模型(2026-06 官方核实)。除 GLM 用 z.ai 国际站 USD 外,其余按各家中国站
293
+ # 人民币价 ÷7.1 折算;阶梯定价模型(Qwen3-Coder / Doubao)统一取 0-32K 基础档。----
294
+ # Kimi / Moonshot(platform.kimi.com 官方人民币价;老 kimi-k2-instruct 已 EOL,靠系列兜底)
295
+ "kimi-k2.7-code": _cny(6.5, 27, 1.3),
296
+ "kimi-k2.6": _cny(6.5, 27, 1.1),
297
+ "kimi-k2.5": _cny(4, 21, 0.7),
298
+ "moonshot-v1-8k": _cny(2, 10),
299
+ "moonshot-v1-32k": _cny(5, 20),
300
+ "moonshot-v1-128k": _cny(10, 30),
301
+ # 智谱 GLM(z.ai 国际站官方 USD;中国站按量完整价含缓存无法从官方 SPA 取得,国内口径可能偏高)
302
+ "glm-4.6": _usd(0.6, 2.2, 0.11),
303
+ "glm-4.5": _usd(0.6, 2.2, 0.11),
304
+ "glm-4.5-air": _usd(0.2, 1.1, 0.03),
305
+ "glm-4.7": _usd(0.6, 2.2, 0.11),
306
+ "glm-5": _usd(1.0, 3.2, 0.2),
307
+ # 阿里 Qwen(中国站百炼人民币价,0-32K 基础档)
308
+ "qwen3-coder-plus": _cny(4, 16, 0.4),
309
+ "qwen-max": _cny(2.5, 10),
310
+ "qwen-plus": _cny(0.8, 2),
311
+ # 火山方舟 Doubao(中国站人民币价,0-32K 基础档)
312
+ "doubao-seed-1-6": _cny(0.8, 8),
313
+ "doubao-seed-code": _cny(1.2, 8),
314
+ "doubao-1-5-pro-32k": _cny(0.8, 2, 0.16),
315
+ "doubao-1-5-pro-256k": _cny(5, 9),
316
+ # DeepSeek(官方中国站人民币价;chat/reasoner 现映射 V4-Flash,2026-07-24 弃用旧名)
317
+ "deepseek-v4-flash": _cny(1, 2, 0.02),
318
+ "deepseek-v4-pro": _cny(3, 6, 0.025),
319
+ "deepseek-chat": _cny(1, 2, 0.02),
320
+ "deepseek-reasoner": _cny(1, 2, 0.02),
321
+ # MiniMax(官方 USD,与中国站÷7 自洽;M2/M2.1/M2.5 同价 legacy)
322
+ "MiniMax-M2": _usd(0.3, 1.2, 0.03),
323
+ "MiniMax-M2.1": _usd(0.3, 1.2, 0.03),
324
+ "MiniMax-M2.5": _usd(0.3, 1.2, 0.03),
325
+ "MiniMax-M2.7": _usd(0.3, 1.2, 0.06),
326
+ "MiniMax-M3": _usd(0.3, 1.2, 0.06),
327
+ # 小米 MiMo(mimo.mi.com 官方中国站人民币价;与 DeepSeek 同价,V2.5-Pro 主攻 agentic 编程)
328
+ "mimo-v2.5-pro": _cny(3, 6, 0.025),
329
+ "mimo-v2.5": _cny(1, 2, 0.02),
330
+ # xAI Grok(docs.x.ai 官方 USD)。2026-05-15 退役潮:grok-4-fast/4.1-fast/grok-3 路由到 grok-4.3,
331
+ # grok-code-fast-1 退役为 grok-build-0.1 别名(退役 slug 靠 _FAMILY_FALLBACK 接住)。grok-4.3 取 ≤200K 默认档。
332
+ "grok-4.3": _usd(1.25, 2.5, 0.2),
333
+ "grok-build-0.1": _usd(1.0, 2.0, 0.2),
334
+ "grok-code-fast-1": _usd(1.0, 2.0, 0.2),
252
335
  }
@@ -386,18 +386,15 @@ def main():
386
386
  update_hook()
387
387
 
388
388
  # 升级感知:新版若新增了值得重配的选项(SETUP_VERSION bump),老用户跑任意命令时
389
- # 真终端直接弹一次 wizard;非 tty / 会话内只打印一行提示、不打断。
390
- # wizard 内部最终会调 setup() save_setup_version(),下次启动不再触发。
389
+ # 自动走一遍 setup——_run_setup_flow 内部分流:真终端弹 wizard、会话内 / 非 tty 静默
390
+ # _auto_setup 用默认值全装(语言跟随系统 / mocha / 组件全开)。两者最终都 save_setup_version()
391
+ # 下次启动 setup_version 已是最新、不再触发。
391
392
  if (
392
393
  command not in ("setup", "unsetup")
393
394
  and is_setup()
394
395
  and config.setup_version() < config.SETUP_VERSION
395
396
  ):
396
- if _should_run_wizard():
397
- from .wizard import run_wizard
398
- run_wizard()
399
- else:
400
- get_console().print(f"[dim]{t('setup_outdated_hint')}[/dim]")
397
+ _run_setup_flow()
401
398
 
402
399
  if command == "setup":
403
400
  _run_setup_flow()
@@ -18,10 +18,11 @@ CONFIG_DIR = os.path.expanduser("~/.config/token-tracker")
18
18
  CONFIG_PATH = os.path.join(CONFIG_DIR, "config.json")
19
19
  SCHEMA_VERSION = 1
20
20
 
21
- # 引导版本:每次新增"值得让老用户重新走一遍 wizard"的配置项时手动 +1
22
- # 老用户 config 里没这字段 读出 0 → 触发重新引导(真终端弹 wizard、非 tty 仅提示)。
21
+ # 引导版本:每次新增"值得让老用户重新走一遍 setup"的配置项时手动 +1(只能整数、一次 +1)。
22
+ # 老用户 config 里没这字段 / 旧版本号 < 当前 → 触发重新引导(真终端弹 wizard、非 tty 静默 _auto_setup)。
23
23
  # 跟 SCHEMA_VERSION 解耦:那是数据格式版本,这是用户引导版本,bump 节奏完全不同。
24
- SETUP_VERSION = 1
24
+ # 2(0.4.2):强制所有现存用户(0.3.8/0.4.0=无字段=0、0.4.1=1,全 < 2)升级后重走一遍 setup。
25
+ SETUP_VERSION = 2
25
26
 
26
27
  # 旧位置(独立 theme.json / lang.json),老用户首次读 config.json 不存在时自动合并迁移
27
28
  _LEGACY_THEME_PATH = os.path.join(CONFIG_DIR, "theme.json")
@@ -50,7 +50,6 @@ _STRINGS = {
50
50
  "col_cache_read": "Cache读取",
51
51
  "model_breakdown": "模型分布",
52
52
  "col_ratio": "占比",
53
- "col_duration": "活跃/时长",
54
53
  "daily_panel_title": "当日数据面板 (P90)",
55
54
  "msg_unit": "{n} 条",
56
55
  "session_msg": "会话: {sessions} 消息: {msgs}",
@@ -72,8 +71,7 @@ _STRINGS = {
72
71
  "active_days": "活跃天数",
73
72
  "weekday_grid": "周日,周一,周二,周三,周四,周五,周六", # 热力图左侧行标签(周日开头)
74
73
  "month_short": "1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月", # 热力图月份表头
75
- "unit_day": "天", # 时长 / 连续天数单位
76
- "unit_hour": "小时", # 时长单位
74
+ "unit_day": "天", # 连续天数单位(daily streak)
77
75
  # --- theme (cli.py) ---
78
76
  "theme_current": "当前主题: {name}{src}",
79
77
  "theme_src_env": "(来自环境变量 TT_THEME)",
@@ -100,9 +98,8 @@ _STRINGS = {
100
98
  "wizard_signoff": "祝你使用愉快",
101
99
  # --- hooks.py ---
102
100
  "no_agent_install": "未检测到 Claude Code 或 Codex,请先安装其中之一",
103
- "auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha / 组件全开)配置;如需自定义请在终端运行 tt setup",
101
+ "auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha / 组件全开)配置\n如需自定义请在终端运行 tt setup",
104
102
  "first_setup": "首次使用,正在配置状态栏...",
105
- "setup_outdated_hint": "检测到新版本新增了配置项;请在终端运行 tt setup 体验",
106
103
  "cc_not_found": "未检测到 Claude Code,跳过",
107
104
  "codex_not_found": "未检测到 Codex,跳过",
108
105
  "sl_backup_replace": "检测到已有 statusLine,备份后替换",
@@ -168,7 +165,6 @@ _STRINGS = {
168
165
  "col_cache_read": "Cache Read",
169
166
  "model_breakdown": "Model Distribution",
170
167
  "col_ratio": "Ratio",
171
- "col_duration": "Active/Duration",
172
168
  "daily_panel_title": "Daily Panel (P90)",
173
169
  "msg_unit": "{n}",
174
170
  "session_msg": "Sessions: {sessions} Messages: {msgs}",
@@ -190,8 +186,7 @@ _STRINGS = {
190
186
  "active_days": "Active Days",
191
187
  "weekday_grid": "Sun,Mon,Tue,Wed,Thu,Fri,Sat", # 热力图左侧行标签(Sun 开头)
192
188
  "month_short": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", # 热力图月份表头
193
- "unit_day": "d", # 时长 / 连续天数单位
194
- "unit_hour": "h", # 时长单位
189
+ "unit_day": "d", # 连续天数单位(daily streak)
195
190
  # --- theme (cli.py) ---
196
191
  "theme_current": "Current theme: {name}{src}",
197
192
  "theme_src_env": " (from env TT_THEME)",
@@ -218,9 +213,8 @@ _STRINGS = {
218
213
  "wizard_signoff": "Enjoy!",
219
214
  # --- hooks.py ---
220
215
  "no_agent_install": "Claude Code or Codex not detected, please install one first",
221
- "auto_setup_hint": "Non-interactive env — configured with defaults (language follows system / theme mocha / all components on); run tt setup in a terminal to customize",
216
+ "auto_setup_hint": "Non-interactive env — configured with defaults (language follows system / theme mocha / all components on)\nRun tt setup in a terminal to customize",
222
217
  "first_setup": "First run, configuring status bar...",
223
- "setup_outdated_hint": "New configuration options added in this release — run tt setup in a terminal to try them",
224
218
  "cc_not_found": "Claude Code not detected, skipping",
225
219
  "codex_not_found": "Codex not detected, skipping",
226
220
  "sl_backup_replace": "Existing statusLine detected, backing up and replacing",