ccusage Droid 适配器深度解析:从 Factory Droid 会话文件到用量报告
ccusage Droid 适配器深度解析从 Factory Droid 会话文件到用量报告【免费下载链接】ccusagenpx ccusage项目地址: https://gitcode.com/gh_mirrors/cc/ccusage本指南以ccusage-adapter-droid位于 rust/adapters/droid/README.md为骨架完整讲解该适配器如何将 Factory Droid 写入磁盘的*.settings.json会话文件转换为 ccusage 报告渲染所需的用量条目usage entries覆盖文件发现、并行读取、Token 解析、模型归一化、会话去重、定价与报告生成的全链路。读完本文你将掌握ccusage droid命令的数据来源、配置方式与实现原理能够理解甚至自定义该适配器的行为边界。适配器职责一份只做转换、不做通用的代码ccusage-adapter-droid的定位非常明确把 Factory Droid 的 session JSON 文件变成报告可渲染的用量条目。它是一个源专属source-specific适配器其设计哲学在 README 中被一句话点破Anything that is not specific to this source belongs inccusage-coreorccusage-adapter-commoninstead.凡不属于该数据源特有的逻辑都应放进ccusage-core或ccusage-adapter-common。这意味着整个 crate 只有 4 个源文件各自承担单一职责模块职责loader.rs读取数据源、按 session 去重、日期过滤parser.rs原始记录解析、Token 字段映射、模型命名归一化paths.rs环境变量、默认目录、文件发现report.rs与共享形状不同的 JSON 与表格输出目录结构也印证了这一点src/lib.rs只做模块声明与run入口编排通用能力文件遍历、并行读取、日期过滤、表格渲染全部复用ccusage-adapter-common与ccusage-coreCargo.toml见 rust/adapters/droid/Cargo.toml声明的运行时依赖仅有ccusage-adapter-common、ccusage-core、jiff时区/时间处理与serde_json四项。数据源与文件发现机制README 给出的数据源定义是${DROID_SESSIONS_DIR:-~/.factory/sessions}/**/*.json即默认读取~/.factory/sessions下的所有 JSON 文件若设置了环境变量DROID_SESSIONS_DIR则改用它指定的目录。源码 paths.rs 在此基础上做了三层细化多路径支持DROID_SESSIONS_DIR支持用逗号分隔多个目录每个目录都会被依次扫描后缀过滤虽然遍历时收集所有*.json文件但最终只保留文件名以.settings.json结尾的文件discover_settings_files避免把同一会话目录下无关的 JSON 配置混入统计目录去重对解析出的路径做HashSet去重重复或不存在非目录的路径会被跳过。在没有设置环境变量且HOME不可用时droid_session_paths会返回home directory is not set错误见 paths.rs 第 31-33 行。文件读取大小均衡分块 有序并行README 特别强调文件读取通过ccusage-adapter-common完成它负责 walking、size-balanced chunking 与 ordered parallel reads。对应实现位于 rust/adapters/common/src/lib.rscollect_files_with_extension递归遍历目录收集指定扩展名的文件chunk_file_indexes_by_size按文件字节大小做加权排序再用贪心算法把索引分配到各 chunk使每个 worker 处理的字节总量尽量均衡避免一个大文件拖慢整体read_files_parallel依据available_parallelism决定 worker 数量--single-thread时降为 1通过thread::scope并行读取并按原始文件顺序重组结果——droid 的load_entries_inner在注释中明确说明并行读回后必须保持排序后的文件顺序才能保证随后的稳定排序与最新快照优先去重结果与单线程读取一致见 loader.rs 第 26-28 行。每个文件由load_settings_file解析解析失败如 JSON 语法错误不会中断整体流程而是记入 debug 日志后跳过该文件返回None。Token 解析tokenUsage字段映射与兜底load_settings_file的核心是读取会话文件 JSON 中的tokenUsage对象parser.rs 中parse_token_usage按如下字段映射到 ccusage 的通用TokenUsageRawFactory Droid 字段ccusage 内部字段含义inputTokensinput_tokens输入 token 数outputTokensoutput_tokens输出 token 数cacheCreationTokenscache_creation_input_tokens缓存创建 token 数cacheReadTokenscache_read_input_tokens缓存读取 token 数thinkingTokensextra_total_tokens经reasoning_tokens思考 token 数单独计入总量totalTokens—兜底字段见下关键兜底逻辑当上述分项缺失时apply_total_token_fallback会尝试用totalTokens补齐对应测试falls_back_to_total_tokens_when_droid_parts_are_missing中仅给{totalTokens: 456}时output_tokens被置为 456。若五类 token 之和为 0则该文件被判定为无有效用量而跳过。thinkingTokens被单独保存在reasoning_tokens最终写入LoadedEntry.extra_total_tokens见 loader.rs 第 83 行并在报告统计时计入总 token 数——测试report_total_includes_thinking_tokens验证了这一点输入 100 输出 50 缓存创建 20 缓存读取 10 思考 5 总 token 185。模型与 Provider 归一化三路取模Droid 的模型名字符串很脏如custom:Claude-Opus-4.5-Thinking-[Anthropic]-0normalize_droid_model_name会按顺序处理剥离custom:前缀删除方括号[...]包裹的片段如[Anthropic]转小写并把.、空白、-统一折叠为单个-同时修剪首尾与连续连字符。结果custom:Claude-Opus-4.5-Thinking-[Anthropic]-0→claude-opus-4-5-thinking-0gemini-2.5-pro→gemini-2-5-pro见 loader.rs 测试normalizes_droid_model_names。模型的来源按优先级有三路model字段存在则直接归一化sidecar JSONLextract_model_from_sidecar_jsonl查找与session.settings.json同名的session.jsonl在前 500 行中扫描形如Model: xxx的行提取模型名对应测试falls_back_to_sidecar_jsonl_modelProvider 默认名都拿不到时按 provider 回退为claude-unknown、gpt-unknown、gemini-unknown、grok-unknown或unknown。Provider 同样有两级推断先看providerLock字段normalize_droid_provider会把claude/anthropic、google_ai/gemini/vertex_ai、x_ai/grok等别名归一到anthropic/google/xai若为unknown再由模型名特征反推含claude/opus/sonnet/haiku判为 anthropicgpt-/chatgpt/o数字 判为 openai含gemini判为 google含grok判为 xai。时间戳与定价以providerLockTimestamp为准会话条目需要一个时间戳用于日期分组与排序。settings_timestamp优先使用providerLockTimestampRFC 3339 格式经parse_ts_timestamp解析并统一序列化为毫秒精度字段缺失时兜底使用文件系统 mtime。这一选择对定价有直接影响calculate_droid_cost会带上pricing_timestamp即providerLockTimestamp调用calculate_cost_for_usage_at让费用按锁定 provider 时的价格计算而非按报告生成时的最新价。对应测试分别验证了preserves_provider_lock_timestamp_for_pricing设置文件带providerLockTimestamp时pricing_timestamp等于该时刻leaves_pricing_timestamp_empty_when_only_file_metadata_is_available仅能拿到 mtime 时pricing_timestamp为Nonedoes_not_use_display_timestamp_for_droid_pricingdeepseek 模型按 providerLock 时刻计价100 万输入 token × 0.00000014 0.14 美元。定价的模型候选由droid_model_candidates生成先尝试裸模型名再按 provider 加前缀如 anthropic 会依次尝试anthropic/model、openrouter/anthropic/modelopenai 尝试openai/、openrouter/openai/google 尝试google/、vertex_ai/、openrouter/google/xai 尝试xai/、openrouter/x-ai/取第一个能算出正费用的候选。注意calculate_droid_cost会把reasoning_tokens并入output_tokens参与计费且成本模式固定为CostMode::Calculate。会话去重最新快照优先latest-winsFactory Droid 的会话可能被多次写入快照例如archive/session-c.settings.json与根目录下的session-c.settings.json并存。load_entries_inner的去重策略是所有条目按时间戳升序排序从最新到最旧遍历用HashSet记录已见过的session_id每个session_id只保留时间戳最新的一条。测试keeps_latest_snapshot_for_duplicate_session_ids验证了这一点两个session-c快照05-01 与 05-02最终只产出 1 条且取 05-02 的用量输入 100、输出 200。session_id的取值来自文件名去掉.settings.json后缀即得如session-a.settings.json→session-a无法识别时回退为unknown。每个条目的 message id 统一写成droid:session_id格式项目名固定为droid、项目路径显示为Droid见to_loaded_entry。报告形状四类聚合与 JSON 输出report.rs 的summarize_entries按报告类型聚合Daily按entry.date分组Weekly / Monthly先按天聚合再通过summarize_summaries_by_bucket以周日为一周起点重新分桶Session按session_id分组并把分组键放入session_id字段。report_from_rows生成的 JSON 形状为{ daily | weekly | monthly | sessions: [...], totals: {...} }行内数据复用共享的agent_summary_json总额由totals_json计算——因此 droid 在 JSON 层面几乎没有重复代码这正是 README 所述只在与共享形状不同处做覆盖的体现。CLI 集成与运行流程Droid 适配器通过Command::Droid接入 ccusage 主程序rust/crates/ccusage/src/main.rs 第 39 行Some(Command::Droid(args)) adapter::droid::run(args)并在 rust/crates/ccusage-cli-parser/src/cli-commands.json 中注册了droid、droid daily、droid monthly、droid session等子命令。last_window.rs与timezone.rs也将 Droid 纳入--last-window与时区推导的适用命令列表。runlib.rs的完整流程是用PricingMap::load_with_overrides加载价格表支持--offline、日志级别与--pricing-overrides自定义load_entries并行读取、解析并去重filter_loaded_entries_by_date按--since/--until过滤日期summarize_entries按daily/weekly/monthly/session聚合sort_summaries按--order排序若--json含--jq、--no-cost则输出 JSON否则渲染标题为 Droid Token Usage Report 的表格。公共 API 与 README 声明完全一致loader::load_entries、report::report_from_rows、report::summarize_entries与run。依赖与构建层Cargo.toml的依赖全部走 workspace 版本ccusage-adapter-common文件遍历与并行读取、ccusage-coreLoadedEntry、PricingMap、汇总/输出通用逻辑、jiff时区换算与serde_json开发依赖ccusage-test-support提供fs_fixture!与EnvVarGuard等测试工具。构建上droid 属于adaptersCrane artifact 层该层在一次 Cargo 调用中同时编译全部适配器因此各适配器可并发构建。测试矩阵行为即契约droid 适配器的测试全部内联在 loader.rs 与 parser.rs 的#[cfg(test)]模块中覆盖了适配器全部关键行为模型名归一化normalizes_droid_model_namestotalTokens兜底falls_back_to_total_tokens_when_droid_parts_are_missing从 settings 文件加载用量loads_usage_from_droid_settings_filessidecar JSONL 取模型falls_back_to_sidecar_jsonl_model重复 session 取最新快照keeps_latest_snapshot_for_duplicate_session_idsthinking tokens 计入报告总量report_total_includes_thinking_tokens定价时间戳的三个分支providerLock 优先、mtime 兜底、deepseek 按锁定时刻计价。这些测试同时充当了可运行的行为契约任何对解析、去重或定价逻辑的改动都必须保持上述语义不变。如果你要基于 Factory Droid 的会话文件做自定义统计这套映射与兜底规则就是最可靠的参考蓝本。【免费下载链接】ccusagenpx ccusage项目地址: https://gitcode.com/gh_mirrors/cc/ccusage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CANN ops-math 中 aclnnPowTensorTensor 与 aclnnInplacePowTensorTensor 两段式接口完全指南

