Grok 与 OpenAI 的思考 Token 口径差异
总结
xAI Grok Chat Completions 的 completion_tokens 不包含思考
Token,输出用量应按 completion_tokens + reasoning_tokens 计算;OpenAI Chat
Completions 的 completion_tokens 已包含思考
Token,不应重复相加。对账前应先确认厂商和 endpoint,再用 total_tokens
校验包含关系;不要把 Grok Chat 的规则直接套到 xAI Responses。
xAI Grok 的 Chat Completions 响应沿用了 OpenAI 风格的 usage 字段名,但相同字段名不代表相同的计算口径。最关键的差异是:xAI Grok 的 completion_tokens 只统计最终返回的答案文本;模型在得出答案过程中用于分析和规划的思考 Token 单独记录为 reasoning_tokens。OpenAI 的 completion_tokens 则已经包含思考 Token。12
警告
如果把 OpenAI 的“思考 Token 已包含在 completion_tokens 中”直接套用到
Grok,可能漏计 Grok 的思考 Token;反过来,如果对 OpenAI 再加一次
reasoning_tokens,则会重复计算。
本文说明厂商官方协议的原始口径。经过兼容网关或第三方聚合服务后,usage 可能被归一化;业务代码应同时检查模型、协议和实际返回数字,不能只根据字段名判断。
结论速查
| 厂商与接口 | completion_tokens / output_tokens | reasoning_tokens 的关系 | total_tokens 计算关系 |
|---|---|---|---|
| OpenAI Chat Completions | 输出总量 | 已包含在 completion_tokens 中 | prompt + completion |
| xAI Grok Chat Completions | 最终可见文本 | 独立于 completion_tokens | prompt + completion + reasoning |
| OpenAI Responses | 输出总量 | 已包含在 output_tokens 中 | input + output |
| xAI Responses | 不能只按 OpenAI 口径假定 | 当前官方资料存在不一致,需检查实际数字关系 | 按实际响应验证是否需要额外加 reasoning |
这里的“包含”是集合关系,不是说模型的思考过程会直接返回给调用方。思考 Token 可以不可见,但仍会占用上下文并参与计费。
xAI Grok Chat Completions
xAI 对相关字段的定义是:
completion_tokens:仅表示模型最终返回的文本;completion_tokens_details.reasoning_tokens:模型在得出答案过程中用于分析和规划的思考 Token,不包含最终返回的答案文本;prompt_tokens_details.cached_tokens:prompt_tokens中命中缓存的子集,不应再次加到输入总量;total_tokens:在 Grok 官方示例中包含输入、最终文本和思考 Token。
xAI Chat Completions 官方示例返回:3
{
"usage": {
"prompt_tokens": 32,
"completion_tokens": 9,
"completion_tokens_details": {
"reasoning_tokens": 94
},
"total_tokens": 135
}
}这组数字的关系是:
32 + 9 + 94 = 135另一个 xAI Deferred Chat Completions 官方示例为:4
prompt_tokens = 26
completion_tokens = 168
reasoning_tokens = 304
total_tokens = 498
26 + 168 + 304 = 498两个示例中的 reasoning_tokens 都大于 completion_tokens,因此 reasoning_tokens <= completion_tokens 也不能作为跨厂商不变量,更不能为了满足 OpenAI 的子集关系而截断 Grok 的原始数字。
因此,在保留 xAI 原始口径的响应中:
Grok 计费输出用量 = completion_tokens + reasoning_tokens
Grok 总用量 = prompt_tokens + completion_tokens + reasoning_tokensxAI 将 Completion Tokens 和 Reasoning Tokens 都按完整的 completion/output Token 单价计费。total_tokens 只用于汇总和校验,不是第三个独立计费项。5
信息
xAI Chat REST Reference 的通用字段说明仍把 total_tokens 描述为 prompt 与
completion 之和,但同页非零 reasoning 示例和 Deferred Chat 示例都额外加入了
reasoning。本文依据明确的字段定义和两组可验算示例说明当前观察;接入方仍应保留原始
usage,不要静默重建或截断字段。
OpenAI Chat Completions
OpenAI 把 completion_tokens_details 定义为 completion_tokens 的明细。reasoning_tokens 虽然通常不可见,但已经计入 completion_tokens,因此:2
OpenAI 计费输出用量 = completion_tokens
OpenAI 总用量 = prompt_tokens + completion_tokensOpenAI 的 Reasoning 指南还给出了 Responses API 示例:6
input_tokens = 75
output_tokens = 1,186
reasoning_tokens = 1,024
total_tokens = 1,261正确关系是 75 + 1,186 = 1,261。其中 1,024 个思考 Token 已包含在 1,186 个 output_tokens 中,不能再计算成 75 + 1,186 + 1,024。Chat Completions 使用不同的字段名,但同样把 reasoning 作为 completion 的明细。
如何识别实际口径
对于普通纯文本响应,当 reasoning_tokens > 0 时,可以用顶层总量检查响应采用了哪种关系:
base = prompt_tokens + completion_tokens
total_tokens == base
→ reasoning 已包含在 completion 中,符合 OpenAI 聚合口径
total_tokens == base + reasoning_tokens
→ reasoning 独立于 completion,符合 xAI Grok 原始口径
其他结果
→ usage 不自洽,或经过了尚未识别的协议转换如果 reasoning_tokens 为 0,两种等式会同时成立,无法只靠数字识别。此时需要结合模型 ID、上游厂商、接口协议和渠道是否做过 usage 归一化判断。
这个等式适合用于一致性诊断,不应替代厂商协议定义。音频、Prediction、工具调用或其他扩展 Token 类别可能引入额外关系,应按对应 endpoint 的官方字段说明处理。
信息
建议同时保存请求 ID、模型 ID、接口路径和完整原始
usage。对账时先判断口径,再映射到实际计费项;不要在所有模型上无条件执行
completion_tokens + reasoning_tokens。
输出上限也存在差异
字段名相似不只影响 usage:
| 参数 | 官方含义 |
|---|---|
OpenAI max_completion_tokens | 同时覆盖可见输出和思考 Token 的总预算2 |
xAI max_completion_tokens | 只限制可见输出,不限制思考 Token 或函数调用使用的 Token |
xAI max_output_tokens | 在 Responses API 中用于限制输出和思考 Token 的合计生成预算 |
因此,不能根据 Grok Chat Completions 的 max_completion_tokens 估算这次请求最多会产生多少思考 Token,也不能假设同名参数在两个厂商中具有完全相同的限制范围。3
xAI Responses API 的一致性提醒
截至 2026 年 8 月 16 日,xAI Responses API 的官方资料存在不一致:
POST /v1/responses示例中,input_tokens = 131、output_tokens = 624、reasoning_tokens = 246、total_tokens = 755,满足131 + 624 = 755,表现为 reasoning 已包含在 output 中;3GET /v1/responses/{response_id}示例仍使用prompt_tokens、completion_tokens字段,其中prompt_tokens = 32、completion_tokens = 9、reasoning_tokens = 110、total_tokens = 151,满足32 + 9 + 110 = 151,表现为 reasoning 独立计数;3- Context Compaction 示例中,
input_tokens = 12,000、output_tokens = 800、reasoning_tokens = 240、total_tokens = 12,800,满足12,000 + 800 = 12,800,同样表现为 reasoning 已包含在 output 中;7 usage.context_details.output_tokens的字段说明也把 output 描述为 completion 与 reasoning 的合计。3
因此,当前资料不能支持“所有 xAI Responses endpoint 采用同一种 reasoning 包含关系”的结论。不应把 Chat Completions 的结论机械推广到 Responses,也不应因为接口兼容 OpenAI 就直接采用 OpenAI 的 usage 加法。接入 xAI Responses 时,应按 provider 与 endpoint 保存并解析原始响应,通过 total_tokens 验证关系,并以请求日志和账单明细确认最终计费口径。
对账检查清单
- 确认请求实际使用的是 Chat Completions 还是 Responses。
- 记录模型 ID、上游厂商和是否经过兼容协议转换。
- 从 details 中读取
reasoning_tokens,不要把字段缺失直接解释为零。 - 用
total_tokens检查 reasoning 是独立计数还是输出子集。 - 根据识别出的口径计算输出用量,避免漏计或重复计算。
- 最后使用 Modelink 请求日志中的
bo_usage、bo_usage_cost和请求发生时的模型价格复核金额。
参考资料
Footnotes
-
xAI,Tool Usage Details:说明
completion_tokens只表示最终文本,reasoning_tokens表示模型的思考过程。 ↩ -
OpenAI,Chat Completions API reference:定义
completion_tokens、reasoning_tokens与max_completion_tokens的关系。 ↩ ↩2 ↩3 -
xAI,Chat and Responses REST API:包含 Chat Completions、Responses、Token 上限参数和 usage 示例。 ↩ ↩2 ↩3 ↩4 ↩5
-
xAI,Deferred Chat Completions:包含
26 + 168 + 304 = 498的 usage 示例。 ↩ -
xAI,Pricing:Completion Tokens 和 Reasoning Tokens 均按输出 Token 价格计费。 ↩
-
OpenAI,Reasoning models:包含 Responses API 的思考 Token usage 示例。 ↩
-
xAI,Context Compaction:包含
12,000 + 800 = 12,800的 compaction usage 示例。 ↩