DeepSeek API 的 Token 用量在每次响应的 usage 中查看。重点字段是输入 prompt_tokens、输出 completion_tokens 和总量 total_tokens。多轮对话时,如果每次都把完整历史再次发送,输入 Token 通常会随历史增长;要靠逐轮日志确认,不能只凭聊天轮数猜。
读取一次请求的 usage
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
response = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "用三点解释什么是二分查找"}],
)
u = response.usage
print({
"prompt_tokens": u.prompt_tokens,
"completion_tokens": u.completion_tokens,
"total_tokens": u.total_tokens,
})
DeepSeek 官方Chat Completion 文档定义了这些字段,并说明 total_tokens 是输入与输出之和。当前响应还可能提供提示词缓存命中、未命中及推理 Token 等细分字段;程序应使用 SDK 实际存在的字段并允许新增字段,不要把一份旧响应结构写死。

记录多轮对话的增长
每轮把发送前的消息条数、响应 ID 和 usage 存入日志。下面只展示记录函数,避免把完整对话和敏感内容写进日志:
def log_usage(round_no, response, message_count):
u = response.usage
return {
"round": round_no,
"message_count": message_count,
"prompt_tokens": u.prompt_tokens,
"completion_tokens": u.completion_tokens,
"total_tokens": u.total_tokens,
"request_id": response.id,
}
如果第二轮把第一轮的用户消息和 assistant 回答都再次发送,prompt_tokens 比第一轮增加通常是预期结果。真正要查的是:是否误把同一段文档重复追加、是否保存了无关工具输出、是否在重试时把历史复制了两遍。
怎样判断是哪一轮变长
- 按轮次列出
message_count、输入、输出和总 Token。 - 计算相邻两轮
prompt_tokens的差值,并对应本轮新增消息。 - 检查新增消息中是否含整篇文件、Base64、重复系统提示词或过长工具结果。
- 在保持任务不变的前提下,去掉重复内容再发一次小样本,比较输入 Token 是否下降。
| 情况 | 处理方法 |
|---|---|
| 长文每轮重复发送 | 保存稳定引用或做经核对的摘要;需要原文证据时仍保留必要段落 |
| 工具结果过长 | 只回传模型完成下一步所需字段,原始结果另存审计系统 |
| 输出不可控 | 设置合理输出上限并要求固定结构,但不能保证一定用满或恰好达到 |
| 流式响应没有 usage | 按当前接口要求检查流选项,并在最后一个数据块结束前不要提前断开 |
usage 不等于账单
Token 是计量单位,实际费用还取决于模型、输入或输出、缓存命中和当时的官方价格。本文不写固定单价,也不把 total_tokens 直接当金额。账单核对时应保存请求时间、模型名、usage 和控制台账单口径,再用当时有效价格计算。
失败边界与未实测说明
请求失败、超时或连接中断时,客户端未拿到完整响应并不等于服务端一定没有产生用量;应结合请求 ID 和控制台记录核对。日志不得保存 API Key、完整隐私内容或未脱敏文件。本文依据 2026-10-01 官方响应结构整理,未使用你的 Key 发起实测,模型字段和流式细节以后可能变化。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32925.html