用 AI 编程工具的人,多半都有过这个瞬间:月底看账单,数字比自己预估的高出一截,却说不清钱花在哪了。是这个项目烧的,还是那次调试?是大模型用多了,还是聊了太多废话?
这些问题的答案其实一直躺在你的硬盘里——Claude Code、Codex、Gemini CLI 每次调用都会在本地留下会话日志,只是没人去读。8 月 27 日出现在 GitHub 上的开源工具 tokentab,干的就是这件事:把三家工具的会话日志读出来,算出你到底花了多少钱。
截至本文写作时,它已经拿到 1141 颗星、210 个 fork,距离创建不到七天。
它读什么:三家工具,Cursor 还在路上
tokentab 直接读取这些工具已经写在磁盘上的日志:
Claude Code — ~/.claude/projects/**/*.jsonl
Codex — ~/.codex/sessions/**/rollout-*.jsonl
Gemini CLI — ~/.gemini/tmp/**/session-*.json
Cursor 在代码里留了插槽,但作者明确标注尚未完成,暂时用不了。好消息是,如果某个工具你没装,它会自动跳过——你只会看到自己实际在用的那些。
算出结果后,按四个维度拆开:按模型、按项目、按日期、按工作类型。这四个切法基本覆盖了所有你想问的问题。
最让人放心的一点:它完全不联网
这是我认为它值得推荐的首要理由。tokentab 全程在本地运行:不需要账号,不需要 API Key,任何数据都不会离开你的机器。
细节做得相当彻底。它的价格表是一张手写在 tokentab/pricing/prices.py 里的静态表,单位是美元每百万 Token——作者明确说这是有意为之,工具永远不会联网去查价格,「一个稍微过时的数字,好过厂商半夜改个模型名就让你的工具崩掉」。
连网页仪表盘都不从 CDN 拉字体,直接用系统自带的衬线和等宽字体,所以断网也能正常显示。
装起来:两条命令
安装很常规:
git clone https://github.com/damejan80/tokentab
cd tokentab
pip install .
python cli.py
装完后 tokentab 命令就在你的 PATH 里了。整个项目唯一的第三方依赖是 rich(用来画终端表格),解析、JSON 输出、网页服务全用 Python 标准库实现。
不带参数直接跑 python cli.py,默认给你看最近 7 天、所有工具的汇总。
常用命令:从粗到细一层层剥
几个高频用法:
python cli.py -today — 只看今天
python cli.py -month — 看本月
python cli.py -p all — 看有史以来的全部记录
python cli.py --provider claude — 只看某一个工具
python cli.py --project myapp — 只看某一个项目
python cli.py --from 2026-06-01 --to 2026-06-15 — 指定时间窗
python cli.py --json | jq . — 输出机器可读格式,方便接进别的流程
python cli.py -web — 起本地网页仪表盘
有个小细节很贴心:当你把输出通过管道传给别的地方时,颜色会自动关闭,不会把一堆转义符一起复制到 PR 或聊天窗口里。
网页仪表盘:像个对账单
python cli.py -web 会打开 http://localhost:4747,把同样的数据排成一份月度对账单的样子——总数在最上面,下面逐条明细。
技术上它用的是 Python 标准库的 HTTP server,没有 Flask 也没有任何框架,不用额外装东西。它每次请求都重新读盘(数据量很小,没必要缓存,还能避免看到过期数据),并且只绑定 localhost,什么都不会上传。想换端口用 --port,不想让它自动弹浏览器就加 --no-open。
数字是怎么算出来的
这里有几个设计值得单独说,因为它们决定了你看到的数字可不可信。
Token 数直接来自日志——这几个工具本身每次调用都会记录自己的 token 计数,所以不存在估算或猜测。
缓存会被单独处理。这一点很关键:Claude 会把缓存读取和缓存写入分开记录,而 Gemini 上报的输入 token 里是包含缓存部分的。tokentab 在计价前会先把缓存 token 抽出来,避免同一批 token 被重复计费。如果你关心缓存命中率,这个处理就是必须的。
价格用模糊匹配。模型名 claude-opus-4-6-20260514 也能匹配到表里的 claude-opus-4-6。万一真匹配不上,它会显示 $0.00 并且明确告诉你没匹配上,而不是悄悄当成免费。这种「宁可报错也不给错答案」的态度在数据工具里很难得。
工作类型是推断的。coding / debugging / refactor / testing 这些分类,是基于该会话用到了哪些工具、以及你在会话里第一条消息的措辞猜出来的。作者坦白说了这是确定性推断、不调用任何模型,所以又快又能让你一眼看出对不对——当成提示,别当成结论。
三条自查经验:这才是真正的价值
tokentab 的 README 里给了三条判读经验,我认为比工具本身还值钱:
① 缓存命中率持续低于 80% — 大概率是你的上下文在多次调用之间不稳定,或者缓存根本没开。偶尔一次异常不用管,但连续几周都这样,就值得查一查了。
② 某个大模型在大量小调用上占据主要成本 — 说明你可能在用贵的模型干便宜的活。这类任务换成小模型往往能一次搞定。
③ 「chat」或「exploring」占了很大比例 — 意味着大部分钱花在了聊天和读代码上,而不是真正的编辑。有时候这就是工作本身,但有时候说明某次会话跑偏了。
作者也提醒:这些都是切入点,不是判决书。工具给你看数据,而你才知道那段时间实际在干什么。
想加新工具?成本很低
tokentab 的扩展性设计得挺干净。每个 provider 就是 tokentab/providers/ 下的一个模块,只要暴露一个返回 UsageRecord 列表的 collect() 函数就行。写好模块、加进 __init__.py 的列表,计价、分组、仪表盘全都自动生效——因为下游所有环节都只认那一个统一的数据结构。
作者建议从 Claude 的解析器开始读,它是最简单的模板。
对普通人意味着什么
如果你只是偶尔用用 AI 编程,这个工具意义不大。但如果你每天开着 Claude Code 或 Codex 干活,或者团队里几个人的 API 花费需要归因到具体项目,那它就是刚需——看不见的成本是没法优化的。
而且它把「隐私」这件事做对了:不联网、不要账号、数据不出机器、连字体都不外链。在一个什么都往云上送的年代,这种克制反而让人放心。
最后提醒一句:价格表是人工维护的,作者也说欢迎提 PR 或 issue 修正。如果你发现某个模型的单价明显不对,顺手改一行提交上去,对所有人都是好事。
关注「AI 智习室」,每天一条看得懂的 AI 情报。