CANN ops-math 中 aclnnPowTensorTensor 与 aclnnInplacePowTensorTensor 两段式接口完全指南

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

2026/9/21 2:46:31 阅读更多 →
电视直播程序源码分析:从ZIP到运行的完整实战指南

电视直播程序源码分析:从ZIP到运行的完整实战指南

简介:一份面向ASP初学者与直播类网站开发者的电视直播程序完整源代码包,涵盖前台播放、后台管理、用户与广告等模块,可帮助读者理解动态站点前后台协作逻辑,并快速搭建可运行的电视直播示例。压缩包共76个文件,以asp动…

2026/9/21 2:46:31 阅读更多 →
深入解析HWiNFO64:从传感器数据到硬件健康监测的完整指南

深入解析HWiNFO64:从传感器数据到硬件健康监测的完整指南

简介:HWiNFO64 v6.32.4270 是一款面向 64 位 Windows 系统的专业硬件信息检测与性能测试工具,适合普通用户、装机维护人员与硬件爱好者快速查看整机配置、确认硬件状态。它能够显示处理器、主板、芯片组、PCMCIA 接口、BIOS 版本、内存等核心硬件信息&am…

2026/9/21 2:46:31 阅读更多 →

最新新闻

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全

ARIS 工作流总览:从 idea 到 paper 的 13 条 pipeline 如何一次看全 【免费下载链接】Auto-claude-code-research-in-sleep ARIS ⚔️ (Auto-Research-In-Sleep) — Lightweight Markdown-only skills for autonomous ML research: cross-model review loops, idea …

