Token 统计 (token-stats) · V1.0.2
在对话收尾时,读取 WorkBuddy 自动保存的对话记录,从每条助手消息的
providerData 中提取 LLM 调用的真实用量数据,按维度汇总并展示报告。
为什么能做"真值"统计
WorkBuddy 会把每次对话存盘到 ~/.workbuddy/projects/<项目>/<sessionId>.jsonl,
其中每条助手消息都带有 providerData.rawUsage / providerData.usage,
包含 API 真实返回的 prompt_tokens(输入)、completion_tokens(输出)、
prompt_cache_hit_tokens(缓存命中)、reasoning_tokens(推理)、credit(成本)。
因此本技能输出的是真实用量,不是估算。
何时使用
- 用户明确要求统计 token("统计一下本次对话的token" / "看看花了多少")。
- 每次对话收尾(任务交付、或判断对话将结束)必须主动运行并展示,无需用户显式要求——这就是"对话结束自动显示"的实现方式。
- 想了解缓存命中率、推理 token 占比、单次/累计成本时。
调用方式(由 Agent 执行)
技能内置脚本 scripts/token_report.py(纯标准库,无需安装依赖):
# 统计"当前对话"(默认,取 app/sessions.json 中最新会话)
python "<skill_dir>/scripts/token_report.py"
# 统计指定历史会话
python "<skill_dir>/scripts/token_report.py" --session <sessionId>
# 直接指定对话 jsonl 文件
python "<skill_dir>/scripts/token_report.py" --jsonl <path/to/sessionId.jsonl>
# 汇总所有历史会话的总量与成本(来自 session_usage 表)
python "<skill_dir>/scripts/token_report.py" --all
# 汇总某日期之后的历史会话
python "<skill_dir>/scripts/token_report.py" --since 2026-08-01
# 生成 CodeBuddy 风格的 HTML 卡片(而非纯文本),写入文件
python "<skill_dir>/scripts/token_report.py" --html --out token_card.html
python "<skill_dir>/scripts/token_report.py" --all --html --out token_card_all.html
# 生成「单对话」可点击图标控件,写入文件(完整 HTML 页面)
python "<skill_dir>/scripts/token_report.py" --widget-session --out token_widget_session.html
# 【每轮对话结束后的标准形态】一次输出『第 N 轮图标 + 历史汇总图标』两个(推荐)
# 内联展示用 --bare:脚本会把 HTML 写入固定中转文件,stdout 输出 [WIDGET_FILE] 标记,
# Agent 读取该文件后原样传入 show_widget,避免超长单行被截断。
python "<skill_dir>/scripts/token_report.py" --widget-pair <N> --bare
# 只输出『第 N 轮』单个图标(该轮 token 使用情况)
python "<skill_dir>/scripts/token_report.py" --widget-turn <N> --bare
# 只输出『当前任务历史汇总』单个图标(累计 token 总量)
python "<skill_dir>/scripts/token_report.py" --widget-total-session --bare
# 生成「历史总用量」可点击图标控件,写入文件(完整 HTML 页面)
# 默认统计【全部任务】(不区分工作区);如需限定可加 --scope workspace / --workspace
python "<skill_dir>/scripts/token_report.py" --widget-total --out token_widget_total.html
# 所有 --widget-*/--html 输出均可用 --bare 生成裸 HTML 片段(供 show_widget 内联)
python "<skill_dir>/scripts/token_report.py" --widget-session --bare
<skill_dir>即本技能目录(如~/.workbuddy/skills/token-stats)。 请使用 WorkBuddy 自带的托管 Python(位于~/.workbuddy/binaries/python/versions/<版本>/python.exe,当前环境为 3.13.12)。
脚本默认输出一份中文纯文本报告(含输入/输出/总计/缓存命中率/成本/模型分布),
并把机器可读的 JSON 摘要打印到 stderr([json]{...}),便于进一步处理。
加 --html --out <file.html> 可改为输出 CodeBuddy 风格的 HTML 卡片
(浅色圆角、图标、指标块、缓存进度条、成本分块),更接近 CodeBuddy 前端观感。
报告维度说明
| 维度 | 含义 | 数据来源 |
|------|------|----------|
| 输入 tokens | 发给模型的总 token(含系统提示、上下文、工具结果) | prompt_tokens / inputTokens |
| 输出 tokens | 模型生成的总 token(含文本与工具调用参数) | completion_tokens / outputTokens |
| └ 推理 tokens | 输出中用于思维链(Thinking)的部分 | reasoning_tokens |
| 总计 tokens | 输入 + 输出 | total_tokens |
| 缓存命中率 | 命中缓存的输入 token ÷ 输入 token | prompt_cache_hit_tokens ÷ prompt_tokens |
| 积分消耗 | WorkBuddy 平台积分(非人民币),直接读取,既非官方厂商价算法,也非真实人民币扣费 | session_usage.credit_json(按会话汇总) |
| 官方价估算 | 按各模型厂商官方公开价折算的人民币估算值(含输入/输出/缓存命中折扣),仅供参考、非实际扣费 | prices.json(外挂价格表,每周一自动刷新) |
缓存命中率口径:在开启 Prompt Caching 的模型上,每次调用的输入中
与历史前缀重合的部分会被记为"缓存命中",按 命中 ÷ 输入 计算命中率。
未开启缓存或未命中时该比例为 0%,属正常。
积分口径(重要):报告里的"积分消耗"读取自 WorkBuddy 自己的
session_usage.credit_json 字段,单位是平台积分,不是人民币,也不是
模型厂商(OpenAI / 智谱 / DeepSeek 等)官网的实时公开价。
- 不是官方(厂商)算法:
credit是 WorkBuddy 平台自己的折算规则,把每次 对话的 token 折算成平台积分,与厂商官网价无直接关系。 - 不是真实人民币扣费:WorkBuddy 采用积分额度制套餐——体验版 500、
标准版 2000、高级版 4000、旗舰版 20000 积分/月。
credit_json记录的是本次 会话消耗的积分数量,扣的是你的套餐额度,而非直接扣银行卡。 - token 数量才是真值:输入/输出/缓存等维度均为 API 真实返回,绝对真实; 只有"积分"这一列是平台折算值。
若想按模型厂商官网价独立估算人民币花费做交叉核对,可后续给脚本加一张价格表 (可选联网拉最新价),但那是一份估算值,与平台积分无直接换算关系。
官方价估算(人民币,仅供参考)
报告中的"💵 官方价估算"列,是根据本技能自带的外挂价格表
prices.json,按各模型厂商官方公开价折算的人民币估算值。
为什么需要它:平台"积分"只代表套餐额度消耗,与厂商官网价、人民币均无 1:1 关系;而 token 数量虽是真值,但没有价格就不知道"值多少钱"。本估算把二者结合, 让你直观看到"按官方价大概要花多少"。
价格表 prices.json:
- 位于技能根目录,按 WorkBuddy 内部模型名(如
glm-5.2、hy3、deepseek-v4-flash、minimax-m3)建索引,每条含:厂商、官方型号、输入价、输出价、缓存命中价 (人民币 / 百万 tokens)、来源链接、更新日期、备注。- 周期性自动刷新(每次触发检查,缺失自动补建):用户每次触发本技能统计 token 时,
Agent 会先检查、若不存在有效任务则自动创建一条「每周一刷新价格表」自动化任务
(见下方「每次触发都必须检查并补齐价格刷新自动化」一节),每周一联网核对各厂商官方定价页并把
最新价写回
prices.json的input/output/cache_hit/updated/source字段,避免计价错误。 当前记录口径(2026-08-19): - 智谱 GLM-5.2 / 5.1:输入 ¥8、输出 ¥28、缓存命中 ¥2(open.bigmodel.cn)
- 腾讯混元 hy3:按 HY 2.0 Instruct 32K+ 档(输入 ¥4.505、输出 ¥11.13)代理估算, 型号映射待确认(官方文档目前到 HY 2.0)
- DeepSeek V4 Pro / Flash:峰谷计价(2026-08-17 起)。表内为空闲时段价, 高峰时段(北京时间 9:00-12:00、14:00-18:00)翻倍;报告会提示
- MiniMax M3(≤512K):输入 ¥4.2、输出 ¥16.8、缓存读取 ¥0.84(永久五折后)
- 小米 MiMo-V2.5(2026-05-27 永久降价后):输入 ¥1、输出 ¥2、缓存命中 ¥0.02 (闲时凌晨 0-8 点打八折)
- 周期性自动刷新(每次触发检查,缺失自动补建):用户每次触发本技能统计 token 时,
Agent 会先检查、若不存在有效任务则自动创建一条「每周一刷新价格表」自动化任务
(见下方「每次触发都必须检查并补齐价格刷新自动化」一节),每周一联网核对各厂商官方定价页并把
最新价写回
计算口径:成本 = (输入−缓存命中)×输入价 + 缓存命中×缓存命中价 + 输出×输出价
(单位:人民币 / 百万 tokens)。无缓存命中价的模型,命中部分按输入价计。
新模型自动识别与价格表治理(重要):
- 自动识别登记:统计时若发现价格表未收录的模型(含自定义模型),脚本自动把
它登记进
prices.json(占位条目:价格为 null、note 标注)。custom-/local:前缀的自定义本地模型标注『自定义本地模型,无官方价』。 - 立即补价(不等每周一自动化):Agent 在对话收尾展示时,若发现有新登记且非
自定义的模型,立即联网查询官方价并回写
prices.json的 input/output/cache_hit/updated/source,无需等每周一刷新任务。 - 有进有出:价格表会同步 WorkBuddy 已接入/使用过的模型基准(
sessions.model+ 对话 jsonl),废弃模型的无价占位条目自动清理;有官方价的 条目即使暂时未用也保留(价格数据不丢)。 - 每周一刷新兜底:自动化任务仍每周一联网核对官方价,作为兜底与价格更新。 当前价格表覆盖:智谱 glm-5.2/5.2-x/5.2-a/5.1、腾讯 hy3、DeepSeek V4 Pro/Flash、 MiniMax M3、小米 mimo-v2.5。
重要免责:官方价是估算值,可能与你实际被扣的积分/费用不同(受套餐折扣、 批量优惠、区域、峰谷时段、缓存写入费等影响)。它与平台"积分"列不可互相换算。
每次触发都必须检查并补齐价格刷新自动化(重要 · 幂等)
价格表需要联网核对厂商官方价才能保持准确。为免用户手动配置,也为了任务被误删后能自动恢复, 本技能每次被触发统计 token 时(含对话收尾自动展示),Agent 都必须先执行存在性检查, 无论之前是否建过、是否被删过:
- 检查是否存在有效任务:用
automation_update的mode="list"查找名为 「每周一刷新大模型官方价格表」的任务。⚠️ 注意:通过界面删除的任务在数据库中是软删除 (deleted_at不为空),可能仍出现在列表里——必须忽略这些已删除行, 只把「未删除(deleted_at 为空)且 status=ACTIVE」的视为有效任务。 - 若不存在有效任务,立即创建:调用
automation_update的mode="create",参数:name:每周一刷新大模型官方价格表prompt: 见下方「自动化任务 prompt 模板」scheduleType:recurringrrule:FREQ=WEEKLY;BYDAY=MO;BYHOUR=0;BYMINUTE=0status:ACTIVEcwds: 指向本机 token-stats 技能目录(如C:/Users/<用户名>/.workbuddy/skills/token-stats)
- 已存在有效任务则跳过,绝不重复创建。
- 创建完成后,在当次回复里用一句话告知用户:「✅ 已为你自动创建『每周一刷新价格表』 任务(缺失自动补建),之后每周一自动联网核对官方价」。
这是幂等操作:每次触发都会跑检查。任务被误删、换机、重装技能后,下一次触发统计 token 时都会自动重建,无需用户手动操作,也不会重复建(已删除的残留行会被忽略)。 自动化任务存于本机
~/.workbuddy/workbuddy.db,不随 skill 安装包分发。 此外,对话收尾发现新模型时的"立即补价"机制仍作为即时补充继续生效(发现新模型当次就补)。
自动化任务 prompt 模板(创建时原样填入 prompt 字段)
更新 token-stats 技能的官方价格表。
步骤:
1. 定位 token-stats 技能目录:标准路径 ~/.workbuddy/skills/token-stats/(Windows 实际为
C:/Users/<用户名>/.workbuddy/skills/token-stats/),读取其中的 prices.json。
2. 用 WebSearch / WebFetch 联网核对以下模型厂商的官方最新 API 价格(单位:人民币 / 百万
tokens,字段 input=输入、output=输出、cache_hit=缓存命中读取),保持 JSON 结构不变:
- 智谱 GLM-5.2 / GLM-5.1 —— https://open.bigmodel.cn/pricing
- 腾讯混元 hy3 —— https://www.cloud.tencent.com/document/buy-guide/1729/97731
(确认 hy3 对应型号;若官方已有 HY 3.0 价格则采用之并在 note 说明)
- DeepSeek V4 Pro / Flash —— https://api-docs.deepseek.com/zh-cn/quick_start/pricing
(2026-08-17 起峰谷计价:记录空闲时段价,peak 字段写高峰价,note 说明高峰翻倍)
- MiniMax M3 —— https://platform.minimaxi.com/docs/guides/pricing-paygo
(永久五折;≤512K 与 >512K 两档)
3. 把查到的价格写回各模型条目的 input/output/cache_hit 字段(float,如 8.0),
updated 改为今天日期,source 改为实际访问链接。
4. 若某模型官方价分段(上下文长度 / 峰谷 / 优先级),在 note 说明取值口径。
5. 完成后一句话回报:更新了哪些模型的哪些价格,或哪些未变动。
约束:只更新价格数字与 updated/source/note 字段,不改 JSON 结构、不删模型条目、不改
字段名。务必先 Read 再 Edit。仅当联网可访问时才更新,失败则跳过并说明。
图标控件(可点击展开)+ 对话结束自动显示
本技能把 token 用量做成两个可点击的图标控件(CodeBuddy 风格角标,原生
<details> 点击展开,零依赖、可交互),对应你的两个诉求:
- 每轮双图标控件(每轮对话结束后的标准形态)
- 触发:每一轮对话结束后(含收尾),Agent 主动贴出总共两个图标:
- ① 该轮的 token 使用情况图标:
💱 第N轮对话 · X tok,点击展开该轮详情 (轮次/模型/时间 HH:MM:SS/输入/输出/缓存含命中率/推理/官方价小计); - ② 历史对话汇总图标:
📊 历史总量 · 累计 tok · 缓存 xx%,点击展开 (输入/输出/缓存命中/总计/积分/官方价估算)——这是本任务从开始到当前的 全部累计,只放一个,不会每轮重复塞历史。
- ① 该轮的 token 使用情况图标:
- 对应语义:"每轮对话结束后,单独统计该轮 token 使用情况,再加一个历史对话 汇总总量,总共就两个图标"。
- 轮次分组(rounds):脚本按"一次用户消息引发的所有调用"归为一轮;
调用次数 = 带 token 数据的记录行数(
message/function_call各计一次, 与模型官方口径一致);无 token 的流式分片不算调用、单独标注数量。 单轮详情底部展示『本轮模型调用(按次数降序)』细分各模型调用次数。
- 触发:每一轮对话结束后(含收尾),Agent 主动贴出总共两个图标:
- 命令:
python token_report.py --widget-pair <N> --bare(--widget-turn <N>单出本轮图标;--widget-total-session单出历史汇总图标)
- 历史总用量图标控件(全部任务累计,可选)
- 作用:展示所有已完成对话任务的累计总用量(会话数、累计 tokens、
累计积分、官方价估算),点击展开明细。默认统计全部任务、不区分工作区;
--scope workspace/--workspace <子目录>可按需限定(高级用法)。 - 命令:
python token_report.py --widget-total --bare - 展示时机(可选):仅在你问"所有对话总共花了多少"时展示;默认对话收尾只贴 单对话框件,不自动贴全局历史控件。
- 作用:展示所有已完成对话任务的累计总用量(会话数、累计 tokens、
累计积分、官方价估算),点击展开明细。默认统计全部任务、不区分工作区;
渲染方式(由 Agent 选用,必须用脚本真实输出,禁止手写 HTML):
- 内联展示必须走"文件中转":当对话轮次很多时,生成的 widget HTML 可能
非常长,直接 stdout 单行或 agent 读长文件单行都可能被截断,导致 fallback 手写
widget、样式/内容不一致。脚本已自动规避:
- 跑
python token_report.py --widget-pair <N> --bare。 - stdout 会输出短标记:
[WIDGET_FILE]<path>[/WIDGET_FILE]; 同时 stderr[json]里有widget_html_file字段指向同一文件。 - Agent 必须用 Read 工具读取该文件完整内容(脚本已把 HTML 格式化成多行,
避免单行超过 2000 字符被截断),然后作为
show_widget的widget_code原样传入,一个字都不要改、不要手写。 - 若因任何原因读不到该文件,宁可不展示图标,也禁止自己手写 HTML。
- 跑
- 这样对话里看到的内联图标与 HTML 文件渲染完全一致(蓝色数字/灰色标签/chip 高亮)。
- 不要自动
present_files打开预览面板(用户明确反馈:每次收尾自动弹预览 面板很烦)。收尾只内联展示,不生成/不打开 HTML 文件;仅当用户明确说 "打开看看 / 保存成文件"时才present_files或写文件。
注意事项
- 数据来自本地存盘,不联网、不上传,纯本地统计。
- 进行中的对话可能尚未写入最新用量,报告以已完成调用为准。
- 调用次数 = 真实 API 调用数:统计所有带 token 数据的记录行
(
message/function_call工具调用各计一次),与模型官方平台口径一致; 无 token 的流式中间分片不算调用,单独标注"X 条流式分片"。 - token 汇总只累加带数据的调用;官方平台的数字可与本地核对一致。
- 历史汇总 token 来自各会话 jsonl 真实用量累加,积分取自
session_usage表。 --widget-total默认统计全部任务(不区分工作区);如需限定范围可用--scope workspace/--workspace <projects 子目录>(高级用法)。- 概念对应:WorkBuddy 里「一个对话界面 = 一个任务 = 一个
<sessionId>.jsonl」; 单对话框件(历史总量 + 逐轮明细)覆盖单个任务内的全部分析,日常无需关心工作区。
微信扫一扫