- utils/token_usage.py:usage 归一化补全缓存命中字段提取,覆盖 prompt_tokens_details/input_tokens_details.cached_tokens(OpenAI 系)、 顶层 prompt_cache_hit_tokens(DeepSeek)、顶层 cached_tokens(Kimi/Step)、 cache_read_input_tokens(Anthropic 系)、cachedContentTokenCount(Gemini); Anthropic 语义下把缓存读/写加回总输入以统一口径,normalize 保持幂等 - 对话级统计新增 total_cached_input_tokens 与 cache_exempt_input_tokens (首轮/深度压缩后首轮未命中缓存的输入视为冷启动成本,豁免出命中率分母; 压缩通过 cache_cold_start_pending 标记在下一次真实调用时判定) - token_update 广播与 token-statistics 接口同步携带新字段 - TokenDrawer 面板新增「累积缓存输入」「缓存命中率」(前端按 缓存/(总输入-豁免) 换算) - 深色模式下「当前上下文」数字由灰色 --accent 改为 --text-primary(白) - 附 cache_research/ 各厂商缓存字段调研文档(代码注释引用) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
国内官方 LLM API 缓存字段速查(官方示例 JSON 摘录)
配套报告:同目录
README.md。以下 JSON 均为各厂商官方文档原文示例摘录,直接复制进实验脚本对照。
1. DeepSeek —— usage 顶层命中/未命中
"usage": {
"prompt_tokens": 16,
"completion_tokens": 10,
"total_tokens": 26,
"prompt_cache_hit_tokens": 0,
"prompt_cache_miss_tokens": 16,
"completion_tokens_details": { "reasoning_tokens": 0 }
}
2. Moonshot Kimi —— usage 顶层 cached_tokens(官方示例原文)
非流式响应:
"usage": { "prompt_tokens": 19, "completion_tokens": 21, "total_tokens": 40, "cached_tokens": 10 }
流式响应(最后一个 chunk,finish_reason=stop 时携带):
"usage": {"prompt_tokens":19,"completion_tokens":13,"total_tokens":32,"cached_tokens":12}
请求参数 prompt_cache_key(官方原文):“用于缓存相似请求的响应以优化缓存命中率。对于 Coding Agent,通常是代表单个会话的 session id 或 task id;退出并恢复会话时应保持不变。对于 Kimi Code Plan,此字段为必填以提高缓存命中率。”
(官方《上下文缓存指南》PDF 示例亦出现 usage.prompt_tokens_details.cached_tokens,两处并存,实验需双读。)
3. 通义千问 Qwen(阿里云百炼,OpenAI 兼容)
隐式命中:
"usage": { "prompt_tokens": 3019, "completion_tokens": 104, "total_tokens": 3123,
"prompt_tokens_details": { "cached_tokens": 2048 } }
显式(cache_control ephemeral):
"usage": { "prompt_tokens": 2174, "completion_tokens": 0,
"prompt_tokens_details": { "cache_creation_input_tokens": 2156, "cached_tokens": 0 } }
// 第二次请求命中:cache_creation_input_tokens=0, cached_tokens=2156
原生 DashScope:usage.prompt_tokens_details['cached_tokens'](部分海外地域视觉模型为顶层 usage.cached_tokens,官方注明后续升级)。
4. 智谱 GLM
官方文档只给出字段名,未公布具体示例数字,以下为字段结构示意(值用占位符):
"usage": { "prompt_tokens": <int>, "completion_tokens": <int>, "total_tokens": <int>,
"prompt_tokens_details": { "cached_tokens": <int> } }
5. 字节豆包(火山方舟 Context Chat API)
"usage": { "prompt_tokens": 28, "completion_tokens": 4, "total_tokens": 32,
"prompt_tokens_details": { "cached_tokens": 18 } }
(需创建 ctx-* 缓存并传 context_id;或 Responses API 传 "caching":{"type":"enabled"} / previous_response_id。)
6. MiniMax
OpenAI 兼容格式:
"usage": { "prompt_tokens": 1200, "completion_tokens": 300, "total_tokens": 1500,
"prompt_tokens_details": { "cached_tokens": 800 } }
Anthropic/Messages 格式(自动或显式均可出现):
"usage": { "input_tokens": 108, "output_tokens": 91,
"cache_creation_input_tokens": 0, "cache_read_input_tokens": 14813 }
7. 阶跃星辰 Step —— usage 顶层 cached_tokens
"usage": { "cached_tokens": 512, "prompt_tokens": 591, "completion_tokens": 120, "total_tokens": 711 }
8. 百度文心(千帆 ModelBuilder)
"usage": { "prompt_tokens": 159, "completion_tokens": 89, "total_tokens": 248,
"prompt_tokens_details": { "cached_tokens": 128 } }
统一读取优先级(实验脚本建议)
usage = resp.get("usage") or {}
pdet = usage.get("prompt_tokens_details") or {}
cached = (
usage.get("prompt_cache_hit_tokens") # DeepSeek
or usage.get("cached_tokens") # Kimi / Step / 部分 DashScope
or pdet.get("cached_tokens") # Qwen/GLM/豆包/MiniMax/千帆
or pdet.get("cache_read_input_tokens") # Anthropic 兼容
or 0
)