AI 编码账单总是对不上?用 TokenMaxxer 把本地用量、增量同步与后台服务拆开看
AI 编码工具的成本问题,往往不是“模型单价太高”这么简单。一个人可能在 Claude Code 里做长任务,又在 Codex、Cursor 或 OpenCode 间切换;月底看到订阅、API 账单和团队报表时,才发现自己很难回答三个基础问题:哪些工具实际被使用了、用量变化来自哪里、后台采集会不会把项目内容带走。
TokenMaxxer 是一个可通过 npm 安装的跨平台 CLI。它读取本机已经存在的 AI 编码工具历史记录,生成仅包含 token 用量的事件并同步到其账户;官网将它定位为面向开发者的 AI 用量分析服务。当前 npm 包版本为 0.5.0,采用 MIT 许可证,要求 Node.js 22 或更高版本。它不是代理模型请求的网关,也不负责替你选择模型;更准确的理解是:它处在本地历史数据与用量看板之间,专注于把分散的使用痕迹归并成可查询的成本信号。
先分清三层:采集、同步与展示
很多成本工具把“读取本地日志”“传输数据”“计算金额”混成一个黑盒。TokenMaxxer 的 README 给出了更容易审计的边界。
第一层是本地解析。CLI 会扫描 Claude Code、Codex CLI、Cursor、OpenCode、Copilot、Gemini CLI、Qwen CLI 等工具已经保留在磁盘上的历史记录,并从中派生用量事件。官方说明明确写的是 tokens-only:消息正文、提示词、文件内容和绝对路径不应离开机器,事件至多包含简短项目标签。
第二层是增量同步。首次运行会处理已有历史,之后通过事件指纹只发送新增或变化的记录;没有变化的后台轮询不发网络请求。这个设计很关键:如果每次执行都重新上传完整历史,用量统计不仅浪费流量,也会给排障带来重复计数的风险。
第三层才是服务端计算和展示。README 说明成本由服务端计算,排行榜不信任客户端自行计算的金额。对使用者来说,这意味着本地负责保留采集边界和同步游标,服务端负责统一价格与汇总逻辑;当数字异常时,也能按这三个层次定位问题,而不是笼统地“重装工具”。
从一次同步开始,而不是先开常驻服务
推荐先以一次性同步验证本机能识别哪些工具,再决定是否启用后台服务:
npm install -g tokenmaxxer tokenmaxxer login tokenmaxxer doctor tokenmaxxer sync --json tokenmaxxer status --json
这里 doctor 比直接执行 sync 更适合作为第一步。它会输出每个解析器的发现情况,因此可以先确认“没有记录”到底是某个工具没有历史、配置目录不同,还是认证或网络问题。sync --json 则适合放进自己的检查脚本或 CI 诊断流程;不要把它误当作模型调用命令,它只处理本地已存在的用量历史。
完成首次验证后,才可安装用户级后台服务:
tokenmaxxer service install tokenmaxxer service status
官方说明该命令会按平台管理 launchd、systemd 或 Task Scheduler 服务;也可以使用 tokenmaxxer start --interval 在前台运行循环。对于开发机,优先让服务以当前用户运行,避免为了读取个人工具历史而授予不必要的系统级权限。
游标、缓存与“为什么数字突然变大”
TokenMaxxer 的配置默认位于 ~/.config/tokenmaxxer,也遵循 XDG_CONFIG_HOME;Windows 使用对应的 %APPDATA% 路径。目录中最值得理解的不是日志,而是 sync-cursor.json:它记录已确认的同步进度。正常运行时不应随意删除它,因为下一次同步会触发完整历史重新处理。
README 还描述了两种避免重复工作的机制:每批服务端确认的数据会被 checkpoint;Claude Code 的记录另有按文件元数据索引的私有解析缓存,未变化的文件会跳过磁盘读取与 JSON 解析。它们共同解决一个实际失败模式:大历史目录下任务中断或重启后,采集器既不能从头盲扫,也不能把已确认事件再传一遍。
因此,排查“本月用量突然升高”时,建议按顺序做:先用 status --json 看上次同步与服务状态;再用 doctor 检查解析器;最后确认是否有人清除了 sync-cursor.json、迁移了配置目录或变更了目标服务地址。不要先删除整个配置目录——那会同时丢掉可帮助解释异常的状态信息。
隐私边界仍需要自己验证
“只同步 token”是项目声明的边界,不等于团队可以跳过内部审查。若在受管设备上使用,应确认项目标签是否会暴露仓库语义、账户 token 的保管方式是否符合公司规范,以及数据实际发送到哪个服务端。TokenMaxxer 支持通过 TOKENMAXXER_SERVER 或 --server 覆盖目标地址,也可用 TOKENMAXXER_CONFIG_DIR 迁移配置位置;这给自定义环境带来灵活性,也意味着部署脚本需要明确记录这些覆盖项。
对个人开发者而言,它适合回答“我在哪些编码工具上消耗了多少 token”;对团队而言,它更像一个本地采集组件,仍需与预算、身份、数据保留和异常告警制度配合。把采集、同步、服务端计算这三层分开,才能既获得更可解释的成本视图,也不把成本治理变成新的隐私盲区。
把它接入日常工程节奏
真正有价值的不是每天盯着排行榜,而是让用量数据参与具体决策。比如某个仓库开始进行大规模迁移时,可以在迁移前执行一次 sync --json,迁移结束后再同步一次;两次结果不必被解读为精确的项目成本核算,却能帮助确认工作量是否主要落在某一种工具或模型工作流上。若某位开发者发现本地工具切换频繁,也可以结合 doctor 的解析器结果,先弄清是不同客户端各自保留了独立记录,还是其中一个客户端根本未被识别。
这一点尤其适合处理“同一个订阅为什么感觉越用越贵”的模糊抱怨。订阅费、按量 API 费用与 token 用量不是同一个指标,不能用 TokenMaxxer 的数字直接推导财务账单;但它可以提供行为侧的证据:某段时间是否出现了更长的 Agent 循环、更多工具间切换,或者某个新客户端开始贡献了历史记录。把它与供应商账单、团队预算阈值并列看,比单独相信任一方的数据更稳妥。
在共享开发机或远程环境中,还要避免把后台服务当作“装完就不用管”的守护进程。变更 Node 版本、清理 home 目录、替换工作站或调整 XDG_CONFIG_HOME 后,都应再次运行 tokenmaxxer doctor。如果需要让自动化脚本连接不同的服务端,应显式设置并记录 TOKENMAXXER_SERVER,而不是依赖不可见的旧配置;若只是临时排查,也可以使用 --server 覆盖,结束后再检查 status --json,确认常驻服务没有继续指向错误环境。
最后,增量同步并不意味着永远不会发生较重的本地扫描。首次同步、游标被删除、历史文件被大量改写或迁移到新机器,都会改变解析器需要处理的范围。比较合理的运维策略是保留游标与缓存、在升级前做好配置备份,并把一次完整回补视为需要观察的事件。这样既能利用后台服务的便利,也能在数据突然跳变时解释它来自工作负载,还是来自采集状态变化。对于有严格变更流程的团队,还可以把这类回补记录在运维变更单中:它不是故障,却会影响当期用量曲线的可比性。