Skip to content

使用 Qwen 文本模型的 enable_thinking

本文只适用于 Qwen 文本模型。Qwen-VL 是多模态请求面,虽然也使用 enable_thinking,但请求形态不同,请阅读使用 Qwen-VL 的 enable_thinking

区分可切换、instruct 和 thinking 后缀模型

Qwen 文本模型使用与 messages 同级的 enable_thinking,不是 thinking.typeenable_thinking 接受布尔值。接入前先区分可切换模型、默认思考模型和强制思考模型。

  • qwen3-8b 等开放混合思考模型可使用 enable_thinking 开关,并可测试 thinking_budget
  • instruct、coder 等变体需要先用目标模型验证是否支持开关,再决定是否暴露给业务。
  • thinking 后缀模型按强制思考模型处理,不把关闭思考写成常规路径。

模型能力会随版本变化。对精确模型 ID 的控制参数,以上线前实测结果为准。

设置当前请求的 enable_thinking

开启推理时传 enable_thinking: true。如果模型支持限制思考长度,可以同时传 thinking_budget。以下 Python 示例使用 OpenAI SDK。

language-python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["API_KEY"],
    base_url="https://cloud.infini-ai.com/maas/v1",
)

response = client.chat.completions.create(
    model="qwen3-8b",
    messages=[{"role": "user", "content": "What is 2 + 2? Give only the final answer."}],
    max_tokens=256,
    extra_body={
        "enable_thinking": True,
        "thinking_budget": 50,
    },
)

关闭推理时只传:

language-python
extra_body = {"enable_thinking": False}

thinking_budget 先用于确认请求能否正常返回,并观察 token 用量。不要仅凭一次请求就判断它能稳定改善质量。

用 curl 验证流式 enable_thinking 请求体

先用流式 curl 请求确认与 messages 同级的 enable_thinking 是否被接受,并观察响应中是否出现 delta.reasoning_content。运行前先在当前终端设置 API_KEY 环境变量。以下 curl 命令适用于 bash/zsh 等 POSIX 风格 Shell(macOS/Linux、WSL、Git Bash)。如果使用 Windows PowerShell 或 CMD,请按对应 Shell 的语法调整命令。

language-shell
curl -N --request POST \
  --url "https://cloud.infini-ai.com/maas/v1/chat/completions" \
  --header "Accept: text/event-stream" \
  --header "Authorization: Bearer $API_KEY" \
  --header "Content-Type: application/json" \
  --data-raw '{
    "model": "qwen3-8b",
    "messages": [
      {
        "role": "user",
        "content": "What is 2 + 2? Give only the final answer."
      }
    ],
    "max_tokens": 256,
    "enable_thinking": true,
    "stream": true
  }'

读取 Qwen 的 reasoning_content

Qwen 文本模型返回推理内容时,通常使用 reasoning_content。该字段可能缺失,尤其是关闭推理或模型默认不返回可见推理时。

language-python
message = response.choices[0].message
reasoning = getattr(message, "reasoning_content", None)

if reasoning:
    print(reasoning)
print(message.content)

流式响应中从 delta.reasoning_content 拼接推理内容。

需要可见推理时优先选择流式响应

按目标模型选择响应模式。不同 Qwen 文本模型的可见推理字段并不一致:

  • qwen3-8bqwen3-14bqwen3-32bqwen3-30b-a3b 接受 enable_thinking: true,但可见推理只在流式响应中通过 delta.reasoning_content 返回;非流式响应没有返回 reasoning_content
  • qwen3-235b-a22b 在非流式和流式响应中都返回可见推理内容。
  • qwen3-235b-a22b-instruct-2507qwen3-coder-480b-a35b-instructqwen3-next-80b-a3b-instruct 接受推理参数,但没有返回可见推理内容。
  • qwen3-next-80b-a3b-thinking 默认在非流式和流式响应中都返回可见推理内容。

没有返回 reasoning_content 不一定表示请求没有启用思考,只表示该模型或响应模式没有返回可见推理字段。如果业务需要展示、记录或回传推理内容,优先使用流式响应,并从 delta.reasoning_content 拼接推理内容。非流式响应更适合只需要最终回答的场景,除非目标模型已确认会在非流式响应中返回可见推理内容。

仅在支持时回传历史推理内容

只有目标模型明确支持该能力,并且业务需要工具调用或 agent 历史连续性时,才启用 preserved thinking。

如果使用 preserved thinking,应保留模型原始返回的 reasoning_content。如果当前可用模型列表中没有支持该能力的目标模型,应先只记录应用侧审计数据,不要把该字段作为必需历史协议。

排查 enable_thinking 和 thinking_budget

排查时按请求形态逐步缩小范围。

  • 确认目标是 Qwen 文本模型,不是 Qwen-VL。
  • 对 thinking 后缀模型,不要用关闭思考作为健康检查。
  • 如果传入 thinking_budget 后返回 400,先移除该字段,只验证 enable_thinking
  • 如果响应没有 reasoning_content,检查 enable_thinking 是否实际开启,并确认当前响应模式是否返回可见推理内容。

需要手工确认请求时,构造和业务代码相同的 curl 请求,再对照服务端返回字段。