ccusage 的 Qwen Code 数据源适配器:JSONL 解析、Token 计算与用量报告实战
AI 应用CLI开发工具【免费下载链接】ccusagenpx ccusage项目地址https://gitcode.com/gh_mirrors/cc/ccusage点击查看免费下载ccusage 通过ccusage-adapter-qwen这一专用适配器把 Qwen Code 本地项目与聊天 JSONL 文件转译为统一的用量条目usage entries进而复用整套 daily / weekly / monthly / session 报表视图。本文将结合该适配器的文档与源码实现完整讲解其数据目录发现规则、JSONL 行级解析原理、推理与缓存 Token 的计价方式、四类报表的汇总逻辑以及如何通过ccusage qwen命令在实战中查看 Qwen Code 用量。Qwen 支持目前标记为 experimentalccusage 与 Qwen Code 都在持续演进相关行为可能发生破坏性变更。适配器定位与模块划分ccusage-adapter-qwen是 ccusage 众多来源适配器adapter之一职责单一把 Qwen Code 写入本地磁盘的 JSONL 聊天记录转换成报表渲染所需的LoadedEntry。凡是与 Qwen 无关的通用能力——目录遍历、文件分块、并行读取、日期过滤、表格输出等——都被下沉到ccusage-core与ccusage-adapter-common适配器自身只保留来源特有的逻辑。从 rust/adapters/qwen/README.md 的 Owns 一节可以看到清晰的职责边界文件职责loader.rs读取数据源、去重、日期过滤的入口封装parser.rs原始记录解析、Token 映射、模型命名与成本计算paths.rs环境变量、默认目录、文件发现规则report.rs与共享报表形状不同的 JSON / 表格结构源码实际分为 src/loader.rs、src/parser.rs、src/paths.rs、src/report.rs 四个文件由 src/lib.rs 统一导出。对外公开接口Public surface适配器向主 CLI 暴露了如下接口loader::load_entries— 加载全部用量条目report::report_from_rows— 由汇总行生成报表 JSONreport::summarize_entries— 按报表类型汇总条目run— 适配器的命令行入口has_data— 检测当前环境是否存在可用的 Qwen 数据。依赖方面Cargo.toml 声明了ccusage-adapter-common、ccusage-core、jiff时区/日期处理、serde与serde_json测试则依赖ccusage-test-support。构建上该适配器属于adaptersCrane artifact 层所有适配器在同一个 Cargo 调用中并行编译。快速上手聚焦报表视图Qwen 数据源支持与 ccusage 其他来源完全一致的聚焦视图focused views。先查看帮助# bunx推荐 bunx ccusage qwen --help # npx npx ccusagelatest qwen --help # pnpm pnpm dlx ccusage qwen --help可用的报表视图如下其中weekly同样由 src/report.rs 支持其通用行为可参考 docs/guide/weekly-reports.md 等文档聚焦视图说明参见文档ccusage qwen daily按日期聚合用量docs/guide/daily-reports.mdccusage qwen monthly按月聚合用量docs/guide/monthly-reports.mdccusage qwen session按 Qwen 会话分组用量docs/guide/session-reports.mdccusage qwen weekly按周聚合用量docs/guide/weekly-reports.md这些视图通用支持--json输出结构化 JSON--compact适配窄终端宽度--offline使用缓存的定价数据而非在线获取从源码看还支持--since / --until日期边界、--jq后处理、--order排序与--no-cost见 src/lib.rs 中run的调用链。run的执行流程为load_entries加载全部条目 → 若非 session 视图则按--since/--until过滤日期 →summarize_entries按报表类型汇总 → 排序 → 按--json/--jq输出 JSON或打印标题为 Qwen Token Usage Report 的表格src/lib.rs 的run函数。需要说明的是session 视图的日期过滤是在汇总之后基于last_activity进行的与非 session 视图在条目级过滤不同。数据目录与文件发现规则默认目录结构ccusage 读取 Qwen Code 的聊天 JSONL 文件默认根目录为~/.qwen目录结构如下~/.qwen/ └── projects/ └── {project}/ └── chats/ └── *.jsonl即projects/{project}/chats/*.jsonl这一固定三层结构。适配器 README 中的表达式${QWEN_DATA_DIR:-~/.qwen}/projects/**/*.jsonl是对此的简写。QWEN_DATA_DIR 环境变量可以通过QWEN_DATA_DIR覆盖默认根目录它既可以是单个目录也可以是逗号分隔的多个目录例如多份归档根目录此时多个根会被分别扫描并合并结果QWEN_DATA_DIR$HOME/.qwen,/backup/qwen ccusage qwen daily在 src/paths.rs 中环境变量按逗号切分、去空白、去重且仅保留实际存在的目录path.is_dir()未设置时回退到~/.qwen。也就是说只要QWEN_DATA_DIR存在默认目录便不再被扫描。发现逻辑严格三层路径discover_chat_files的规则值得注意它并非简单地递归收集所有.jsonl而是只接受恰好三层的相对路径projects/{project}/chats/{file}.jsonl——project非空、第二层必须是字面量chats、文件以.jsonl结尾。路径层级不对的文件会被is_chat_file过滤掉。这意味着数据必须严格按上述目录布局存放。项目名project则通过反向扫描路径窗口提取找到projects/{project}/chats/模式的窗口取其中的{project}段作为project_path用于报表按项目归类找不到时回退为unknown。JSONL 行级解析原理目标记录结构Qwen 的聊天文件是 JSONL每行一条记录。适配器只消费如下字段其余字段由 serde 直接跳过{ type: assistant, model: qwen3-coder-plus, timestamp: 2026-02-23T14:24:56.857Z, sessionId: session-json, usageMetadata: { promptTokenCount: 100, candidatesTokenCount: 50, thoughtsTokenCount: 10, cachedContentTokenCount: 5, totalTokenCount: 165 } }对应 src/parser.rs 中的QwenLine结构体#[serde(rename_all camelCase)]。其中usageMetadata是 Gemini 风格Gemini-style的用量块五个 Token 字段的含义如下字段含义映射结果promptTokenCount输入 Tokeninput_tokenscandidatesTokenCount输出 Tokenoutput_tokensthoughtsTokenCount推理思考Tokenextra_total_tokens计入总 Token 并按输出 Token 计价cachedContentTokenCount缓存命中读取 Tokencache_read_input_tokenstotalTokenCount总 Token可选兜底见下文 fallback三道性能与健壮性设计行级预过滤LinePrefilter每个可用的 Qwen 行都携带usageMetadata键因此读取文件时先用LinePrefilter::all([br#usageMetadata#])基于memmem子串匹配跳过不含该标记的行在 JSON 解析之前就淘汰大量无效行如纯用户消息见 src/parser.rs 的read_chat_file。宽容反序列化所有字段都使用ccusage-adapter-common提供的 lenient 反序列化器lenient_u64、non_empty_string等。Token 数若不是合法的非负整数会被视为0而不是让整行解析失败字符串会被 trim 且空串视为缺失。这些行为在 src/jsonl.rs 中有完整测试佐证。类型化反序列化存活的行直接反序列化为QwenLine类型化结构避免中间serde_json::Value树的分配未使用字段被跳过。解析过滤与字段兜底parse_line的过滤与兜底规则如下仅接受type assistant的行缺usageMetadata的行直接放弃若输入、输出、缓存读取、推理 Token 全部为 0则该行被丢弃零用量记录无意义totalTokenCount 兜底当各分项缺失而totalTokenCount存在时通过apply_total_token_fallback把总数作为输出 Token 兜底。parser 的单元测试falls_back_to_total_token_count_when_qwen_parts_are_missing验证了仅含{totalTokenCount: 321}的记录会被解析为output_tokens 321时间戳兜底timestamp可解析则原样使用否则回退到文件的修改时间file_timestamp文件元数据不可用时再回退到当前系统时间sessionId 兜底缺失时生成{project}-{文件名去掉扩展名}模型名兜底缺失时使用常量unknown。Token 计算与成本核算计价口径推理 Token 按输出计价billable_usage中output_tokens display_usage.output_tokens extra_total_tokens即thoughtsTokenCount会计入可计费输出同时保留独立的extra_total_tokens用于展示总 Token。缓存 TokencachedContentTokenCount被当作缓存读取 TokenQwen 日志目前不暴露缓存创建cache creationToken因此该值恒为 0见 src/parser.rs 的TokenUsageRaw构造。成本计算与模型候选成本计算遵循原始模型名 Qwen 供应商前缀候选的策略qwen_model_candidates依次尝试原始模型名如qwen3-coder-plusqwen/{model}alibaba/{model}。在Display模式下不加载定价表、成本展示为 0在计算模式下加载 LiteLLM 定价数据支持--offline缓存与--pricing-overrides覆盖一旦某个候选命中定价表中的条目即按其单价计算成本。若所有候选都未命中成本为$0.00并通过missing_qwen_pricing标记缺失定价的模型便于后续向项目提交 alias 支持请求。这里有一个细节显式价格为 0 的条目与无定价条目是不同的——单元测试calculate_qwen_cost_returns_explicit_zero_price验证了当free-model显式定价为 0 而qwen/free-model定价为 1 时原始名命中 0 价条目成本正确返回0.0而非回退到前缀候选。汇总与报表生成汇总逻辑report.rssummarize_entries按报表类型走不同的聚合路径src/report.rsDaily以entry.date为键直接聚合Weekly / Monthly先聚合出 daily再按周以周日为边界/ 按月分桶二次聚合Session以session_id为键用SessionAccumulator累积每条记录最后生成会话汇总。报表 JSON 形状report_from_rows生成{ daily | weekly | monthly | sessions: [...], totals: {...} }的结构行数组通过ccusage_core::agent_summary_json序列化totals通过totals_json计算无数据时totals为null。lib.rs 的测试builds_qwen_daily_json_report_with_reasoning_in_total给出了一个可验证的 daily JSON 输出示例对应上文示例记录100 输入 50 输出 10 推理 5 缓存读取 165 总 Token{ daily: [ { date: 2026-02-23, outputTokens: 50, cacheReadTokens: 5, totalTokens: 165, modelsUsed: [qwen3-coder-plus], modelBreakdowns: [ { modelName: qwen3-coder-plus, inputTokens: 100, outputTokens: 50, cacheCreationTokens: 0, cacheReadTokens: 5, cost: 0.0 } ] } ], totals: { } }注意totalTokens165包含推理 Token这正是推理 Token 计入总 Token设计的直接体现。并行读取与去重文件读取复用ccusage-adapter-common的read_files_parallel按文件大小做负载均衡分块size-balanced chunking后并行读取结果按原始文件顺序归位--single-thread可强制单线程。去重采用首胜策略按发现顺序对每个条目计算entry_id由 session id、时间戳、模型、输入/输出/缓存读取 Token、推理 Token 构成的 JSON 数组字符串相同 id 只保留第一个。该设计保证并行读取与单线程读取的存活记录一致src/parser.rs 的entry_id。与主 CLI 的接线Qwen 适配器通过 rust/crates/ccusage/src/adapter/mod.rs 以pub(crate) use ccusage_adapter_qwen as qwen的方式注册主入口 rust/crates/ccusage/src/main.rs 中Command::Qwen(args)直接调用adapter::qwen::run(args)。此外last_window.rs与timezone.rs会把 Qwen 命令纳入与其余来源一致的最近窗口与时区处理逻辑has_data通过paths::discover_chat_files判断当前环境是否有可读取的 Qwen 数据用于多来源的自动检测。环境变量与故障排查环境变量变量说明QWEN_DATA_DIR覆盖数据根目录支持逗号分隔的多个根目录LOG_LEVEL调整日志详细程度0 静默 … 5 trace常见问题No Qwen usage data found确认数据位于~/.qwen/projects/{project}/chats/这一严格三层结构下若数据在其他位置或有多个归档根请通过QWEN_DATA_DIR指定。成本全部显示为 $0.00模型不在 LiteLLM 定价数据库中或--offline缓存中缺失对应条目。此时适配器会尝试qwen/{model}、alibaba/{model}前缀候选仍未命中则成本为 0可向项目提交 issue 请求 alias 支持。测试保障适配器的正确性由三处测试共同保障src/lib.rs 的集成级测试加载真实 fixture 目录通过EnvVarGuard注入QWEN_DATA_DIR验证条目字段映射、daily JSON 中推理 Token 计入总 Token、以及 session 视图的 ISO 日期边界过滤src/parser.rs 的单元测试验证显式 0 价、totalTokenCount 兜底、含冒号字段的 entry_id 唯一性src/jsonl.rs 的通用测试验证预过滤跳过无标记行、宽容反序列化在异常类型下不丢整行。这些测试既是适配器的行为契约也是理解Qwen 记录如何一步步变成报表行的最佳注释。如果你想深入报表的通用形状与配置项可继续阅读 docs/guide/configuration.md 与 docs/guide/json-output.md。赞分享AI 应用CLI开发工具【免费下载链接】ccusagenpx ccusage项目地址https://gitcode.com/gh_mirrors/cc/ccusage点击查看免费下载相关推荐ccusage Qwen 数据源接入指南用 Qwen Code 聊天 JSONL 统计 Token 用量与费用ccusage Qwen 数据源接入指南用 Qwen Code 聊天 JSONL 统计 Token 用量与费用 本文面向使用 Qwen Code https:AI 应用CLI开发工具ccusage 的 Claude Code 适配器ccusage-adapter-claude源码解析JSONL 会话日志到使用量报表的完整链路ccusage 的 Claude Code 适配器ccusage adapter claude源码解析JSONL 会话日志到使用量报表的完整链路 ccusAI 应用CLI开发工具ccusage 的 Amp 数据源适配器线程 JSON 用量解析、缓存 Token 核算与报表命令详解ccusage 的 Amp 数据源适配器线程 JSON 用量解析、缓存 Token 核算与报表命令详解 导读 本文聚焦 ccusage 开源仓库中 Amp 数AI 应用CLI开发工具上一篇Langchain-Chatchat API 服务解析FastAPI 路由挂载、Prompt 模板接口与一键启动指南下一篇解决gpt4free服务中断Liaobots与You提供商深度故障分析与修复方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CANN ops-math Muls 算子 aclnn 接口完全指南:aclnnMuls 与 aclnnInplaceMuls 两段式调用详解