2026/9/21 4:06:15 阅读更多 →
Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理

Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理

Roc 格式化器幂等性测试实战:从 issue 8851 快照看多行分发与字段访问的格式化处理 【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 导读:本文以 Roc 编译器仓库中的快照测试…

2026/9/21 4:04:14 阅读更多 →
TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南

TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南

TypePHP编译器API参考:程序化调用PHP AOT编译器的完整指南 【免费下载链接】typephp Compile PHP to Native Binaries 项目地址: https://gitcode.com/GitHub_Trending/ty/typephp TypePHP 是一款用 PHP 编写的原生 AOT 编译器(tpc)&a…

2026/9/21 4:04:14 阅读更多 →
React Admin 实时数据提供者(Realtime Data Provider)接入完整指南:方法签名、内置适配器与自定义实现

React Admin 实时数据提供者(Realtime Data Provider)接入完整指南:方法签名、内置适配器与自定义实现

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 本指南系…

2026/9/21 4:04:14 阅读更多 →
VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局

VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局

VitePress 默认主题 Layout 指南:深入理解 doc、page、home 与自定义布局 【免费下载链接】vitepress Vite & Vue powered static site generator. 项目地址: https://gitcode.com/gh_mirrors/vi/vitepress VitePress 通过 frontmatter 中的 layout 选项…

2026/9/21 4:04:14 阅读更多 →
Weex 鸿蒙化实践:js-base64 纯 JS 编解码库在 WebSceneAPI 中的集成与使用指南

Weex 鸿蒙化实践:js-base64 纯 JS 编解码库在 WebSceneAPI 中的集成与使用指南

移动开发跨平台前端UI组件OpenHarmony 【免费下载链接】weex A framework for building Mobile cross-platform UI 项目地址: https://gitcode.com/gh_mirrors/we/weex 点击查看 免费下载 导读 本文基于 WebSceneAPI 模块 内置的 js-base64 库(位于 co…

2026/9/21 4:04:14 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/19 23:35:34 阅读更多 →