需解析API响应中usage字段获取Token明细:非流式响应直接读取顶层usage;流式响应须捕获末尾data块中的累计usage;注意OpenAI兼容接口的字段路径差异,并通过本地tokenizer校验数值准确性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

如果您调用DeepSeek API进行对话请求,但未在响应中提取每次交互的Token消耗明细,则可能是由于未正确解析返回体中的usage字段。以下是获取Token详单的具体操作步骤:
一、确认API响应中包含usage字段
DeepSeek API在成功返回对话结果时,会在JSON响应体顶层结构中嵌入usage对象,该对象记录本次请求实际使用的prompt_tokens、completion_tokens和total_tokens。只有启用流式响应(stream=false)的同步调用才会完整返回该字段;流式响应需自行累计各chunk中的delta usage。
1、检查HTTP响应状态码是否为200,确保请求成功执行。
2、解析响应体为JSON对象,定位到顶层键名为usage的对象节点。
3、验证usage对象内是否同时存在prompt_tokens、completion_tokens和total_tokens三个整型字段。
二、解析非流式响应中的usage字段
对于stream=false的标准POST请求,usage字段直接位于响应根对象中,可一次性读取全部Token计数。该方式适用于调试与单次请求分析,数据准确且无需累加。
1、使用JSON解析库(如Python的json.loads)将响应文本转为字典或对象。
2、访问response["usage"]["prompt_tokens"]获取输入提示词Token数。
3、访问response["usage"]["completion_tokens"]获取模型生成内容Token数。
4、访问response["usage"]["total_tokens"]获取二者之和,用于交叉校验。
三、聚合流式响应(stream=true)中的usage数据
当启用流式传输时,每个data:前缀的事件行仅携带增量内容,usage字段仅出现在最后一个data:块中,且为累计值。必须等待流结束并捕获末尾的usage字段,不可对中间chunk做usage提取。
1、逐行读取响应流,过滤以data:开头的行,跳过event:、id:、retry:等控制行。
2、对每一行执行strip()和去除data:前缀操作,再进行JSON解析。
3、检测当前解析出的JSON对象是否包含usage字段且不为空——该对象即为最终块。
4、从此最终块中提取prompt_tokens、completion_tokens和total_tokens字段值。
四、处理OpenAI兼容接口的字段映射差异
部分DeepSeek SDK或代理服务采用OpenAI兼容格式,此时usage字段结构一致,但需注意:若后端做了字段重命名或嵌套调整(如置于choices[0].message.usage),则原始路径失效,必须依据实际返回结构调整访问路径。
1、打印完整响应体,搜索字符串"usage",定位其实际所在层级。
2、若usage位于choices数组内(例如response["choices"][0]["usage"]),则按此路径访问。
3、若响应中usage缺失但存在usage_info、token_usage等近似键名,需查阅对应SDK文档确认映射规则。
4、对字段名执行大小写敏感匹配,避免误判usage为Usage或USAGE。
五、验证Token计数准确性
usage字段数值由服务端严格统计得出,但客户端可通过基础规则进行合理性校验:prompt_tokens应大于等于输入消息经tokenizer编码后的实际子词数;completion_tokens不应为负值且通常小于2048;total_tokens必须等于前两者之和。
1、使用DeepSeek官方提供的tokenizer工具(如deepseek-tokenizer)对原始messages输入进行本地编码。
2、调用tokenizer.encode()方法,传入system+user+assistant拼接后的字符串,获取length属性。
3、比对本地length与响应中prompt_tokens是否偏差超过5个Token。
4、检查响应中completion_tokens是否为正整数,且total_tokens等于两者的算术和。