CANN ops-math Muls 算子 aclnn 接口完全指南:aclnnMuls 与 aclnnInplaceMuls 两段式调用详解

算子库人工智能CANN 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 点击查看 免费下载 导读 Muls 是 CANN ops-math 数学算子库中完成 Tensor 与 Scalar …

2026/9/24 5:29:12 阅读更多 →
ent迁移避坑指南:Atlas迁移引擎5大常见陷阱与解决方案

ent迁移避坑指南:Atlas迁移引擎5大常见陷阱与解决方案

ent迁移避坑指南:Atlas迁移引擎5大常见陷阱与解决方案 【免费下载链接】ent An entity framework for Go 项目地址: https://gitcode.com/gh_mirrors/en/ent 使用 Ent 做数据库管理时,很多人从自动迁移(Auto Migration)切换…

2026/9/23 14:32:39 阅读更多 →
Voyager 用户消息 LaTeX 渲染:在 Gemini 聊天中自动排版数学公式的完整指南

Voyager 用户消息 LaTeX 渲染:在 Gemini 聊天中自动排版数学公式的完整指南

AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用…

2026/9/24 2:48:42 阅读更多 →

最新新闻

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

开发工具代码生成后端 【免费下载链接】openapi-typescript Generate TypeScript types from OpenAPI 3 specs 项目地址: https://gitcode.com/gh_mirrors/op/openapi-typescript 点击查看 免费下载 本文基于 openapi-typescript 仓库中的 Node.js API 文档&#x…

2026/9/25 5:42:32 阅读更多 →
Java线性规划实现指南:从手写单纯形法到Commons Math接库

Java线性规划实现指南:从手写单纯形法到Commons Math接库

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 5:42:32 阅读更多 →
F´ Ground Data System(GDS)快速入门指南:安装、启动配置与 GUI 各标签页实操

F´ Ground Data System(GDS)快速入门指南:安装、启动配置与 GUI 各标签页实操

嵌入式系统编程 【免费下载链接】fprime F - A flight software and embedded systems framework 项目地址: https://gitcode.com/gh_mirrors/fpri/fprime 点击查看 免费下载 F Ground Data System(GDS)是 F(F Prime,…

2026/9/25 5:42:32 阅读更多 →
WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例

WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例

网络安全漏洞扫描渗透测试应用安全CLI 【免费下载链接】wpscan WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com 项目地址: ht…

2026/9/25 5:42:32 阅读更多 →
BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法

BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读 本文围绕 BAML 语言内置基准测试工具 speedtest 中的一个核心负载——call-chain-100x…

2026/9/25 5:42:32 阅读更多 →
使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 ES Modules(ESM)的绑定是**静态解析、实时(live)且不可变…

2026/9/25 5:41:31 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →