核验清单

  • ✓看这一笔的 usage。Responses 用 output_tokens 和 output_tokens_details.reasoning_tokens;Chat Completions 用 completion_tokens 和 completion_tokens_details.reasoning_tokens。总输出已经包含推理,不要把明细再加一遍。
  • ✓若 status 是 incomplete 且 incomplete_details.reason 是 max_output_tokens,先看上限,再怪模型没答。这一笔可以没有可见正文,输入和推理仍计费。
  • ✓reasoning_tokens 为 0 时,不要用答案字数去对总输出。格式 token 不出现在正文和 logprobs 里,也不一定单独列出。
  • ✓看返回里的 reasoning.context,不要只看你以为的默认值。GPT-5.6 族默认 all_turns,更早的模型默认 current_turn。省略参数等于 auto。
  • ✓多轮若要沿用推理,请求得拿得到上一笔的条目:previous_response_id、conversation,或完整回放。只把可见对话贴回去,不等于把推理带上了。

1. 看不见的推理,按输出计

OpenAI 的推理模型说明把推理 token 写成模型用来拆题、试路径的内部生成。它们通过 API 看不到原文,却占着上下文窗口,并按输出 token 计费。短答案因此可以比屏幕上的字贵。Responses 把总量放在 output_tokens,明细在 output_tokens_details.reasoning_tokens。Chat Completions 的总量叫 completion_tokens,明细在 completion_tokens_details.reasoning_tokens。明细是总量里的一部分,不是总量外面再加的一笔。财务若把两列相加,会把同一次推理算两次。

这和 DeepSeek 把思维链放进 reasoning_content 不是同一口返回。那边你能在字段里看到一段文本,并且那段文本按输出计。这边默认不把原始推理还给你。持久化的推理项是不透明的,API 不返回推理原文。想看摘要,得显式打开 summary,auto 会落到该模型当时最细的那一档。摘要写在推理项的 summary 数组里,不开就不会出现。不开摘要,不代表 reasoning_tokens 是 0。打开摘要,看到的也不是原始推理,不能拿摘要的字数去减账单。

这列也不是提示缓存的写入加价。缓存写入贵在「把前缀写进缓存」那一笔,命中才打折。推理 token 是这一次生成出来的输出,不管你有没有把断点放对。显式缓存的小时存储更是另一口表:那里不调用也扣,这里是生成发生了才有推理输出。三列可以出现在同一张月账单上,对账时不能用其中一列去解释另外两列。

2. 上限吃掉的是整段生成,不是可见答案

控制成本的旋钮不是「答案最多几个字」。Responses 用 max_output_tokens,限制的是模型生成的全部 token,包括推理、可见输出,以及不可见的格式 token。token 计数说明写明:这两个上限都覆盖非可见 token,可见输出和账单之间没有固定差额,需要留出余量。Chat Completions 对应的字段是 max_completion_tokens,接口参考写的是可见输出和推理 token 的上限。旧的 max_tokens 已废弃,而且和 o 系列不兼容。把旧参数留在代码里,推理模型上不是「自动帮你封顶」,是这个参数根本不该用。

撞到上下文窗口或你设的 max_output_tokens,返回的 status 是 incomplete,incomplete_details.reason 是 max_output_tokens。文档写明:这可以发生在任何可见输出之前。也就是说,你可能为输入和推理付了钱,答案区是空的。空正文不是免费调用,也不是审核把内容删掉。审核截断要看审核字段。这里要看的是上限和 usage。官方给实验期的建议是,推理和输出至少留 25000 token 的余量,熟悉自己的题目之后再收紧。25000 是缓冲,不是报价,也不是每只模型的硬默认。

所以「把 max 设小来省钱」会省错地方。设得太小,模型把额度花在推理上,可见答案还没开始就停了,这笔的单价仍是输出价。设得很大,推理可以走到成千上万 token,答案仍然只有一两句。要对的是 usage 里的推理明细和总输出,不是把 output_text 丢进本地 tokenizer。

3. reasoning_tokens 为 0,输出仍可能比正文长

