token-tracker 0.4.2__tar.gz → 0.4.4__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.
- {token_tracker-0.4.2/src/token_tracker.egg-info → token_tracker-0.4.4}/PKG-INFO +62 -72
- token_tracker-0.4.4/README.md +180 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/pyproject.toml +1 -1
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/hooks.py +5 -2
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/i18n.py +4 -8
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/format.py +0 -14
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/status.py +2 -5
- {token_tracker-0.4.2 → token_tracker-0.4.4/src/token_tracker.egg-info}/PKG-INFO +62 -72
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_aggregator.py +0 -11
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_hooks.py +13 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_status.py +6 -8
- token_tracker-0.4.2/README.md +0 -190
- {token_tracker-0.4.2 → token_tracker-0.4.4}/LICENSE +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/setup.cfg +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/__init__.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/__init__.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/claude.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/codex.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/rate_limits.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/registry.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/types.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/adapters/util.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/__init__.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/aggregator.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/blocks.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/analyzer/cost.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/cli.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/config.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/__init__.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/console.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/heatmap.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/panels.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/tables.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/theme.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/ui/themes.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker/wizard.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/SOURCES.txt +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/dependency_links.txt +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/entry_points.txt +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/requires.txt +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/src/token_tracker.egg-info/top_level.txt +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_blocks.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_cli.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_codex.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_cost.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_heatmap.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_tables.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/tests/test_theme.py +0 -0
- {token_tracker-0.4.2 → token_tracker-0.4.4}/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.
|
|
3
|
+
Version: 0.4.4
|
|
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
|
+

|
|
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
|
|
80
|
+
`tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
|
|
81
|
+
|
|
82
|
+
### Claude Code(官方接口)
|
|
67
83
|
|
|
68
|
-
|
|
84
|
+
基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
|
|
69
85
|
|
|
70
86
|

|
|
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
|
-
|
|
108
|
+
</details>
|
|
109
|
+
|
|
110
|
+
### Codex(伪 statusline,业界首创)
|
|
111
|
+
|
|
112
|
+
Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
|
|
92
113
|
|
|
93
114
|

|
|
94
115
|
|
|
95
|
-
|
|
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
|
-
|
|
121
|
+
渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
|
|
101
122
|
|
|
102
|
-
##
|
|
123
|
+
## 报表速览
|
|
103
124
|
|
|
104
|
-
`tt
|
|
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
|
-
|
|
127
|
+

|
|
109
128
|
|
|
110
|
-
|
|
129
|
+
`tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
|
|
111
130
|
|
|
112
|
-

|
|
113
132
|
|
|
114
|
-
|
|
133
|
+
`tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
|
|
115
134
|
|
|
116
|
-

|
|
117
136
|
|
|
118
|
-
|
|
137
|
+
`tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
|
|
119
138
|
|
|
120
|
-
-
|
|
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
|
+

|
|
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
|
-
>
|
|
150
|
+
> **卸载**:`tt unsetup`
|
|
140
151
|
|
|
141
152
|
## 使用
|
|
142
153
|
|
|
143
154
|
```bash
|
|
144
155
|
tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
|
|
145
|
-
tt # 过去一年 token 热力图 +
|
|
156
|
+
tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
|
|
146
157
|
tt daily # 同上(tt 无参即进 daily)
|
|
147
|
-
tt status # 过去 5h
|
|
148
|
-
tt weekly #
|
|
149
|
-
tt monthly #
|
|
150
|
-
tt sessions # 最近 20
|
|
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
|
+

|
|
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
|
-
-
|
|
186
|
-
-
|
|
187
|
-
|
|
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
|
|
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
|
+
  
