资讯动态

深入 tokentab 日志解析:Claude Code、Codex、Gemini 三种会话格式各踩什么坑

发布时间:2026/10/15 0:56:20 来源:尧图企业网站定制
【免费下载链接】tokentabA CLI that reads Claude Code, Codex, and Gemini CLI session logs and works out how much they cost, by model, project, and day.项目地址https://gitcode.com/gh_mirrors/to/tokentab点击查看免费下载tokentab是一个命令行工具读取 Claude Code、Codex、Gemini CLI 自动写在本地磁盘上的会话日志统计 token 用量和花费并按模型、项目、日期、活动类型拆分——全程本地运行不需要 API key数据不出机器。这个项目最有意思的部分就是日志解析三家工具的日志格式、token 计数口径各不相同各有各的坑。这篇文章带你走进 tokentab/providers/ 目录看看解析器分别为每种格式踩了什么坑、又是怎么绕过去的。一、先看日志在哪三家工具的落盘习惯tokentab 不依赖任何网络接口全部数据来自这些工具自己留下的日志文件工具日志位置文件格式Claude Code~/.claude/projects/**/*.jsonl每行一个 JSON 对象JSONLCodex~/.codex/sessions/**/rollout-*.jsonl逐事件 JSONLtoken 为累计值Gemini CLI~/.gemini/tmp/**/session-*.json整个会话一个 JSON 文档每个工具对应tokentab/providers/下一个独立模块claude.py、codex.py、gemini.py只需暴露一个collect()函数。工具没装就返回空列表自动跳过——你只会看到自己实际用过的工具。二、Claude Code最友好的格式坑在缓存字段Claude Code 是三个格式里最规整的源码注释直接称它为 friendliest format一次会话一个.jsonl文件每行一个 JSON 对象assistant 回合自带模型名和 usage 块。它的主要坑在于token 缓存被拆成独立字段。Claude 把缓存读取和缓存写入分开记录如果不拆开来读就会把便宜的缓存命中和较贵的缓存写入混成一笔糊涂账tokensTokenCounts( inputusage.get(input_tokens, 0), outputusage.get(output_tokens, 0), cache_readusage.get(cache_read_input_tokens, 0), cache_writeusage.get(cache_creation_input_tokens, 0), )对应源码claude.py。另一个细节是两遍扫描 去重claude.py第一遍收集第一条用户消息和tool_use工具名用于活动分类见 classify.py第二遍才提取 usage 块并用消息id去重防止同一次调用被计入两遍。项目名也不是白拿的会话文件路径里的项目目录名是被工具把斜杠换成连字符编码过的字符串pretty_project()无法无损还原只能取最后一段有意义的片段当标签比如显示my-app而不是一长串编码。三、Codex累计 token 必须做差事件结构三层嵌套Codex 的日志是事件流最大的坑在计数口径token_count事件里存的是整场会话的累计值。如果直接把每条事件加起来token 会被重复计算 N 次。解析器的做法是对相邻事件做差得到每次调用的增量d_in max(0, tot_in - prev_in) d_out max(0, tot_out - prev_out) d_cache max(0, tot_cache - prev_cache)max(0, …)保证计数器被重置比如新开会话时不会出现负数。对应源码codex.py。第二个坑是事件结构不一致token_count可能直接出现在顶层也可能包在payload或info里。_find_token_count()一次兼容了三种可能的位置codex.py否则换个版本的 Codex 就会读不到数据。还有两个顺手的坑工作目录来自文件开头附近的 session-meta 事件得先做一遍上下文扫描才能知道这条记录属于哪个项目老会话存放在archived_sessions/目录和sessions/都要扫描不然历史记录会凭空消失。四、Gemini CLI格式最文明坑在输入包含缓存Gemini CLI 的格式最规整一个会话一个 JSON 文件messages数组里每条消息自带tokens对象。解析起来最省心但它埋了一个静默的坑input字段的口径是包含缓存的。如果不做处理缓存部分会在input和cached里各被计费一次——同样的 token 付两份钱。解析器在计费前先扣回去fresh_input max(0, raw_input - cached) # input is inclusive of cache对应源码gemini.py。这正是 README 里提到的 pulls the cached tokens back out before pricing。另外两个小坑消息缺model字段时兜底为gemini-2.5-progemini.py项目名取自tmp/后的目录层级gemini.py。五、三家共通的防御式解析技巧 格式各不相同但防御烂数据的思路高度一致公共工具都放在 shared.py工具函数解决的问题try_json()单行 JSON 解析失败时返回None而不是抛异常一行坏数据不会搞挂整场统计walk_files()遍历日志目录跳过任何读不了的文件to_date()同时兼容秒/毫秒时间戳数值大于1e12视为毫秒和带Z后缀的 ISO 字符串失败时回退到纪元时间pretty_project()把编码过的项目目录名还原成可读标签对应源码shared.py。更外一层providers/init.py 给每个工具的collect()都包了try/except某个工具的日志坏了只打印一条 warning整份报告照常出——一个坏掉的工具不该拖垮整个报表。六、解析之后一切归一成 UsageRecord 三家解析器输出的是同一个数据形状UsageRecord定义在 types.pyprovider、model、project、timestamp、activity、tokens、id。下游的计价、分组、Web 仪表盘只接触这一个结构这也是加一个新工具只需写一个解析模块能成立的原因。两个值得了解的下游设计活动分类是纯规则classify.py根据用过的工具名编辑类/搜索类加首条消息里的关键词fix、refactor、test…猜出 debugging / refactor / testing / chat 等标签没有模型调用快且可人工核对价格表是手工维护prices.py按美元 / 百万 token查表模型名做模糊匹配claude-opus-4-6-20260514也能匹配到claude-opus-4-6。匹配不上的模型会显示$0.00并明确提示而不是静默按免费算。七、小结踩坑清单与扩展方向格式核心坑解法Claude Code缓存读/写分字段消息可能重复分字段读取 按消息 id 去重Codextoken 是累计值事件嵌套位置不固定相邻事件做差 多位置兼容查找Gemini CLIinput含缓存 token计费前扣掉cached三家共通坏行、坏时间戳、编码项目名防御式解析失败降级不崩溃想动手扩展的话仓库留了一个现成的练习位cursor.py 是未实现的 stub——Cursor 的数据存在 SQLite 数据库state.vscdb里而非文本日志按文件里的 TODO 补上解析逻辑、注册进 ALL_PROVIDERS计价和报告就自动生效了。安装也只需三步装完得到一条tokentab命令直接跑即可看到最近 7 天的账单git clone https://gitcode.com/gh_mirrors/to/tokentab cd tokentab pip install .整个项目的第三方依赖只有一个rich终端表格其余解析器、JSON 处理、Web 服务器全部是 Python 标准库——这也意味着读它的全部源码不会遇到任何框架黑盒。赞分享【免费下载链接】tokentabA CLI that reads Claude Code, Codex, and Gemini CLI session logs and works out how much they cost, by model, project, and day.项目地址https://gitcode.com/gh_mirrors/to/tokentab点击查看免费下载相关推荐Claude Code 会话恢复实战掌握 --continue 与 --resume 三种接续方式Claude Code 会话恢复实战掌握 continue 与 resume 三种接续方式 本篇技术指南围绕 tilToday I Learned仓库中文档教程知识库新手快速上手Hugging Face Skills 接入 Claude Code、Codex、Gemini CLI 与 Cursor 的 4 种方式新手快速上手Hugging Face Skills 接入 Claude Code、Codex、Gemini CLI 与 Cursor 的 4 种方式 Hugg人工智能AI 技能/插件大模型AI 评测把 Claude Code 接入 9Router 后我踩的 5 个坑把 Claude Code 接入 9Router 后我踩的 5 个坑 9Router 是一个跑在本地默认 http://localhost:20128 的人工智能LLM 网关AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