返回 Skill 列表
extension
分类: 数据与分析无需 API Key

Token 统计(Token-Stats)

统计 WorkBuddy 每次对话结束后的 Token 消耗,按输入、输出、缓存命中率、推理、平台积分、官方价估算等维度展示真实用量。

person作者: user_7ea7f886hubcommunity

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.2hy3deepseek-v4-flashminimax-m3)建索引,每条含:厂商、官方型号、输入价、输出价、缓存命中价 (人民币 / 百万 tokens)、来源链接、更新日期、备注。
    • 周期性自动刷新(每次触发检查,缺失自动补建):用户每次触发本技能统计 token 时, Agent 会先检查、若不存在有效任务则自动创建一条「每周一刷新价格表」自动化任务 (见下方「每次触发都必须检查并补齐价格刷新自动化」一节),每周一联网核对各厂商官方定价页并把 最新价写回 prices.jsoninput/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 点打八折)

计算口径成本 = (输入−缓存命中)×输入价 + 缓存命中×缓存命中价 + 输出×输出价 (单位:人民币 / 百万 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 都必须先执行存在性检查, 无论之前是否建过、是否被删过

  1. 检查是否存在有效任务:用 automation_updatemode="list" 查找名为 「每周一刷新大模型官方价格表」的任务。⚠️ 注意:通过界面删除的任务在数据库中是软删除deleted_at 不为空),可能仍出现在列表里——必须忽略这些已删除行, 只把「未删除(deleted_at 为空)且 status=ACTIVE」的视为有效任务。
  2. 若不存在有效任务,立即创建:调用 automation_updatemode="create",参数:
    • name: 每周一刷新大模型官方价格表
    • prompt: 见下方「自动化任务 prompt 模板」
    • scheduleType: recurring
    • rrule: FREQ=WEEKLY;BYDAY=MO;BYHOUR=0;BYMINUTE=0
    • status: ACTIVE
    • cwds: 指向本机 token-stats 技能目录(如 C:/Users/<用户名>/.workbuddy/skills/token-stats
  3. 已存在有效任务则跳过,绝不重复创建。
  4. 创建完成后,在当次回复里用一句话告知用户:「✅ 已为你自动创建『每周一刷新价格表』 任务(缺失自动补建),之后每周一自动联网核对官方价」。

这是幂等操作:每次触发都会跑检查。任务被误删、换机、重装技能后,下一次触发统计 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> 点击展开,零依赖、可交互),对应你的两个诉求:

  1. 每轮双图标控件(每轮对话结束后的标准形态)
    • 触发:每一轮对话结束后(含收尾),Agent 主动贴出总共两个图标
      • 该轮的 token 使用情况图标:💱 第N轮对话 · X tok,点击展开该轮详情 (轮次/模型/时间 HH:MM:SS/输入/输出/缓存含命中率/推理/官方价小计);
      • 历史对话汇总图标:📊 历史总量 · 累计 tok · 缓存 xx%,点击展开 (输入/输出/缓存命中/总计/积分/官方价估算)——这是本任务从开始到当前的 全部累计,只放一个,不会每轮重复塞历史
    • 对应语义:"每轮对话结束后,单独统计该轮 token 使用情况,再加一个历史对话 汇总总量,总共就两个图标"。
    • 轮次分组(rounds):脚本按"一次用户消息引发的所有调用"归为一轮; 调用次数 = 带 token 数据的记录行数message/function_call 各计一次, 与模型官方口径一致);无 token 的流式分片不算调用、单独标注数量。 单轮详情底部展示『本轮模型调用(按次数降序)』细分各模型调用次数。
  • 命令:python token_report.py --widget-pair <N> --bare--widget-turn <N> 单出本轮图标;--widget-total-session 单出历史汇总图标)
  1. 历史总用量图标控件(全部任务累计,可选)
    • 作用:展示所有已完成对话任务累计总用量(会话数、累计 tokens、 累计积分、官方价估算),点击展开明细。默认统计全部任务、不区分工作区; --scope workspace / --workspace <子目录> 可按需限定(高级用法)。
    • 命令:python token_report.py --widget-total --bare
    • 展示时机(可选):仅在你问"所有对话总共花了多少"时展示;默认对话收尾只贴 单对话框件,不自动贴全局历史控件。

渲染方式(由 Agent 选用,必须用脚本真实输出,禁止手写 HTML)

  • 内联展示必须走"文件中转":当对话轮次很多时,生成的 widget HTML 可能 非常长,直接 stdout 单行或 agent 读长文件单行都可能被截断,导致 fallback 手写 widget、样式/内容不一致。脚本已自动规避:
    1. python token_report.py --widget-pair <N> --bare
    2. stdout 会输出短标记:[WIDGET_FILE]<path>[/WIDGET_FILE]; 同时 stderr [json] 里有 widget_html_file 字段指向同一文件。
    3. Agent 必须用 Read 工具读取该文件完整内容(脚本已把 HTML 格式化成多行, 避免单行超过 2000 字符被截断),然后作为 show_widgetwidget_code 原样传入,一个字都不要改、不要手写
    4. 若因任何原因读不到该文件,宁可不展示图标,也禁止自己手写 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」; 单对话框件(历史总量 + 逐轮明细)覆盖单个任务内的全部分析,日常无需关心工作区。