|
|
8
|
+
|
|
9
|
+
[English](README_EN.md)
|
|
10
|
+
|
|
11
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
75
|
+
|
|
76
|
+
`tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
|
|
77
|
+
|
|
78
|
+

|
|
79
|
+
|
|
80
|
+
`tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+
`tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
|
|
85
|
+
|
|
86
|
+

|
|
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
|
+

|
|
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.
|
|
@@ -690,7 +690,8 @@ _CODEX_STATUSLINE_REGEX = re.compile(
|
|
|
690
690
|
r'\n*\[\[hooks\.Stop\]\]\s*'
|
|
691
691
|
r'\[\[hooks\.Stop\.hooks\]\]\s*'
|
|
692
692
|
r'type = "command"\s*'
|
|
693
|
-
|
|
693
|
+
# command 兼容双引号 basic string(老用户已装)和单引号 literal string(修了 Windows 路径转义后的新装)
|
|
694
|
+
r'command = ["\'][^"\']*(?:codex-statusline|tt-statusline)[^"\']*["\']\s*'
|
|
694
695
|
r'timeout = \d+\s*'
|
|
695
696
|
)
|
|
696
697
|
|
|
@@ -712,7 +713,9 @@ def _install_codex_statusline(content: str, python: str) -> str:
|
|
|
712
713
|
"\n\n[[hooks.Stop]]\n\n"
|
|
713
714
|
"[[hooks.Stop.hooks]]\n"
|
|
714
715
|
'type = "command"\n'
|
|
715
|
-
|
|
716
|
+
# 用 TOML literal string(单引号)包裹 command,避免 Windows 反斜杠路径被当转义符
|
|
717
|
+
# 解析失败(如 `C:\Users\...` 里的 `\U` 被识别为 unicode 转义起始)
|
|
718
|
+
f"command = '{cmd}'\n"
|
|
716
719
|
"timeout = 10\n"
|
|
717
720
|
)
|
|
718
721
|
|
|
@@ -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,7 +98,7 @@ _STRINGS = {
|
|
|
100
98
|
"wizard_signoff": "祝你使用愉快",
|
|
101
99
|
# --- hooks.py ---
|
|
102
100
|
"no_agent_install": "未检测到 Claude Code 或 Codex,请先安装其中之一",
|
|
103
|
-
"auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha /
|
|
101
|
+
"auto_setup_hint": "非交互环境,已按默认(语言跟随系统 / 主题 mocha / 组件全开)配置\n如需自定义请在终端运行 tt setup",
|
|
104
102
|
"first_setup": "首次使用,正在配置状态栏...",
|
|
105
103
|
"cc_not_found": "未检测到 Claude Code,跳过",
|
|
106
104
|
"codex_not_found": "未检测到 Codex,跳过",
|
|
@@ -167,7 +165,6 @@ _STRINGS = {
|
|
|
167
165
|
"col_cache_read": "Cache Read",
|
|
168
166
|
"model_breakdown": "Model Distribution",
|
|
169
167
|
"col_ratio": "Ratio",
|
|
170
|
-
"col_duration": "Active/Duration",
|
|
171
168
|
"daily_panel_title": "Daily Panel (P90)",
|
|
172
169
|
"msg_unit": "{n}",
|
|
173
170
|
"session_msg": "Sessions: {sessions} Messages: {msgs}",
|
|
@@ -189,8 +186,7 @@ _STRINGS = {
|
|
|
189
186
|
"active_days": "Active Days",
|
|
190
187
|
"weekday_grid": "Sun,Mon,Tue,Wed,Thu,Fri,Sat", # 热力图左侧行标签(Sun 开头)
|
|
191
188
|
"month_short": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", # 热力图月份表头
|
|
192
|
-
"unit_day": "d", #
|
|
193
|
-
"unit_hour": "h", # 时长单位
|
|
189
|
+
"unit_day": "d", # 连续天数单位(daily streak)
|
|
194
190
|
# --- theme (cli.py) ---
|
|
195
191
|
"theme_current": "Current theme: {name}{src}",
|
|
196
192
|
"theme_src_env": " (from env TT_THEME)",
|
|
@@ -217,7 +213,7 @@ _STRINGS = {
|
|
|
217
213
|
"wizard_signoff": "Enjoy!",
|
|
218
214
|
# --- hooks.py ---
|
|
219
215
|
"no_agent_install": "Claude Code or Codex not detected, please install one first",
|
|
220
|
-
"auto_setup_hint": "Non-interactive env — configured with defaults (language follows system / theme mocha / all components on)
|
|
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",
|
|
221
217
|
"first_setup": "First run, configuring status bar...",
|
|
222
218
|
"cc_not_found": "Claude Code not detected, skipping",
|
|
223
219
|
"codex_not_found": "Codex not detected, skipping",
|
|
@@ -5,7 +5,6 @@ from zoneinfo import ZoneInfo
|
|
|
5
5
|
|
|
6
6
|
from rich.text import Text
|
|
7
7
|
|
|
8
|
-
from ..i18n import t
|
|
9
8
|
from .console import get_console
|
|
10
9
|
from .theme import _S
|
|
11
10
|
|
|
@@ -124,19 +123,6 @@ def _fmt_cost(usd: float) -> str:
|
|
|
124
123
|
return "$0"
|
|
125
124
|
|
|
126
125
|
|
|
127
|
-
def _fmt_session_duration(active_minutes: float, span_minutes: float) -> str:
|
|
128
|
-
"""组合显示「活跃 / 跨度」:活跃恒用小数小时(9.4h);跨度 ≥1 天用 天d时h(22d14h,整天省为 22d),<1 天用小数小时(6.0h)。单位 d/h 跟随语言。"""
|
|
129
|
-
hour, day = t("unit_hour"), t("unit_day")
|
|
130
|
-
active = f"{active_minutes / 60:.1f}{hour}"
|
|
131
|
-
if span_minutes >= 1440:
|
|
132
|
-
d, rem = divmod(int(span_minutes), 1440)
|
|
133
|
-
h = rem // 60
|
|
134
|
-
span = f"{d}{day}{h}{hour}" if h else f"{d}{day}"
|
|
135
|
-
else:
|
|
136
|
-
span = f"{span_minutes / 60:.1f}{hour}"
|
|
137
|
-
return f"{active} / {span}"
|
|
138
|
-
|
|
139
|
-
|
|
140
126
|
def _display_width(s: str) -> int:
|
|
141
127
|
w = 0
|
|
142
128
|
for ch in s:
|
|
@@ -19,7 +19,6 @@ from .format import (
|
|
|
19
19
|
AGENT_LABEL,
|
|
20
20
|
AGENT_SHORT,
|
|
21
21
|
_fmt_cost,
|
|
22
|
-
_fmt_session_duration,
|
|
23
22
|
_fmt_tokens,
|
|
24
23
|
_model_short,
|
|
25
24
|
_project_short,
|
|
@@ -142,7 +141,7 @@ def _render_agent_stats(per_agent: dict) -> None:
|
|
|
142
141
|
|
|
143
142
|
def _render_sessions(sessions) -> None:
|
|
144
143
|
"""合并 session 列表:按 cost 倒序;Time 蓝 / Project 绿 / Tokens 橙 / Cost 黄;
|
|
145
|
-
Tokens·Cost 各自前三(第一红、二三粉);列序 Time·Project·Tokens·Cost·Msgs·
|
|
144
|
+
Tokens·Cost 各自前三(第一红、二三粉);列序 Time·Project·Tokens·Cost·Msgs·Model·Agent。"""
|
|
146
145
|
mode = _width_mode()
|
|
147
146
|
table = Table(title=f"{t('recent_sessions')} ({len(sessions)})", box=box.SIMPLE_HEAVY,
|
|
148
147
|
header_style="bold", padding=(0, 1), expand=False)
|
|
@@ -151,7 +150,6 @@ def _render_sessions(sessions) -> None:
|
|
|
151
150
|
table.add_column(t("col_total_tokens"), justify="right", style=_S.peach)
|
|
152
151
|
table.add_column(t("col_cost"), justify="right", style=_S.warn)
|
|
153
152
|
table.add_column(t("col_messages"), justify="right")
|
|
154
|
-
table.add_column(t("col_duration"), justify="right")
|
|
155
153
|
if mode != "compact":
|
|
156
154
|
table.add_column(t("col_model"), no_wrap=True)
|
|
157
155
|
table.add_column(t("col_agent"), no_wrap=True)
|
|
@@ -173,11 +171,10 @@ def _render_sessions(sessions) -> None:
|
|
|
173
171
|
tok_cell,
|
|
174
172
|
cost_cell,
|
|
175
173
|
str(s.message_count),
|
|
176
|
-
_fmt_session_duration(s.active_minutes, s.duration_minutes),
|
|
177
174
|
]
|
|
178
175
|
if mode != "compact":
|
|
179
176
|
names = list(s.models) or [s.model]
|
|
180
|
-
row.append(
|
|
177
|
+
row.append(_model_short(names[0]))
|
|
181
178
|
row.append(AGENT_SHORT.get(s.agent_id, s.agent_id))
|
|
182
179
|
table.add_row(*row)
|
|
183
180
|
get_console().print(Padding(table, (0, 0, 0, 2), expand=False))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: token-tracker
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
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
|
+

|
|
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
|
|
80
|
+
`tt setup` 自动为 Claude Code 和 Codex 配置状态栏,脚本更新时自动升级。
|
|
81
|
+
|
|
82
|
+
### Claude Code(官方接口)
|
|
67
83
|
|
|
68
|
-
|
|
84
|
+
基于 Claude Code 官方自定义 StatusLine 接口,**数据完全来自本地 Claude,无任何推测**。
|
|
69
85
|
|
|
70
86
|

|
|
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
|
-
|
|
108
|
+
</details>
|
|
109
|
+
|
|
110
|
+
### Codex(伪 statusline,业界首创)
|
|
111
|
+
|
|
112
|
+
Codex 官方暂不支持自定义 StatusLine。Token Tracker 通过 hook 注入了一个**伪 statusline**——每次回答完成后,在回答尾部追加两行真彩色状态栏。**这是目前业界少见的把状态栏能力在 Codex 里做出来的实现方案**。
|
|
92
113
|
|
|
93
114
|

|
|
94
115
|
|
|
95
|
-
|
|
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
|
-
|
|
121
|
+
渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
|
|
101
122
|
|
|
102
|
-
##
|
|
123
|
+
## 报表速览
|
|
103
124
|
|
|
104
|
-
`tt
|
|
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
|
-
|
|
127
|
+