计数页单独写了一条容易漏的账。包括 GPT-5 在内的一些模型,会生成用来分隔通道、工具调用和消息结构的格式 token。这些 token 不出现在消息正文里,也不出现在 logprobs 里,而且不一定在 usage 里单独列出。结果是:报告的输出或 completion token 可以高于可见 token,也可以高于 logprobs 里的 token,即便 reasoning_tokens 是 0。

这条把两种误读拆开。第一种是「明细为 0,所以这只模型没在推理,账单应该等于答案字数」。格式 token 可以在推理明细为 0 时仍然把总输出抬高。第二种是「明细很大,所以多出来的全是思维链」。明细只解释推理那一截。总输出减明细,剩下的是可见输出加上没单独列出的格式 token,不是一份可以逐字核对的正文。本地 tokenizer 更对不上,因为它连请求结构里的角色和边界 token 都可能没算进你粘贴的那段纯文本。

reasoning.effort 也不是把推理 token 锁死的阀门。它引导模型想多少。支持的取值随模型变,可以包括 none、minimal、low、medium、high、xhigh、max,不是每只模型都有全部档位。调低倾向更快、更少 token,调高想得更完整。模型还会按题目自适应:简单题少想,难题多想。默认值同样随模型变,不能把某一只的 medium 写成全系规则。GPT-5.6 和 GPT-6 还有独立的 reasoning.mode:standard 是默认,pro 给更难的任务,可以接受更高延迟和更多 token。模式和 effort 互不替代。省略 effort 时,文档写 GPT-5.6 在两种模式下都默认 medium。把 mode 调成 pro、又没看 usage,短答案旁边可以出现很长的推理明细。

4. 下一轮带不带上一轮,默认按模型分

对话状态和推理状态不是一件事。把可见消息传下去,模型拿到的是对话历史。持久化推理另外决定:下一轮能不能把已有的、兼容的推理项渲染进下一次采样。文档把默认值写成两档。GPT-5.6 族支持 all_turns,并且默认就是它。更早的模型默认 current_turn。省略 reasoning.context,或显式写成 auto,用的是该模型的默认。返回里的 reasoning.context 才是实际生效的模式,只会是 current_turn 或 all_turns。这个字段不会凭空造出不存在的推理项。

current_turn 只让当前这一轮的推理可用,不把更早的推理渲染进下一次采样。文档说,回放旧条目时可以用它来减少被渲染的上下文。这是少带,不是把上一笔推理费退掉。all_turns 会把可用且兼容的推理项渲染进去,但只在请求拿得到更早的条目时生效:previous_response_id、挂到 conversation,或手动回放完整历史。第一轮没有更早的推理,两种模式一样。只把用户和助手的可见文本贴回去,推理项不在里面,all_turns 没有东西可渲染,下一轮会重新想。重新想的那一截又是新的输出。

推理只能在同一模型族里复用。文档举例:GPT-5.6 族内部可以互用,GPT-5.6 和 GPT-5.5 之间不带。换族时,即使 reasoning.context 是 all_turns,不兼容的推理也会从上下文里拿掉。换模型省下的不是「推理免费了」,是上一段推理没被带上,这一轮可能重新生成。 store 为 false,或组织启用了零数据保留,推理项默认带 encrypted_content。要在无存储模式下使用 all_turns,得自己保留每一个输出项,包括加密推理和助手阶段,再把下一条用户消息接上去整段回放。丢掉加密字段,下一轮就只剩可见对话。

5. 给账户充值,缩不了已经生成的推理

对账先分四列。第一列是 usage:推理明细和总输出,接口是 Responses 还是 Chat,有没有把明细又加进总量。第二列是 status 和 incomplete_details.reason,空正文要先对上限,而不是对审核。第三列是返回里的 reasoning.context,以及这次请求有没有 previous_response_id 或完整回放。第四列是 effort 和 mode:它们引导生成量,不是硬顶,pro 可以在短答案旁边拉长推理。型号名会变,以这一笔返回的 model 和推理模型页为准,不要用宣传名代替 usage。

给 OpenAI 账户充值是第五本账。链上把稳定币换成能充进账户的资产,发生在入账之前,不减少已经生成的推理 token,也不提高这一次请求的 max_output_tokens。需要这一步时,可以用无需注册、非托管的 AllSwap 完成链上兑换。兑换成功只说明资产换了手。短答案旁边的推理输出,该出现在 usage 里还是会出现。