ccusage 接入 Grok Build CLI:会话日志读取、聚焦报告与成本核算全指南
发布时间:2026/9/21 16:29:51 锦皓数字建站

AI 应用CLI开发工具【免费下载链接】ccusagenpx ccusage项目地址https://gitcode.com/gh_mirrors/cc/ccusage点击查看免费下载本文以 ccusage 的 Grok Build CLI 数据源适配器为主线讲解它如何从本地~/.grok目录读取updates.jsonl会话日志生成 daily / monthly / session 三类聚焦报告并深入剖析 token 拆分、costUsdTicks记账成本与定价表回退的底层实现。读完本文你将掌握ccusage grok系列命令的完整用法、GROK_HOME数据根解析规则以及成本在display/auto/calculate三种模式下的计算路径并能在数据缺失、成本为零等常见故障下快速定位原因。Grok Build CLIccusage 的一个一等数据源ccusage 可以将本地 Grok Build CLI 的会话日志作为受支持的数据源直接读取对应文档 docs/guide/grok/index.md。与 Claude Code、Codex、Gemini 等适配器一样Grok 数据接入后复用 ccusage 统一的报告模型unified report model与聚焦报告模型focused report model这意味着你不需要学习一套新的报告语法——同一套 daily / monthly / session 视图、JSON 输出、成本模式和终端表格对 Grok 一视同仁。在命令行入口处Grok 适配器被挂载为顶层子命令rust/crates/ccusage/src/adapter/mod.rs中pub(crate) use ccusage_adapter_grok as grok;rust/crates/ccusage/src/main.rs中Some(Command::Grok(args)) adapter::grok::run(args)将ccusage grok ...分派到适配器的run函数。适配器本身的代码位于 rust/adapters/grok/由四个模块组成paths.rs数据根解析与sessions/**/updates.jsonl发现parser.rsturn_completed行准入、token 拆分、定价候选生成与成本计算loader.rs并行读取、跨会话全局去重与has_data探测report.rsdaily / monthly / session 汇总形状。快速上手聚焦视图命令大多数用户可以从统一报告unified reports例如ccusage daily会汇总所有已检测数据源开始。只有在需要把同一报告形状聚焦到 Grok 用量上时才加grok命名空间# 按天汇总 Grok 用量 ccusage grok daily # 按月汇总 Grok 用量 ccusage grok monthly # 按 Grok 会话分组 ccusage grok session三个视图分别聚合不同的维度聚焦视图描述参见ccusage grok daily按日期聚合用量Daily Usageccusage grok monthly按月聚合用量Monthly Usageccusage grok session按 Grok 会话分组用量Session Usage从源码看这几种视图的差异集中在report.rs的summarize_entriesdaily 直接按entry.date分组summarize_by_keymonthly 先算 daily 再按BucketKind::Monthly分桶session 则用BTreeMapString, SessionAccumulator累积每个session_id的条目从而把活动时间范围first_activity/last_activity和项目路径带到会话行上——这正是会话表格的 Last Activity 列与会话 JSON 输出的数据来源。支持的选项这些聚焦视图支持--json、--compact、--mode与--offline等共享选项# JSON 输出便于脚本消费 ccusage grok daily --json # 压缩输出 离线模式使用内嵌定价快照 ccusage grok monthly --compact --offline # 强制从 token 数重新计价 ccusage grok session --mode calculate--mode的三档取值auto/calculate/display在 Cost Modes 有全局说明Grok 适配器对它们的特殊处理见下文「成本核算」一节。其他通用选项如--since/--until日期过滤、--timezone时区、--order排序、--breakdown模型细分等也适用于ccusage grok系列详细清单见 Command-Line Options。Cache Create 列的动态显隐聚焦终端表格的一个细节是当选中的 Grok 行没有记录任何 cache-creation token 时表格会省略Cache Create列一旦选中的行出现非零值该列重新出现。这一行为在 lib.rs 的table_options中实现——show_cache_creation: rows.iter().any(|row| row.cache_creation_tokens 0)并有对应单测hides_cache_creation_when_selected_rows_are_zero/shows_cache_creation_when_any_selected_row_is_nonzero佐证。无论表格如何显示JSON 输出 的稳定报告 schema 中始终保留cacheCreationTokens字段不会因值为零而缺失。数据源会话目录布局与发现规则Grok 适配器读取的是 Grok 主目录下各会话中的updates.jsonl每行一条会话更新事件只统计其中「已完成回合」的记录。目录布局如下$GROK_HOME/ # 或 ~/.grok └── sessions/ └── url-encoded-cwd/ └── session-uuid/ ├── updates.jsonl # 主数据源turn_completed usage └── summary.json # 可选元数据要点主数据源是updates.jsonl只会计入sessionUpdate turn_completed且带有可用 usage 拆分的行。进行中的回合in-progress turns在完成之前不会出现中途被 kill 的会话永远不会写入turn_completed因此其用量无法被报告。logs/unified.jsonl不被使用该日志没有逐请求per-request的模型 idtoken 无法定价或归属到具体模型故适配器完全忽略它。这一点在loader.rs的测试has_data_is_false_when_the_home_has_no_sessions中也有体现——只有logs/unified.jsonl时has_data()返回false。根目录解析优先级从高到低非空的GROK_HOMEGrok 官方环境变量单一根目录~/.grok。paths.rs中resolve_root()的实现完全对应这条规则先读GROK_HOME只有在该变量存在且 trim 后非空、且路径是目录时才采用否则回落到用户主目录下的.grok。配套测试覆盖了空值回退empty_grok_home_falls_back_to_default_home、缺失根missing_roots_yield_empty_discovery以及GROK_HOME指向非目录non_directory_grok_home_yields_empty_discovery等边界情况。发现过程discover_session_files递归扫描根下的sessions目录收集所有命名为updates.jsonl的 JSONL 文件忽略events.jsonl等同目录下的其他 JSONL并顺带探测同目录的summary.json作为可选元数据结果按路径排序保证多次运行加载顺序稳定。# 数据不在默认位置时显式指定根目录 GROK_HOME$HOME/.grok ccusage grok dailysummary.json虽然是可选的但它能显著改善报告的归属质量其中的info.id提供规范化会话 id行内params.sessionId缺失时使用info.cwd或git_root_dir提供项目路径优先info.cwdcurrent_model_id提供默认模型。当updates.jsonl行内没有modelUsage明细时顶层 usage 字段会以该默认模型命名。若完全没有 summary 和默认模型顶层 usage 会被标记为模型unknown见parser.rs的load_session_meta与测试names_top_level_usage_unknown_when_summary_has_no_default_model。另一个值得注意的实现细节当 summary 缺失时项目路径取自会话目录的父目录名该目录名是 URL 编码的 cwd例如D%3A%5Cwork%5Cproj适配器用url_decode_lightweight做字节级百分号解码D%3A%5Cwork%5Cproj→D:\work\proj并正确处理多字节 UTF-8 路径如%2Fhome%2F%C3%A9projet→/home/éprojet遇到非法字节时降级为替换字符而非崩溃。报告计算逻辑token 拆分、推理 token 与成本Token 用量把 OpenAI 风格计数拆成 ccusage 字段Grok 记录的是 OpenAI 风格的 usage其中inputTokens已经包含缓存。适配器parser.rs的split_input_tokens/split_tokens按以下规则拆分Grok 字段ccusage 字段规则inputTokens − cachedReadTokensinput_tokens未缓存输入缓存读数被钳制为 ≤ inputcachedReadTokenscache_read_input_tokens缓存读取outputTokensoutput_tokens原样记录reasoningTokens丢弃不计入总额已是outputTokens的子集cacheCreationTokenscache_creation_input_tokens从未缓存余量中再切出拆分的核心约束是保证三个部分之和恰好等于inputTokens先uncached input − min(cached, input)再cache_creation min(cache_creation, uncached)最后uncached - cache_creation。loader.rs的测试loads_session_tree_with_uncached_split给出了一个直观例子inputTokens100, cachedReadTokens40时报告为未缓存输入 60 缓存读取 40extra_total_tokens为 0。modelUsage是一个「模型 id → 该模型 usage」的映射。若一行turn_completed携带了modelUsage适配器会为其中每个模型各生成一条条目测试multi_model_turn_emits_one_entry_per_model验证了这一点只有modelUsage缺失时才回退到顶层 usage 字段。Reasoning tokens已经包含在输出中绝不重复计费Grok 的reasoningTokens是outputTokens的子集因此它们已经计入总数。适配器不会把它们加到 output 之上——无论是 token 数还是成本。parser.rs在构造LoadedEntry时硬编码extra_total_tokens: 0并附注说明Grok 的totalTokens inputTokens outputTokens若把 reasoning 再次计入总 token 数就会造成二次计费。测试does_not_add_reasoning_tokens_to_the_total专门验证了「只有 reasoningTokens42、其余为 0」的回合最终 input/output/extra 全为 0。预计算成本costUsdTicks就是账单金额Grok 在每条turn_completed上记录costUsdTicks单位为 1e-10 USD即 1 tick 1e-10 美元。parser.rs中常量COST_USD_TICKS_PER_USD: f64 1e10cost_usd_from_ticks将 ticks 换算为美元。注释中说明该换算已用 Grok CLI 1.0.0 的 58 条回合数据验证每条costUsdTicks / 1e10都能精确还原 xAI 对xai/grok-4.5的列表价。ccusage 把costUsdTicks视为发票成本invoice cost因此display模式和默认的auto模式报告的就是 Grok 实际收取的金额display直接返回 ticks 换算值auto在 ticks 存在时也优先使用它calculate模式以及auto模式下没有记录 ticks 的回合才回退到定价表估算。定价回退候选模型 id 与长上下文分层当需要按定价表估算时parser.rs的pricing_candidates适配器会为原始模型 id如grok-4.5-build生成一串候选去掉可选的[grok]前缀并 trim保留原始形式grok-4.5-build加上xai/前缀xai/grok-4.5-build加上x-ai/前缀x-ai/grok-4.5-build再对去掉尾部-build的规范化形式重复上述三种grok-4.5、xai/grok-4.5、x-ai/grok-4.5。查找时先做精确匹配pricing.find_exact确保用户通过--pricing-override提供的精确覆盖不会被模糊命中遮蔽全部候选精确匹配失败后才进入子串模糊匹配。测试exact_raw_model_pricing_override_beats_normalized_fallback和prices_via_the_stripped_candidate_when_the_build_form_is_missing分别覆盖了这两种路径。若所有候选都未命中定价表成本保持为零并记录missing_pricing_model警告测试reports_an_unpriced_model_as_missing_pricing_instead_of_dropping_it。长上下文分层xAI 的长上下文费率会在回合的完整上下文新鲜输入 缓存读取 缓存写入超过模型边界时生效——grok-4.5与grok-4.6的边界是 200K token。以 cost.rs 中的注释与测试为例grok-4.5基础费率为输入 $2 / 输出 $6 / 缓存读取 $0.3每百万 token超过 200K 上下文后变为 $4 / $12 / $0.6分层依据的是请求携带的整个上下文而不是未缓存输入——因为对提示缓存激进的 Agent 来说大量上下文以缓存读取形式存在。由于一条turn_completed行聚合了多个 API 请求分层只能按回合而非按请求选择因此估算结果只是对账单的近似。模型标签显示用的模型标签就是原始的modelUsagekey例如grok-4.5-build不做改写。在统一报告中Agent 列Agent column负责标识 Grok 来源模型列则保留原始 id便于和 Grok 侧日志一一对应。环境变量变量描述GROK_HOMEGrok 官方配置/数据主目录单一根目录LOG_LEVEL调整日志详细程度0 静默 … 5 跟踪GROK_HOME只接受单个根目录不像CODEX_HOME等支持逗号分隔列表完整的环境变量清单与默认值见 Environment Variables。LOG_LEVEL的六档取值0 静默 / 1 警告 / 2 普通 / 3 信息默认/ 4 调试 / 5 跟踪在脚本管道和 CI 场景下很常用例如LOG_LEVEL0 ccusage grok daily --json获得干净的纯 JSON 输出。配置grok命名空间与其他聚焦数据源一样grok命名空间支持同一套共享报告选项可写入 ccusage 配置文件如~/.config/claude/ccusage.json或项目级.ccusage/ccusage.json优先级见 Configuration{ grok: { defaults: { offline: true }, commands: { session: { json: true } } } }语义规则grok.defaults应用于所有 Grok 报告grok.commands.daily、grok.commands.monthly、grok.commands.session分别提供报告级覆盖同名项覆盖 defaults数据根目录只从GROK_HOME或~/.grok发现不从 ccusage 配置中读取——配置只能控制报告选项不能指定数据目录。故障排查没有找到 Grok 用量数据# 确认根目录下存在已完成回合 ls ~/.grok/sessions/**/updates.jsonl # 数据在其他位置时显式指定 GROK_HOME/path/to/grok-home ccusage grok daily进行中的回合要等turn_completed写入后才会出现。若目录里只有logs/unified.jsonl而没有sessions/**/updates.jsonlhas_data()返回 false报告自然为空——这是设计行为而非 bug。成本显示为 $0.00Grok 开始记录costUsdTicks之前写入的回合没有携带成本display模式对它们显示为零。此时改用定价表为这些回合计价ccusage grok daily --mode calculate若某个模型在定价表中缺失成本同样保持为零并可能出现 missing-pricing 警告可通过--debug或LOG_LEVEL4观察。你也可以用--pricing-override为私有或代理模型补充精确价格适配器会优先做精确匹配。回合进行中时总数低于预期v1 只统计已完成的回合。等待回合结束turn_completed写入后重新运行报告即可ccusage grok daily深入阅读想继续探索该适配器的实现与验证可以按需阅读数据根解析与会话发现paths.rs含GROK_HOME回退、updates.jsonl 筛选、嵌套会话树测试行准入与 token/成本计算parser.rsturn_completed过滤、usage 拆分、costUsdTicks换算、定价候选与长上下文分层加载与去重loader.rs并行读取、跨会话按eventId|model全局去重、按时间戳排序报告形状report.rsdaily/monthly/session 汇总、会话活动范围适配器总体说明与测试方式rust/adapters/grok/README.md成本模式语义Cost Modes命令行选项Command-Line Options配置方式Configuration赞分享AI 应用CLI开发工具【免费下载链接】ccusagenpx ccusage项目地址https://gitcode.com/gh_mirrors/cc/ccusage点击查看免费下载相关推荐10分钟出第一张AI图像SCAIL-2让ComfyUI新手免折腾10分钟出第一张AI图像SCAIL 2让ComfyUI新手免折腾 SCAIL 2 是一款专为 ComfyUI 重新打包的扩散模型。扩散模型用大白话说就是那种AI 应用CLI开发工具jQuery自动补全插件终极指南3步搞定输入框智能提示jQuery自动补全插件终极指南3步搞定输入框智能提示 每天都有无数人在表单里一遍遍手打重复内容国家名、城市名、收货地址、产品编号……输错了还得删掉重来。其人工智能AI AgentAgent 记忆MCP 服务从TextCaps到AI2DPix2Struct在8大视觉问答任务中的性能表现分析从TextCaps到AI2DPix2Struct在8大视觉问答任务中的性能表现分析 Pix2Struct是一个功能强大的视觉问答框架能够处理从图像描述生成到AI 应用CLI开发工具上一篇PiliPlus视频画质选择功能自适应码率与清晰度切换终极指南下一篇WinUI 3 文本服务框架TSF配置深度解析TSF1/TSF3 的选择逻辑与源码实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。