|
|
109
128
|
|
|
110
|
-
|
|
129
|
+
`tt weekly` — 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
|
|
111
130
|
|
|
112
|
-

|
|
113
132
|
|
|
114
|
-
|
|
133
|
+
`tt monthly` — 月报:本月分析卡片 + 周柱状图 + 月趋势 + 项目 / 模型分布
|
|
115
134
|
|
|
116
|
-

|
|
117
136
|
|
|
118
|
-
|
|
137
|
+
`tt sessions` — 最近 20 条会话明细(按 cost 倒序,支持 `--sort` 改字段)
|
|
119
138
|
|
|
120
|
-
-
|
|
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
|
+

|
|
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
|
-
>
|
|
150
|
+
> **卸载**:`tt unsetup`
|
|
140
151
|
|
|
141
152
|
## 使用
|
|
142
153
|
|
|
143
154
|
```bash
|
|
144
155
|
tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
|
|
145
|
-
tt # 过去一年 token 热力图 +
|
|
156
|
+
tt # 过去一年 token 热力图 + 顶部三段概览(= tt daily)
|
|
146
157
|
tt daily # 同上(tt 无参即进 daily)
|
|
147
|
-
tt status # 过去 5h
|
|
148
|
-
tt weekly #
|
|
149
|
-
tt monthly #
|
|
150
|
-
tt sessions # 最近 20
|
|
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
|
+

|
|
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
|
-
-
|
|
186
|
-
-
|
|
187
|
-
|
|
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
|
|
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.
|
|
@@ -119,17 +119,6 @@ def test_aggregate_sessions_active_minutes_drops_large_gaps():
|
|
|
119
119
|
assert s.duration_minutes == round((3 * 24 * 60) + 10, 1)
|
|
120
120
|
|
|
121
121
|
|
|
122
|
-
def test_fmt_session_duration_combines_active_and_span():
|
|
123
|
-
from token_tracker.i18n import t
|
|
124
|
-
from token_tracker.ui.format import _fmt_session_duration
|
|
125
|
-
h, d = t("unit_hour"), t("unit_day") # 单位跟随语言,断言保持语言无关
|
|
126
|
-
# 活跃恒小数小时;跨度 ≥1 天用 天d时h(整天省略小时),<1 天用小数小时
|
|
127
|
-
assert _fmt_session_duration(564, 32520) == f"9.4{h} / 22{d}14{h}" # 主例:活跃 9h24m / 跨度 22d14h
|
|
128
|
-
assert _fmt_session_duration(9 * 60, 22 * 24 * 60) == f"9.0{h} / 22{d}" # 整天跨度省略小时
|
|
129
|
-
assert _fmt_session_duration(5 * 60, 6 * 60) == f"5.0{h} / 6.0{h}" # 跨度 <1 天用小数小时
|
|
130
|
-
assert _fmt_session_duration(45, 90) == f"0.8{h} / 1.5{h}" # 活跃/跨度均不足 1h/1 天
|
|
131
|
-
|
|
132
|
-
|
|
133
122
|
def test_aggregate_fills_projects_by_token():
|
|
134
123
|
# projects 维度(weekly 项目分布用):按 project 累加 token,与 models 同机制
|
|
135
124
|
d = datetime(2026, 1, 1, 10, tzinfo=UTC)
|
|
@@ -80,6 +80,19 @@ def test_codex_statusline_install_uninstall_roundtrip(tmp_path, monkeypatch):
|
|
|
80
80
|
assert "tt-statusline" not in removed and 'command = "mine"' in removed
|
|
81
81
|
|
|
82
82
|
|
|
83
|
+
def test_codex_statusline_windows_path_toml_parses(tmp_path, monkeypatch):
|
|
84
|
+
# 回归:Windows 路径含 \U \A \P 等被 TOML basic string 当 unicode 转义起始符(issue 用户反馈)
|
|
85
|
+
# —— 写入的 command 必须用 literal string(单引号)包裹,写出来后能被 tomllib 原样解析回来。
|
|
86
|
+
import tomllib
|
|
87
|
+
monkeypatch.setattr(hooks, "CODEX_STATUSLINE_HOOK_PATH",
|
|
88
|
+
r"C:\Users\test\.config\token-tracker\codex-statusline.py")
|
|
89
|
+
py = r"C:\Users\test\AppData\Local\Programs\Python\Python313\python.exe"
|
|
90
|
+
content = hooks._install_codex_statusline("", py)
|
|
91
|
+
parsed = tomllib.loads(content) # 旧 bug:basic string 下 \U 等触发 TOML 解析错误
|
|
92
|
+
assert parsed["hooks"]["Stop"][0]["hooks"][0]["command"] == \
|
|
93
|
+
rf"{py} C:\Users\test\.config\token-tracker\codex-statusline.py"
|
|
94
|
+
|
|
95
|
+
|
|
83
96
|
def test_codex_statusline_version_roundtrip(tmp_path, monkeypatch):
|
|
84
97
|
# _installed_codex_statusline_version 读回的版本应与写入的 STATUSLINE_HOOK_VERSION 一致,
|
|
85
98
|
# 保证 needs_update 不会因解析偏差而误判。
|
|
@@ -26,13 +26,14 @@ def test_build_status_data_merges_and_per_agent(monkeypatch):
|
|
|
26
26
|
# 头图合并汇总 + per-agent 拆分 + session 合并带 agent_id 且按 cost 倒序(entries 给跨度,避免被 0min 过滤)。
|
|
27
27
|
now = datetime.now(UTC)
|
|
28
28
|
data_map = {
|
|
29
|
+
# 用「现在前 1 小时内」避免 UTC 凌晨跑 CI 时跨日被 _build_status_data 今天过滤掉
|
|
29
30
|
"claude-code": [ # s1 跨度 10min
|
|
30
|
-
_entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(
|
|
31
|
-
_entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=
|
|
31
|
+
_entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=30), out=500),
|
|
32
|
+
_entry("claude-code", "s1", "claude-opus-4-8", now - timedelta(minutes=20), out=100),
|
|
32
33
|
],
|
|
33
34
|
"codex": [ # s2 跨度 6min
|
|
34
|
-
_entry("codex", "s2", "gpt-5", now - timedelta(
|
|
35
|
-
_entry("codex", "s2", "gpt-5", now - timedelta(
|
|
35
|
+
_entry("codex", "s2", "gpt-5", now - timedelta(minutes=40), out=20),
|
|
36
|
+
_entry("codex", "s2", "gpt-5", now - timedelta(minutes=34), out=10),
|
|
36
37
|
],
|
|
37
38
|
}
|
|
38
39
|
monkeypatch.setattr(cli, "_load_entries", lambda aid, hours_back=0: data_map.get(aid, []))
|
|
@@ -74,7 +75,7 @@ def test_build_status_data_empty(monkeypatch):
|
|
|
74
75
|
|
|
75
76
|
|
|
76
77
|
def test_render_status_with_limits(monkeypatch):
|
|
77
|
-
# 有订阅额度 → 额度段(weekly 样式);session 强制 source
|
|
78
|
+
# 有订阅额度 → 额度段(weekly 样式);session 强制 source 列。
|
|
78
79
|
monkeypatch.setattr("token_tracker.ui.status.forced_color_console", contextlib.nullcontext)
|
|
79
80
|
now = datetime.now(UTC)
|
|
80
81
|
summary = StatusSummary(total_tokens=1000, cost_usd=1.5, message_count=5, session_count=2,
|
|
@@ -98,9 +99,6 @@ def test_render_status_with_limits(monkeypatch):
|
|
|
98
99
|
assert "Cost:" in out and "$12" in out # 当天 cost
|
|
99
100
|
assert "Model:" in out and "Opus 4.8" in out # model(去掉 (1M context) 后缀)
|
|
100
101
|
assert "Claude" in out and "Codex" in out # session Agent 列(短名 Claude / Codex)
|
|
101
|
-
from token_tracker.i18n import t
|
|
102
|
-
h = t("unit_hour") # 单位跟随语言
|
|
103
|
-
assert f"1.1{h} / 1.1{h}" in out # Duration 组合:活跃 / 跨度(65min 连续会话,小数小时)
|
|
104
102
|
|
|
105
103
|
|
|
106
104
|
def test_render_status_no_limits_shows_agent_stats(monkeypatch):
|
token_tracker-0.4.2/README.md
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
# Token Tracker (tt)
|
|
2
|
-
|
|
3
|
-
本地 AI Agent Token 消耗追踪/分析工具,支持 **Claude Code** 和 **Codex** 。
|
|
4
|
-
|
|
5
|
-
自定义 StatusLine 状态栏 + CLI Dashboard,实时查看 token 用量、等效成本、限额状态。
|
|
6
|
-
|
|
7
|
-
  
|
|
8
|
-
|
|
9
|
-
[English](README_EN.md)
|
|
10
|
-
|
|
11
|
-
## StatusLine 状态栏
|
|
12
|
-
|
|
13
|
-
自动为 Claude Code 和 Codex 配置状态栏,`tt setup` 一键配置,脚本更新时自动升级。
|
|
14
|
-
|
|
15
|
-
**Claude Code**:基于官方自定义 StatusLine 接口,数据完全来自本地 Claude,准确无任何推测
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
状态栏共四行,从左到右:
|
|
20
|
-
|
|
21
|
-
| 行 | 字段 | 说明 |
|
|
22
|
-
|----|------|------|
|
|
23
|
-
| 1 | `[项目](分支 +12 -3)` | 项目名(加粗)+ Git 分支(未提交修改标 `*`),括号内附工作区相对 HEAD 的增删行数 |
|
|
24
|
-
| 1 | `Total: 1.2M` | 本次会话累计消耗 token(输入+输出+cache,解析 transcript 得出) |
|
|
25
|
-
| 1 | `Cost: $35.51` | 本次会话等效成本(Claude Code 自带,按官方计费,准确) |
|
|
26
|
-
| 1 | `Code: +208 -8` | 本会话 Claude 写 / 删的代码行数(`+` 绿 `-` 红,与 git 变动同配色) |
|
|
27
|
-
| 2 | `Limit: 5h: ██░ 31% (1h19m)` | 5 小时滑动窗口配额(仅订阅模式;括号内重置倒计时) |
|
|
28
|
-
| 2 | `7d: ██░ 11% (5d8h)` | 7 天滑动窗口配额 |
|
|
29
|
-
| 2 | `1.0M Ctx: ██░ 20%` | 上下文窗口总大小及已用占比 |
|
|
30
|
-
| 3 | `Tokens: in 392k, out 937, cache 388k` | **当前上下文窗口**的 token 构成(注意:非会话累计,会随 compact 变化) |
|
|
31
|
-
| 3 | `Out TPS: 60 tokens/s` | 本轮 output token 生成速度(含 thinking;空闲帧保留上次值) |
|
|
32
|
-
| 4 | `Model: Opus 4.8/xhigh/nofast` | 模型名 / reasoning 级别 / 是否 fast 模式 |
|
|
33
|
-
| 4 | `Duration: 1h33m` | 当前会话已持续时间 |
|
|
34
|
-
| 4 | `Remote: github` | 代码仓库 host(去顶级域) |
|
|
35
|
-
|
|
36
|
-
> 终端宽度不足时会自动降级:先隐藏重置倒计时,再将进度条简化为百分比数字。**API 模式**无订阅配额,第 2 行只显示 Ctx。
|
|
37
|
-
|
|
38
|
-
**Codex**:官方暂不支持自定义 StatusLine,`tt setup` 通过 Codex `Stop` hook 装一个**伪 statusline**——每次回答完成后在回答尾部追加**两行**彩色 status,仿 Claude Code 状态栏(不再接管 Codex 官方 `status_line`,伪 statusline 信息比官方字段更全):
|
|
39
|
-
|
|
40
|
-

|
|
41
|
-
|
|
42
|
-
**伪 statusline 两行布局**:
|
|
43
|
-
|
|
44
|
-
- **L1** `[项目](分支 +A -D) | Total: <会话累计 token> | Model: <模型 推理强度>` —— Total 橙、Model 红
|
|
45
|
-
- **L2** `Limit: 5h <进度条> % (reset <倒计时>) | 7d <进度条> % (reset <倒计时>) | <窗口> Ctx <进度条> %`
|
|
46
|
-
|
|
47
|
-
通过 `Stop` hook 注入 `systemMessage` 实现,渲染 24-bit 真彩色、**不进模型上下文**(实测),**配色跟随当前主题**(与 CLI 报表 / CC 状态栏同源,`tt theme` 切换三者一起变)。`tt unsetup` 一并移除。
|
|
48
|
-
|
|
49
|
-
## Daily 概览和 日/周/月 数据报表分析
|
|
50
|
-
|
|
51
|
-
`tt`(无参)/ `tt daily`:默认入口,GitHub 风格 token 贡献热力图 + 顶部**单一卡片**内拼三段概览(**Last 12 months / This Month / This Week**,粗→细)。
|
|
52
|
-
- Last 12 months:橙色 Tokens / Cost / Sessions / Avg/Cost / 活跃天数 + 蓝色 单日峰值 / 当前·最长连续活跃天数
|
|
53
|
-
- This Month / This Week:橙色 Tokens / Cost / Avg/Cost / 活跃天数,**带环比**(↑/↓ 上月 / 上周)
|
|
54
|
-
|
|
55
|
-
`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 前三名高亮)。所有时间按**系统时区**显示,配色跟随当前主题。
|
|
56
|
-
|
|
57
|
-

