尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

codeburn 接入 Zerostack:基于累计 Token 总量的 Rust 编码 Agent 用量解析实现

发布时间:2026/9/24 4:54:35

资讯中心
01
ARTICLE

codeburn 接入 Zerostack:基于累计 Token 总量的 Rust 编码 Agent 用量解析实现

codeburn 接入 Zerostack:基于累计 Token 总量的 Rust 编码 Agent 用量解析实现
【免费下载链接】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点击查看免费下载Zerostackgi-dellav/zerostack是一个极简的 Rust 编码 Agent支持 OpenRouter默认、OpenAI、Anthropic、Gemini 与 Ollama 等后端。codeburn 通过src/providers/zerostack.ts以急切加载eager方式内置对其会话数据的支持读取磁盘上 JSON 格式的会话文件把每个会话的累计 Token 总量解析为一次ParsedProviderCall并按 LiteLLM 定价重新计算成本。读完本文你将掌握 Zerostack 会话的存储位置与格式、codeburn 侧的数据读取与解析链路、累计式 Token 模型的成本口径以及缓存、去重、模型显示名等关键实现细节和排障清单。集成概况Zerostack 集成是 codeburn 37 个 AI 工具/Agent 追踪目标之一属于核心coreProvider随主进程一并加载而非按需懒加载。这一点可以从注册位置确认源码src/providers/zerostack.ts加载方式eager导入与注册见 src/providers/index.ts 与 coreProviders 数组测试tests/providers/zerostack.test.ts它实现了 src/providers/types.ts 中定义的Provider接口即提供四个核心能力probeRoots()向codeburn doctor报告会话目录探测根便于自诊断discoverSessions()扫描目录、发现会话文件createSessionParser()为单个会话创建解析器modelDisplayName()/toolDisplayName()模型与工具的展示名规范化。数据读取位置Where it reads fromZerostack 将会话数据写入平台数据目录下的zerostack/sessions/对应其 Rust 侧dirs::data_dir的解析规则zerostack 的src/session/storage.rsOS路径macOS~/Library/Application Support/zerostack/sessions/Linux$XDG_DATA_HOME/zerostack/sessions/未设置时回退到~/.local/share/zerostack/sessions/上述规则在 defaultSessionsDir() 中复现function defaultSessionsDir(): string { const override process.env[ZS_DATA_DIR] if (override) return join(override, sessions) const base platform() darwin ? join(homedir(), Library, Application Support) : process.env[XDG_DATA_HOME] ?? join(homedir(), .local, share) return join(base, zerostack, sessions) }两个可覆盖点环境变量ZS_DATA_DIR覆盖整个基础数据目录随后仍在其下拼接sessions子目录即最终会话目录为ZS_DATA_DIR/sessions构造参数sessionsDircreateZerostackProvider(dir)直接以传入目录作为会话目录完全绕过默认解析测试正是利用这一点避免依赖真实用户目录。存储格式Storage format每个会话是数据目录下的一个uuid.json文件单个文件即一个完整的Session对象。结构为messages[]数组每条消息含role、content、estimated_tokens粗略估计非计费口径会话级元数据id、created_at、updated_at、total_input_tokens、total_output_tokens、total_cost、model、provider、working_dir等。测试夹具 tests/providers/zerostack.test.ts 给出了一个真实形态的会话文件样例{ id: sess-001, name: , messages: [ { role: user, content: hello, what is this repo about?, estimated_tokens: 7 }, { role: assistant, content: It is a minimal coding agent in Rust., estimated_tokens: 92 } ], compactions: [], created_at: 2026-06-19T11:33:34.02283600:00, updated_at: 2026-06-19T11:34:14.14063100:00, total_input_tokens: 34119, total_output_tokens: 961, total_cost: 0.015677835, total_estimated_tokens: 446, model: deepseek/deepseek-v4-pro, provider: openrouter, working_dir: /Users/test/myproject, permission_allowlist: [] }codeburn 侧对应结构体为ZerostackSession见 zerostack.ts#L32-L42读取时若readSessionFile返回空或JSON.parse失败则跳过该文件。会话读取依赖 src/fs-utils.ts 的readSessionFile工具。Token 模型累计式而非按次调用Token modelZerostack 的计费 Token 是会话累计值不是每次调用的明细。真正可计费的 Token 只以会话汇总形式存在——total_input_tokens、total_output_tokens——与model、provider、working_dir并列。单条消息仅携带粗略的estimated_tokens不用于计费。因此解析器对每个会话只产生一条ParsedProviderCallToken 取自会话汇总成本由 codeburn 通过calculateCost基于 LiteLLM 定价数据重新计算不采用会话自带的total_cost字段。理由在于total_cost是 Zerostack 内部按自身费率算出的数字codeburn 统一以 LiteLLM 标准费率重估保证与其它 Provider 的成本口径一致。核心解析逻辑见 createParser()const input session.total_input_tokens ?? 0 const output session.total_output_tokens ?? 0 if (input 0 output 0) return // 零 Token 会话直接跳过 const model session.model ?? yield { provider: source.provider, model, inputTokens: input, outputTokens: output, cacheCreationInputTokens: 0, cacheReadInputTokens: 0, cachedInputTokens: 0, reasoningTokens: 0, webSearchRequests: 0, costUSD: calculateCost(model, input, output, 0, 0, 0), tools: [], bashCommands: [], timestamp, speed: standard, userMessage: firstUserMessage(session.messages ?? []), sessionId, project: source.project, projectPath: session.working_dir, }要点userMessage取自首条role user消息支持纯字符串与多段文本两种 content 形态见 firstUserMessage()projectPath直接映射 Zerostack 的working_dircalculateCost的签名与实现位于 src/models.ts#L1208-L1254按输入/输出 Token 单价支持分级定价、缓存写入/读取单价、Web 搜索单价计算未知模型会输出警告并返回$0。缓存Caching无。Zerostack 集成不依赖任何会话缓存层每次解析直接读取磁盘上的 JSON 文件。去重Deduplication每个会话的唯一去重键格式为zerostack:path:updated_at:id其中path是会话文件绝对路径updated_at是会话最后更新时间戳id是会话 ID缺失时回退为文件名去掉.json后缀。解析前先用seenKeys集合检查命中则跳过见 zerostack.ts#L85-L89。这一机制保证跨 Provider、跨多次解析如重复运行codeburn时同一会话只统计一次测试用例 deduplicates across repeated parses 专门覆盖了该行为。已知怪癖Quirks这些是接入 Zerostack 时踩过的坑也是理解其报表数据的前提无缓存拆分No cache breakdownZerostack 的Usage只携带input_tokens和output_tokens其src/agent/runner.rs任何被缓存命中的 prompt Token 都被并入输入计数写入会话前已丢弃拆分。因此 codeburn 解析出的缓存字段恒为0缓存占比读数恒为 0。成本按 LiteLLM 标准输入费率重估——当实际启用了缓存时可能略微高估——这与 Zerostack 自身扁平的input_token_cost口径一致。无工具数据No tool dataZerostack 只持久化最终 assistant 文本不记录工具调用或 bash 记录故tools与bashCommands恒为空数组。虽然代码中保留了一张toolNameMapbash→Bash、read→Read、write→Write、edit→Edit、grep→Grep、glob→Glob、fetch→WebFetch、search→WebSearch、task→Agent见 zerostack.ts#L15-L25目前仅作为防御性展示名规范化存在。OpenRouter 模型 ID 带路由前缀例如deepseek/deepseek-v4-pro。modelDisplayName先剥离路由前缀/^[^/]\//正则去掉首段再解析短名calculateCost则直接以带前缀的 ID 查 LiteLLM 的规范名映射。测试断言deepseek/deepseek-v4-pro显示为DeepSeek v4 Pro见 zerostack.test.ts#L134-L136。整会话时间戳Whole-session timestamp所有花费都归因于updated_at因为累计总量无法按天拆分updated_at缺失时回退到created_at。未知/本地模型按$0计价Ollama 或自定义模型没有 LiteLLM 定价数据calculateCost返回$0且不抛错属预期行为测试 prices unknown local models at zero 验证。会话发现与解析链路源码视角discoverSessions()zerostack.ts#L140-L158的流程readdir(dir)读取会话目录目录不存在或不可读时返回空数组不会抛错过滤出.json后缀文件逐个readSession解析解析失败非 JSON或读不到则跳过项目名project优先取working_dir的 basename否则回退为文件名去掉.json产出SessionSourcepath、project、provider: zerostack交给createSessionParser解析。解析器随后按上文所述为每个会话产出唯一一条ParsedProviderCall。整条链路对损坏文件、缺失目录、零 Token 会话均做了静默容错符合codeburn doctor自诊断的定位——probeRoots()返回的目录就是实际解析用的目录遵循环境变量与默认解析探测结果可独立校验。测试覆盖tests/providers/zerostack.test.ts 采用真实文件系统夹具mkdtemp建临时目录、写入 JSON、createZerostackProvider(tmpDir)注入目录不 mock 文件系统。覆盖四组行为发现按working_dir派生项目名跳过非 JSON 与损坏文件不存在的目录返回空解析每会话一条累计调用且成本 0零 Token 会话跳过重复解析去重未知本地模型定价为$0不抛错展示名name/displayName正确剥离 OpenRouter 路由前缀工具名规范化未知工具原样返回。排障清单When fixing a bug hereZerostack 集成出问题时按文档与源码建议的顺序排查先判定问题归属发现阶段discovery——会话文件根本没被拾取。检查数据目录解析对照本仓库的defaultSessionsDir()与 Zerostack 上游src/session/storage.rs的data_dir规则是否一致确认环境变量ZS_DATA_DIR、XDG_DATA_HOME是否生效解析阶段parsing——文件被拾取了但总量映射错误。检查ZerostackSession字段与磁盘 JSON 的对应关系。字段重命名Zerostack 的会话结构体是上游src/session/mod.rs中的Session。若上游字段改名需同步更新 ZerostackSession 类型 以匹配。补测试在 tests/providers/zerostack.test.ts 中新增一个夹具格式的会话文件不要 mock 文件系统——保持与生产环境一致的磁盘读取路径才能真实暴露路径解析与字段映射问题。延伸阅读Provider 集成的整体文档结构见 docs/providers/README.md架构总览见 docs/architecture.mdZerostack 完整文档位于 docs/providers/zerostack.md。赞分享【免费下载链接】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 MCP Server把本地 AI 编码 Token 用量与成本暴露给 Agent 的设计与实现CodeBurn MCP Server把本地 AI 编码 Token 用量与成本暴露给 Agent 的设计与实现 本指南以 docs/design/codebCodeBurn 接入 Vercel AI Gateway基于 /v1/report 的云用量统计与去重策略CodeBurn 接入 Vercel AI Gateway基于 /v1/report 的云用量统计与去重策略 本文以开源项目 CodeBurn 中的 VercCodeBurn MCP Server 实现指南基于 stdio 的 codeburn mcp 用量与节省分析服务CodeBurn MCP Server 实现指南基于 stdio 的 codeburn mcp 用量与节省分析服务 CodeBurn 是一款在本机追踪 AI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。