
【免费下载链接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn项目地址https://gitcode.com/gh_mirrors/co/codeburn点击查看免费下载Open Design 是 codeburn 所追踪的 37 类 AI 编码工具/代理之一它以每次运行一个事件流 JSONL 日志的方式落盘token 用量附着在周期性的usage事件上而非每条会话轮次上。本文以 docs/providers/open-design.md 为骨架结合 src/providers/open-design.ts 的实现与 tests/providers/open-design.test.ts 的测试夹具完整讲解其日志目录发现、事件格式解析、缓存读取与推理 token 的计费归因、跨运行去重机制以及排查成本为 $0类问题时的调试清单。Open Design 在 codeburn 中的定位在 codeburn 的提供方体系中Open Design 属于核心提供方core provider它被静态导入并常驻内存而非像 Antigravity、Warp、Vercel AI Gateway 等提供方那样按需懒加载。这一点在 src/providers/index.ts 与 src/providers/index.ts 的coreProviders数组中可以确认——openDesign与 Claude、Cline、Codex、Gemini 等一并列在 eager 列表内。// src/providers/index.ts节选 import { openDesign } from ./open-design.js // ... const coreProviders: Provider[] [ claude, cline, clineCli, /* ... */ openDesign, pi, omp, /* ... */ ]作为实现事实tests/providers/open-design.test.ts 中有一条专门断言allProviderNames()包含open-design保证该提供方始终注册在--provider参数校验的白名单中。其整合方式非常轻薄读取 Open Design 代理在本地落盘的运行日志解析出每次调用的模型、token 与成本喂给 codeburn 统一的分组、报表与 dashboard 管线不涉及网络请求、配额接口或 provider 级缓存。数据来源默认目录、环境变量覆盖与多形态目录发现各操作系统默认路径Open Design 的运行日志按平台存放在应用数据目录下src/providers/open-design.ts 的getOpenDesignDir()按platform()分派OS默认路径macOS~/Library/Application Support/Open DesignWindows%APPDATA%/Open DesignLinux~/.config/Open DesignWindows 分支有一个细节当%APPDATA%环境变量缺失时会回退到~/AppData/Roaming避免join得到非法路径。环境变量覆盖设置$CODEBURN_OPEN_DESIGN_DIR可以覆盖上述所有默认路径这在调试和测试中尤其有用详见下文调试清单。源码中的常量ENV_DIR CODEBURN_OPEN_DESIGN_DIRsrc/providers/open-design.ts在getOpenDesignDir()第一行就被读取只要该变量存在就直接作为基目录返回。多形态目录发现逻辑Open Design 的安装形态并不统一可能把日志根目录以namespaces根、data目录、runs目录或普通根目录四种形态之一暴露出来。为此 src/providers/open-design.ts 的discoverOpenDesignSessions()依据基目录的 basename做分支runs目录直接对该目录做逐 run 扫描namespace 由其父目录推导data目录扫描其下的runs子目录namespaces根遍历每个 namespace 子目录再进入ns/data/runs扫描普通根目录同时尝试base/data/runs与base/runs两种形态若存在namespaces子目录也一并遍历。无论从哪种形态进入最终都会被归一化到namespace/data/runs/runId/events.jsonl这一标准形态。逐 run 扫描由discoverRunsDir()src/providers/open-design.ts完成它读取目录下的每个子目录只把其中确实存在且为常规文件的events.jsonl记为SessionSource目录不存在或为空时静默返回空列表不会抛错中断整个扫描。一个关键细节是按解析后路径去重dedupeSources()src/providers/open-design.ts用一个Set对 source.path 去重。由于普通根形态会同时探测data/runs与runs两个位置若某个安装的目录结构存在重叠例如runs恰好就是data/runs的父目录引用关系模糊根不会导致同一个 run 被重复计数。存储格式逐行 JSON 的事件流Open Design 每次运行生成一个events.jsonl文件每行一个 JSON 事件对象字段结构为{ id: ..., event: ..., data: { ... }, timestamp: ... }id事件唯一标识用于去重见下文去重机制event事件类型目前代码只消费start与agent两种data事件负载按事件类型承载不同字段timestamp事件时间既可以是 ISO 8601 字符串也可以是数字 epoch 毫秒值。事件类型语义从 src/providers/open-design.ts 的解析循环可以归纳出三类有效事件start事件运行起始data.model携带当前模型标识用于为后续 usage 事件播种模型agentdata.type status状态切换事件data.model同样会更新当前模型agentdata.type usagetoken 用量事件data.usage中携带四个计数字段{ event: agent, data: { type: usage, usage: { input_tokens: 1000, output_tokens: 200, cached_read_tokens: 50, thought_tokens: 25 } } }usage各字段含义如下字段含义input_tokens本次调用的输入 token 总数已包含缓存读取部分output_tokens输出 token 数cached_read_tokens其中命中缓存、按缓存读取费率计价的 token 数thought_tokens推理reasoningtoken 数按输出费率计价解析的健壮性守卫解析器对脏数据相当宽容这体现在 src/providers/open-design.ts 的一组小工具函数上parseEvent()L53-L63对每一行先 trim空行跳过JSON.parse失败或解析结果不是普通对象时返回null并跳过——单行损坏不会拖垮整个 runstringValue()L36-L38只接受非空字符串tokenValue()L40-L42只接受有限正数负数、NaN、Infinity、非数字一律归一为 0防止损坏日志产生负 token 进而污染聚合总额timestampValue()L44-L51字符串原样保留数字按new Date(value)转为 ISO 字符串无法解释的数字返回空串。其中数字时间戳的兼容处理有专门测试覆盖run-mixed夹具中第二条 usage 事件的时间戳是数字1782122405000tests/providers/open-design.test.ts 验证经parseAllSessions与日期范围过滤后其timestamp被正确归一化为2026-06-22T10:00:05.000Z且在跨日聚合中不会被误排除。Token 归因与本地成本核算先减缓存、后计费Open Design 的input_tokens字段是含缓存读取的总额。如果直接把它当作新鲜输入去计价缓存命中的部分就会被按全价输入费率重复计费。因此解析器在调用计费函数前先做减法src/providers/open-design.tsconst uncachedInputTokens Math.max(0, usage.inputTokens - usage.cacheReadTokens)Math.max(0, …)同样是为了防御损坏数据若缓存读取数异常大于输入总数不会产生负的新鲜输入。推理 token 折入输出thought_tokens属于推理链 token按业界惯例以输出费率计价。解析器将其直接并入输出参数再传给calculateCostsrc/providers/open-design.tsconst costUSD calculateCost( currentModel, uncachedInputTokens, usage.outputTokens usage.reasoningTokens, 0, // cacheCreationTokens usage.cacheReadTokens, 0, // webSearchRequests )对应 src/models.ts 的calculateCost(model, inputTokens, outputTokens, cacheCreationTokens, cacheReadTokens, webSearchRequests, speed)缓存读取 token 走cacheReadCostPerToken档位缓存写入档位在此传 0推理 token 因并入outputTokens而按outputCostPerToken计价。测试中也用同一函数反算验证run-mixed夹具中 codex 调用期望costUSD ≈ calculateCost(model, 950, 225, 0, 50, 0)tests/providers/open-design.test.ts即输入 950 1000 − 50 缓存、输出 225 200 25 推理。由此产出的ParsedProviderCall记录把各分量拆开保留src/providers/open-design.tsinputTokens存减缓存后的新鲜输入cacheReadInputTokens与cachedInputTokens都记缓存读取数reasoningTokens独立成字段供报表分别展示。未知模型与 $0 成本成本计算完全在本地进行。若模型名不在定价表中calculateCost返回 0codeburn 会给出no pricing data提示默认仅在CODEBURN_VERBOSE1时输出明细而不会虚构价格。因此成本为 $0有两种常见成因一是模型本身无定价数据二是模型从未被正确播种见下节怪癖。Provider 级无缓存文档明确Open Design 提供方没有 provider 级缓存。每次扫描都重新读取磁盘上的events.jsonl跨扫描的一致性不依赖缓存层而是依赖下述去重键机制。去重机制open-design:sessionId:eventId与其他提供方一样codeburn 用去重键防止同一份日志被重复统计例如多次运行codeburn扫描同一目录、或解析中断后重扫。Open Design 的去重键构造规则src/providers/open-design.tsopen-design:sessionId:eventIdsessionId取运行目录名即events.jsonl所在目录的 basenameeventId取事件自身的id字段若某事件没有id字段则回退到行号计数器line-0、line-1……fallbackEventCounter。去重通过解析器共享的seenKeys: Setstring实现同一个Set实例被传入不同解析器乃至不同扫描轮次usage事件若发现自己的键已存在则直接跳过。测试对这一点做了直接验证tests/providers/open-design.test.ts 用同一个seenKeys对run-mixed夹具连续解析两次第一次产出 2 条调用第二次产出 0 条——证明去重键确实跨解析轮次生效。另外夹具run-mixed中特意安排了两个id相同的 usage 事件evt-glm-usage第二次解析被去重键拦截说明同一 run 内重复 id 的脏数据也不会被重复统计。已知边界与怪癖先有模型后有 usage解析器维护一个currentModel状态只有start事件或agentstatus事件携带了模型之后后续usage事件才会被计入在模型未知前到达的 usage 事件会被直接丢弃而不会归因到unknown模型。从源码看这是if (!usage || !currentModel) continuesrc/providers/open-design.ts这一守卫的直接结果。设计意图很明确宁可丢一条无法归属的用量也不把成本挂到错误模型上造成报表污染。这一行为在夹具中有正反两个例子run-start-seededstart事件先播种glm-5.2随后到达的 usage 事件被正确计入模型glm-5.2、输入 770、输出 33、缓存读取 7、推理 3run-no-usage整个 run 只有start、status和一条message事件、没有任何 usage 事件解析结果为空——tests/providers/open-design.test.ts 断言calls长度为 0。不追踪工具与 bash 命令Open Design 的事件流目前不暴露逐调用per-call的工具名因此每次产出的调用记录中tools与bashCommands恒为空数组。这意味着按工具维度如 Skills Agents 细分的报表中Open Design 的数据不会出现在工具维度统计里。仅两个模型的显示名覆盖modelDisplayName()维护了一个很小的映射表src/providers/open-design.ts原始模型串显示名openai-codex:gpt-5.5GPT-5.5glm-5.2GLM-5.2GLM-5.2GLM-5.2除此之外的任何模型串原样展示。也就是说模型重命名只作用于这两个特例新模型接入 Open Design 时无需改动代码即可显示。测试覆盖三组夹具与七条用例测试夹具位于 tests/fixtures/open-design/采用真实的namespaces目录形态namespaces/release-stable/data/runs/runId/events.jsonl每条用例都基于真实文件而非内存字符串夹具 run场景run-mixed混合模型运行start播种 codexusage 用数字时间戳status切到 glm第二次 usage 携带重复 id验证去重run-start-seededstart先播种模型验证无 status 前置也能归属run-no-usage只有 start/status/message、无 usage验证零产出tests/providers/open-design.test.ts 共 7 条用例覆盖环境变量覆盖下的目录发现3 个 run 全部发现、project 均为release-stable、混合模型拆分为逐模型调用含 token/时间戳/成本断言、无 usage 运行零产出、start 播种模型、数字 epoch 时间戳在日期聚合中的归一化、跨解析器轮次去重以及核心提供方注册断言。测试通过process.env[CODEBURN_OPEN_DESIGN_DIR]指向夹具的data目录来驱动发现逻辑并在afterEach中还原环境变量与临时缓存目录tests/providers/open-design.test.ts——这也从侧面演示了调试该提供方时的标准手法。在 codeburn 中调试 Open Design 的清单基于文档When fixing a bug here一节结合源码与测试可整理出如下排查顺序确认安装实际使用的目录形态。先用codeburn doctor查看 probe 到的路径probeRoots()返回的就是overrideDir ?? getOpenDesignDir()src/providers/open-design.ts。然后按需设置CODEBURN_OPEN_DESIGN_DIR指向具体的data、runs或namespaces根——这是把发现逻辑指向指定目录最快的方式测试正是这么做的。若成本为 $0先查模型播种。检查该 run 的events.jsonl里在第一个usage事件之前是否出现过携带data.model的start或status事件若没有usage 事件会被静默丢弃。其次再排查模型是否在定价表内未知模型会输出 no pricing data 提示可用CODEBURN_VERBOSE1查看。新增测试夹具时事件文件放入tests/fixtures/open-design/保持namespaces/ns/data/runs/runId/events.jsonl形态用例追加到tests/providers/open-design.test.ts并在测试的beforeEach中把CODEBURN_OPEN_DESIGN_DIR指向新夹具目录。这条清单同样适用于向 Open Design 事件流新增字段或新事件类型的场景先确认目录形态与模型播种顺序再以夹具驱动解析就能在改动src/providers/open-design.ts后快速验证不回归。赞分享【免费下载链接】codeburnFree, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn项目地址https://gitcode.com/gh_mirrors/co/codeburn点击查看免费下载相关推荐CodeBurn 解析 DroidFactory CLI会话JSONL 数据源、会话级 Token 均摊与成本核算实现详解CodeBurn 解析 DroidFactory CLI会话JSONL 数据源、会话级 Token 均摊与成本核算实现详解 Droid 是 FactoryCodeBurn 的 Qwen Code CLI 集成JSONL 会话解析、Token 成本核算与去重机制全解析CodeBurn 的 Qwen Code CLI 集成JSONL 会话解析、Token 成本核算与去重机制全解析 CodeBurn 是一款本地运行、无需账号的CodeBurn 集成 OpenClaudeClaude Code 分支的 JSONL 会话解析与成本核算全解析CodeBurn 集成 OpenClaudeClaude Code 分支的 JSONL 会话解析与成本核算全解析 本文聚焦 CodeBurn 对 OpenCl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考