|
|
58
|
-
|
|
59
|
-

|
|
60
|
-
|
|
61
|
-

|
|
62
|
-
|
|
63
|
-

|
|
64
|
-
|
|
65
|
-
## 功能
|
|
66
|
-
|
|
67
|
-
- **多 Agent 追踪** — Claude Code + Codex 统一面板,左右键切换
|
|
68
|
-
- **状态栏集成** — Claude Code statusLine + Codex status_line,首次运行自动配置,脚本更新自动升级
|
|
69
|
-
- **限额监控** — 实时 5h / 7d 配额百分比 + 重置倒计时
|
|
70
|
-
- **成本分析** — 按会话、日、周、月维度的等效成本统计,多 Agent 按来源分组展示
|
|
71
|
-
- **定价识别** — litellm 在线定价 + 内置官方价双层兜底;同系列新模型自动套用本档定价(含 Claude Fable 5 / Opus 4.8),全新系列缺价时明确提示,不静默按 $0 统计
|
|
72
|
-
- **会话洞察** — 项目、模型、时长、消息数一览
|
|
73
|
-
- **多主题统一配色** — 6 套主题(Catppuccin Mocha/Latte/Frappe/Macchiato + Nord + Dracula),CLI 报表、CC 状态栏与 Codex 伪 statusline **三者同源**;`tt theme` 一键切换 / 预览,暗 / 亮终端自动选 Catppuccin,首次运行交互向导引导选择,`TT_THEME` 可覆盖;终端不支持 truecolor 时自动降级到 256 色近似
|
|
74
|
-
- **零配置** — 自动检测已安装的 Agent,直接读取本地数据
|
|
75
|
-
- **隐私安全** — 数据纯本地存储,不采集、不上传任何用户信息,极轻量无后顾之忧
|
|
76
|
-
|
|
77
|
-
## 安装
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
curl -sSL https://raw.githubusercontent.com/stormzhang/token-tracker/main/install.sh | bash
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
脚本自动选最优安装方式(uv / pipx / 私有 venv),绕开 PEP 668、不污染系统 Python。
|
|
84
|
-
|
|
85
|
-
> **升级**:重跑上面的命令即可(脚本幂等、自动升到最新)。
|
|
86
|
-
> **卸载**:先 `tt unsetup` 还原状态栏,再按装法移除(`uv tool uninstall token-tracker` / `pipx uninstall token-tracker` / 删 `~/.local/share/token-tracker` 与 `~/.local/bin/tt`)。
|
|
87
|
-
|
|
88
|
-
## 使用
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
tt setup # 交互配置向导(终端:上下键选语言 / 主题 / 各组件);非 tty 环境自动全装
|
|
92
|
-
tt # 过去一年 token 热力图 + 顶部三段概览(Last 12 months / This Month / This Week,= tt daily)
|
|
93
|
-
tt daily # 同上(tt 无参即进 daily)
|
|
94
|
-
tt status # 过去 5h 实时面板(合并概览 + 5h/7d 额度 + 近期会话)
|
|
95
|
-
tt weekly # 周报:本周分析卡片 + 每日趋势柱状图 + 周 / 项目 / 模型趋势
|
|
96
|
-
tt monthly # 按月汇总(多 Agent 分组展示)
|
|
97
|
-
tt sessions # 最近 20 条会话明细(按 cost 倒序展示;tt sessions <n> 改条数、--sort 改排序)
|
|
98
|
-
tt theme # 查看 / 切换配色主题(show / list / set / preview)
|
|
99
|
-
tt unsetup # 卸载并恢复安装前的配置
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
> 💡 `tt daily` 是 GitHub 风格的 token 贡献热力图(深浅绿方格)。在 Claude Code 会话里输入 `!tt daily` 即可看到彩色热力图 —— 用户主动用 `!` 执行的命令,Claude Code 会渲染其 24-bit 真彩色输出。
|
|
103
|
-
|
|
104
|
-
### 首次运行向导
|
|
105
|
-
|
|
106
|
-
第一次跑 `tt`(或通过 curl 一键安装脚本装完自动启动)会进入**交互式配置向导**,全程上下键选 + 回车确认:
|
|
107
|
-
|
|
108
|
-
1. **选语言** — 中文 / English(落 `~/.config/token-tracker/config.json`,之后所有命令跟随)
|
|
109
|
-
2. **选配色主题** — 6 套主题上下键选择,每个选项右侧内联色板预览
|
|
110
|
-
3. **启用 Codex 伪 statusline** — Yes/No,默认 Yes(仅检测到 Codex 时)
|
|
111
|
-
|
|
112
|
-
选完给一份键值对齐的配置总结 + 重启 / 下一步提示。CI / 非 tty 环境(Docker / 脚本)自动按默认全装:**语言跟随系统设置**(读系统语言、不被 CLI 的 `LANG` 误导)、主题 mocha、组件全开。装好后想改任何一项,再跑一次 `tt setup` 即可(终端里每次 `tt setup` 都进向导)。
|
|
113
|
-
|
|
114
|
-
### 配色主题
|
|
115
|
-
|
|
116
|
-
内置 6 套主题,CLI 报表、CC 状态栏与 Codex 伪 statusline **统一同源**(切主题三者一起变):
|
|
117
|
-
|
|
118
|
-
| 主题 | 说明 |
|
|
119
|
-
|------|------|
|
|
120
|
-
| `mocha` / `latte` / `frappe` / `macchiato` | Catppuccin 全家(暗 / 亮终端自动选 mocha / latte) |
|
|
121
|
-
| `nord` | Nord |
|
|
122
|
-
| `dracula` | Dracula |
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
tt theme # 显示当前主题及来源
|
|
126
|
-
tt theme list # 列出全部主题 + 色块预览
|
|
127
|
-
tt theme preview nord # 预览某主题(CLI 样例 + 状态栏样例行)
|
|
128
|
-
tt theme set nord # 切换主题(持久化 + 重烘焙状态栏)
|
|
129
|
-
tt monthly --theme nord # 任意报表临时换主题渲染(不持久化、不动状态栏,适合对比)
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
- **首次运行**(终端内、非 AI 会话)会进入交互向导引导选主题;CI / 脚本 / 会话内自动跳过、静默用默认。
|
|
133
|
-
- 切换持久化到 `~/.config/token-tracker/config.json`(主题 + 语言 + 组件意图统一存这一个文件);优先级 `--theme` 参数 > `TT_THEME` 环境变量 > 配置文件 > 自动(`--theme` 和 `TT_THEME` 都只临时生效、不写配置)。
|
|
134
|
-
- 终端支持 truecolor 用精确配色;不支持的(如 macOS 自带 Terminal.app)自动降级到当前主题的 **256 色近似**,8 色老终端不再适配。
|
|
135
|
-
|
|
136
|
-
### 报告排序
|
|
137
|
-
|
|
138
|
-
所有报告命令支持 `--sort` 和 `--asc/--desc` 参数:
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
tt weekly --sort cost --desc # 按成本降序
|
|
142
|
-
tt sessions --sort tokens --asc # 按 token 升序
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
可选排序字段:`tokens` / `cost` / `messages` / `time` / `input` / `output`
|
|
146
|
-
|
|
147
|
-
### Dashboard 快捷键
|
|
148
|
-
|
|
149
|
-
| 按键 | 功能 |
|
|
150
|
-
|------|------|
|
|
151
|
-
| `←` `→` | 切换 Agent |
|
|
152
|
-
| `↑` `↓` | 滚动内容 |
|
|
153
|
-
| `s` | 切换排序字段(时间 → Token → 等效成本 → 消息数) |
|
|
154
|
-
| `r` | 反转排序方向 |
|
|
155
|
-
| `+` / `-` | 调整会话显示条数(±10,最少 10 条) |
|
|
156
|
-
| `q` | 退出 |
|
|
157
|
-
|
|
158
|
-
## 数据来源
|
|
159
|
-
|
|
160
|
-
| Agent | 路径 | 格式 |
|
|
161
|
-
|-------|------|------|
|
|
162
|
-
| Claude Code | `~/.claude/projects/*/` | JSONL(逐消息用量) |
|
|
163
|
-
| Codex | `~/.codex/sessions/` | JSONL + SQLite |
|
|
164
|
-
|
|
165
|
-
路径跨平台:Windows 下 `~` 解析到 `%USERPROFILE%`(如 `C:\Users\xxx\.claude`)。设了 `CLAUDE_CONFIG_DIR` / `CODEX_HOME` 环境变量(官方支持的自定义目录)时自动跟随。
|
|
166
|
-
|
|
167
|
-
Token Tracker 对 Agent 数据**只读**,不做任何修改。
|
|
168
|
-
|
|
169
|
-
## 环境要求
|
|
170
|
-
|
|
171
|
-
- Python 3.11+
|
|
172
|
-
- [Rich](https://github.com/Textualize/rich)(自动安装)
|
|
173
|
-
|
|
174
|
-
## 开发
|
|
175
|
-
|
|
176
|
-
```bash
|
|
177
|
-
git clone https://github.com/stormzhang/token-tracker && cd token-tracker
|
|
178
|
-
uv run --extra dev pytest # 运行测试
|
|
179
|
-
uv run --extra dev ruff check src tests # Lint
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
包采用标准 src layout(`src/token_tracker/`):发行名 `token-tracker`,导入名 `token_tracker`(0.4.0 起)。
|
|
183
|
-
|
|
184
|
-
## TODO
|
|
185
|
-
|
|
186
|
-
未来持续增加更多数据报表,多维度分析。
|
|
187
|
-
|
|
188
|
-
## License
|
|
189
|
-
|
|
190
|
-
Copyright (c) 2026 stormzhang. MIT License.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|