用途
meter-view 是 snowflake-labs/cocoplus 提供的 CocoMeter 仪表盘生成技能,目标是根据本地归属数据和 Snowflake 用量历史,生成并打开一个静态 HTML 的 token 用量与归因面板。
工作流程
- 先检查 .cocoplus/lifecycle/console-state.json。若其中 running 为 true 且带端口,则输出 “Opening Cost panel in CocoConsole.” 并在浏览器打开 http://localhost:<port>/cost,随后停止,不再生成独立快照。
- 若 CocoConsole 未运行,检查 .cocoplus/ 是否存在;不存在时提示运行 $pod init 初始化后停止。
- 读取 .cocoplus/meter/request-map.jsonl。文件缺失或为空时不中止,改为以 local_only 形式注入空行与警告,使面板仍可渲染。
- 将记录分为 Direct IDs(is_subagent_anchor 缺失或为 false)与 Anchor IDs(is_subagent_anchor 为 true)。
- 存在 Direct IDs 时执行 Pass 1:从 SNOWFLAKE.ACCOUNT_USAGE.CORTEX_CODE_CLI_USAGE_HISTORY 查询 REQUEST_ID 或 PARENT_REQUEST_ID 命中这些 ID 的记录;存在 Anchor IDs 时执行 Pass 2:查询 PARENT_REQUEST_ID 命中锚点且不在 Pass 1 结果中的记录。两轮结果合并;任一查询失败仅记录错误并继续,不中止。
- 关联聚合:Direct 行按 REQUEST_ID 匹配;Pass-2 行通过 PARENT_REQUEST_ID 匹配锚点记录解析 stage_id;未匹配行归为 “unattributed”。计算总 token、总积分、缓存效率(cache_read_input / (input + cache_read_input + cache_write_input) * 100)、总输出 token,以及按阶段和按模型的拆分,序列化为 JSON。
- 在已安装的 CocoPlus 插件根目录下定位 templates/meter-view.html.template,不硬编码操作系统相关目录;模板缺失则提示重新安装或更新插件并停止。
- 在模板的 /* METER_INJECTION_START / 与 / METER_INJECTION_END */ 之间注入 const INJECTED_METER_DATA = <serialised_json>;。
- 以临时文件加重命名的方式原子写入 .cocoplus/meter-view.html,并写入 .cocoplus/meter/last-sync.json(含 ISO 时间戳与行数)。
- 按平台打开文件:macOS 用 open,Linux 用 xdg-open,Windows 用 powershell -Command "Invoke-Item '.cocoplus/meter-view.html'"。
输出信息
成功时报告阶段数、请求数、Snowflake 行数、总 token 与缓存效率,并提示正在打开文件。Snowflake 无数据时提示 CORTEX_CODE_CLI_USAGE_HISTORY 存在最长约 90 分钟延迟,仪表盘以仅本地数据生成,可在约 90 分钟后运行 $meter sync 刷新。浏览器打开失败时提示手动打开文件路径。
设计约束
设计上明确反对因 Snowflake 查询失败或 request-map.jsonl 缺失而中止:部分数据仍有价值,新项目也需要可用的空面板外壳。写入必须原子完成,避免中途崩溃留下损坏文件;必须更新 last-sync.json 以供 $meter sync 展示最近刷新时间。退出条件包括:HTML 已写入且含合并数据、last-sync.json 已更新、输出包含阶段数/请求数/token/缓存效率、不创建 git 提交(仪表盘为临时产物并已被 gitignore)。
限制
依赖 .cocoplus 项目结构与已安装的 CocoPlus 插件模板;Snowflake 用量数据存在延迟;需具备对应账户用量视图的查询权限,否则只能以部分或仅本地数据渲染。