在讨论「AI 编程贵不贵」时,多数人只比较模型的 token 单价。但几项独立基准测试给出的结论是:同一个模型换个智能体框架,每解决一项任务消耗的 token 能差 70 倍——差距来自框架每轮都要重复发送的系统提示词、工具说明与环境设置,也就是「启动税」。想搞清楚钱花在哪,得看你自己的会话日志,而不是别人的榜单。

好消息是这些数据本来就存在:Claude Code 把会话写在 ~/.claude/projects/**/.jsonl,Codex 写在 ~/.codex/sessions/*/rollout-.jsonl,Gemini CLI 写在 ~/.gemini/tmp/*/session-*.json。tokentab 做的事就是把它们读出来,按模型、项目、日期与会话类型汇总,全程本地,不需要账号和 API Key。

第一步:装好并跑出第一份账单

git clone https://github.com/crwdla/tokentab
cd tokentab
pip install .
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-08-01 --to 2026-08-31
python cli.py --json | jq .                   # 交给别的脚本
python cli.py -web                            # 打开 localhost:4747 的本地看板

-web 用 Python 标准库起了一个只绑 localhost 的小服务,每次请求都重新读盘(数据量很小,没必要缓存),也不从 CDN 拉字体,断网也能看。想换端口用 --port,不想让它自动开浏览器就加 --no-open。

第三步:看懂数字是怎么算出来的

token 数直接来自日志,不是估算——这些工具自己就记录了每次调用的 token 计数。定价是一张手工维护的表(tokentab/pricing/prices.py,单位是美元/百万 token),匹配是模糊的:claude-opus-4-6-20260514 也能对上 claude-opus-4-6。如果某个模型显示 $0.00,说明名字没匹配上任何价格,仓库会提示你,而不是悄悄当成免费。

缓存要单独说:Claude 把缓存读取和缓存写入分开记录,Gemini 上报的输入则把缓存部分包含在内,tokentab 会先把缓存 token 扣出来再计价,避免同一批 token 被算两次。「会话类型」(编码 / 调试 / 重构 / 测试)是根据用了哪些工具、以及首条消息的关键词做的推断,确定性强、不调用模型,当参考即可。

第四步:读三个模式,找出能省的钱

  • 缓存命中率长期低于约 80%:说明上下文在调用之间不稳定,或者缓存根本没开。单次会话的异常不用管,连续几周都这样才值得查。
  • 大模型在大量小调用上占主要成本:可能是不该用贵模型的一次性任务用错了模型。
  • 「chat」或「exploring」占了很大开销:钱花在讨论和读代码上,而不是改代码上。有时候这就是工作本身,有时候是会话跑偏了。

拿不准的时候,用 --json 把数据导出来做对照:同一个项目换成更便宜的模型后,返工率有没有上升。省下的钱如果以返工换回来,那不叫省。

第五步:把它接进日常流程

python cli.py --json | jq '.byProject' > cost-$(date +%F).json

把每天的 JSON 存下来就能画趋势,也可以把 --json 的输出接进周报或 CI 脚本。想支持新的工具,照着 tokentab/providers/ 里已有的三个解析器写一个暴露 collect() 的模块、注册到 __init__.py 即可,下游的计价、分组、看板都会自动生效。

别用模型单价做选型决策:先看到自己的账,再决定要换框架还是换模型。