# 智谱 token 用量采集方案 本文档记录当前 ESP32-S3-RLCD 小屏项目中,智谱 GLM Coding Plan 的 token 用量采集方式、数据字段、刷新策略和安全边界。 ## 结论 当前方案使用 Windows 本机的一个采集进程统一采集数据: - 电脑性能数据 - Codex 用量数据 - 智谱额度与 token 用量数据 智谱密钥只保留在 Windows 本机环境变量 `ZHIPU_API_KEY` 中,不写入 Git、不写入固件、不通过 BLE 发送给开发板。ESP32 只接收已经简化后的数字。 ## 数据来源 智谱数据分两类接口采集。 ### quota/limit(额度百分比接口) 用途:读取 5H / 周额度窗口的百分比和重置时间。 请求: ```http GET https://open.bigmodel.cn/api/monitor/usage/quota/limit Authorization: Content-Type: application/json Accept-Language: en-US,en ``` 注意: - `Authorization` 直接放 API Key,不加 `Bearer` 前缀。 - `type == "TOKENS_LIMIT"` 才是 token 限额。 - `unit == 3` 表示 5H token 窗口。 - `unit == 6` 表示周 token 窗口;部分套餐不会返回。 - `TIME_LIMIT` 不是 token 用量,当前屏幕不使用它。 当前项目显示: - `zhipu_5h_percent` - `zhipu_5h_reset_mins` - `zhipu_week_percent` - `zhipu_week_reset_mins` ### model-usage(模型用量接口) 用途:读取真实 token 消耗,用于显示今日 token 和最近 14 天每日柱状图。 请求: ```http GET https://open.bigmodel.cn/api/monitor/usage/model-usage?startTime=&endTime= Authorization: Content-Type: application/json Accept-Language: en-US,en ``` 当前项目查询窗口: - 起始时间:最近 14 天第一天的 `00:00:00` - 结束时间:当前本机时间 实测返回的关键字段: ```json { "success": true, "data": { "x_time": ["2026-06-23 00:00"], "tokensUsage": [0], "totalUsage": { "totalModelCallCount": 700, "totalTokensUsage": 129053626, "modelSummaryList": [ { "modelName": "GLM-5.2", "totalTokens": 123456, "sortOrder": 1 } ] }, "modelDataList": [ { "modelName": "GLM-5.2", "tokensUsage": [0], "totalTokens": 123456 } ], "modelSummaryList": [ { "modelName": "GLM-5.2", "totalTokens": 123456, "sortOrder": 1 } ], "granularity": "hourly" } } ``` 当前项目只使用: - `x_time` - `tokensUsage` 处理方式: 1. 按 `x_time` 的日期部分聚合 `tokensUsage`。 2. 得到最近 14 天每天 token 总量。 3. 今日 token 转为屏幕紧凑单位。 4. 以最近 14 天最大值为 100,生成每日柱状图百分比。 ## 显示单位 电脑端会把 token 转成 `m10` 整数发送: ```text m10 = round(tokens / 100000) ``` 固件端再显示为: - `< 1000`:显示为 `x.xM` - `>= 1000`:显示为 `xxxM` - `>= 10000`:显示为 `x.xB` 示例: - `1455` -> `146M` - `10000` -> `1.0B` ## 刷新策略 当前实现: - `quota/limit` 默认 60 秒刷新一次。 - `model-usage` 默认 600 秒刷新一次。 - BLE 仍然每秒推送一次完整 `SYS8` 数据,但智谱 token 部分使用缓存值。 建议后续: - `quota/limit` 可以调整为 2-5 分钟。 - `model-usage` 可以保持 10-15 分钟。 - 不建议秒级请求智谱接口。 ## 协议字段 当前 BLE 协议为 `SYS8`。 智谱相关字段位置: ```text ..., zhipu_status, zhipu_5h, zhipu_week, zhipu_5h_reset, zhipu_week_reset, zhipu_today_tokens_m10, zhipu_daily_bars, cpu_core_text, disk_text ``` 其中: - `zhipu_status`:`0=WAIT`,`1=OK`,`2=ERR` - `zhipu_5h`:5H token 使用百分比 - `zhipu_week`:周 token 使用百分比,没有则为 `-1` - `zhipu_5h_reset`:5H 重置剩余分钟数 - `zhipu_week_reset`:周重置剩余分钟数,没有则为 `-1` - `zhipu_today_tokens_m10`:今日 token,单位为 `100000 token` - `zhipu_daily_bars`:最近 14 天每日柱状图百分比,使用冒号分隔,例如 `0:0:24:78:100` 固件仍保留 `SYS7` 解析,方便旧采集端短时间兼容。 ## 代码位置 电脑端采集: - `tools/pc-metrics/push-metrics-ble.py` - `ZhipuStatusReader` - `_query_quota()` - `_query_usage()` - `_usage_to_daily_snapshot()` 固件端协议解析: - `main/metrics_protocol.c` - `parse_sys8_line()` - `parse_zhipu_daily_bars()` 固件端 UI: - `main/ui_screen.h` - `main/ui_screen.c` - `update_zhipu_panel()` ## 安全边界 必须遵守: - 不把 `ZHIPU_API_KEY` 写入代码。 - 不把 `ZHIPU_API_KEY` 写入文档。 - 不把 `ZHIPU_API_KEY` 写入固件。 - 不把 `ZHIPU_API_KEY` 发送给 ESP32。 - 不把原始接口返回完整转发给 ESP32。 - ESP32 只接收数字化后的结果。 当前推荐启动方式: ```powershell $env:ZHIPU_API_KEY="" & "D:\AI Code\ESP-32\tools\pc-metrics\start-ble-metrics.ps1" -IntervalSeconds 1 Remove-Item Env:\ZHIPU_API_KEY -ErrorAction SilentlyContinue ``` 注意:这种方式只让启动后的采集进程持有密钥,不会把密钥持久写入系统环境变量。电脑重启后需要重新启动采集进程。 ## 性能开销 本机实测结果: | 接口 | 中位耗时 | 返回大小 | | --- | ---: | ---: | | `quota/limit` | 约 257 ms | 约 443 B | | `model-usage`,近 7 天 | 约 348 ms | 约 7.1 KB | | `tool-usage`,近 7 天 | 约 272 ms | 约 5.9 KB | 当前项目暂不使用 `tool-usage`。 按 10 分钟查询一次 `model-usage` 计算,一天只有约 144 次请求,数据量很小,对电脑和网络影响可以忽略。 ## 官方性说明 `model-usage` 属于智谱官方用量查询插件实际使用的接口,风险低于社区逆向 Cookie 方案。 但它不是普通开放 API 文档中明确列出的长期稳定业务 API,所以当前项目采用低频、本机、自用、只读查询方式,不做公开服务和高频轮询。