跳转到内容

推理与思考

先从模型配置速查复制所用模型的配方,不必先理解所有协议字段。

  • 只想调整思考强度:找到下表中对应的接入方式,修改它支持的字段。
  • 模型调用工具后报思考内容缺失:查看回放契约,确认是否需要保留历史思考。
  • 只想看译文:配置思考翻译,它只影响显示,不改变模型请求中的思考设置。

思考会影响费用:新生成的思考计入输出,随历史再次发送的思考计入输入。字段完整定义见模型字段参考。

线路 Chord 键位 返回什么
Responses(type: responses) reasoning.effort、reasoning.summary 明文 reasoning_text,加上加密的 reasoning item
Chat Completions(type: chat-completions) reasoning.effort,以及各家族特有字段,通过 compat.request_overrides.body 发送(thinking、enable_thinking、reasoning_split、clear_thinking 等) 一般是 reasoning_content;有些后端把带标签的思考直接写进 content
Messages(type: messages) thinking.type、thinking.budget_tokens、thinking.effort、thinking.display 带签名的 thinking block
Gemini(type: generate-content) thinking.level、thinking.budget、thinking.include_thoughts 思考摘要,加上思考签名

reasoning.effort 没有本地白名单:Chord 原样透传,由后端决定接受、收敛还是 拒绝。只有 Responses 线路会先归一化空格和大小写,所以那里 high 和 High 都行。

走 Chat Completions 时,把请求转成模型原生 API 的网关会按自己的形状收到思考配置: Gemini 用 extra_body.google.thinking_config,Claude 用 thinking: {type, budget_tokens},DeepSeek / GLM / Kimi K2.x / Doubao 用 thinking: {type},Qwen 用 enable_thinking。形状由 compat.chat_completions.native_thinking 指定,只有 DeepSeek 路由(DeepSeek 模型 ID 或 compat.reasoning_continuity.contract: deepseek)才会自动选到。网关后面的模型是不是 Gemini 或 Claude 也靠这个选择器识别:没配时 Gemini 的 思考签名不会写回请求,Gemini 3 会拒绝每次工具调用之后的请求(HTTP 400)。见 走 Chat Completions 网关的 thinking。

模型 ID 的最后一段(去掉 provider 前缀,不区分大小写)是 DeepSeek API 模型名时, Chord 自动启用 DeepSeek 契约。DeepSeek API 模型名包括:

  • deepseek;
  • deepseek-v<N>,N 不小于 4,例如 deepseek-v4-pro、deepseek-v4.1-flash、 deepseek-v5;
  • deepseek-flash、deepseek-pro、deepseek-chat、deepseek-reasoner, 可以单独出现,也可以后接 -…。

名字里带 distill 的一律不算。第三方按自家契约托管的开源权重模型,例如 deepseek-r1-distill-*、deepseek-coder-*、deepseek-v3、deepseek-r1, 同样不会自动识别;如果某条路由确实按 DeepSeek 契约提供这类模型,用 compat.reasoning_continuity.contract: deepseek 显式开启。

Chat Completions 和 Messages 都保持用户指定的思考强度;历史 工具调用没有思考文本,也不会撤掉 max。max 是强度,max_tokens 是输出 上限,DeepSeek 不使用 budget_tokens 控制思考强度。

Messages 使用 thinking.type: enabled 配合 thinking.effort,发送为 thinking: {type: enabled} 与 output_config.effort。Chat 使用 reasoning.effort,发送 reasoning_effort 与 thinking: {type: enabled}。 thinking.type: disabled 明确关闭思考。

这两条 DeepSeek 路径始终完整回放保留历史中的思考,包括更早用户轮次的 消息;通用的 reasoning_replay: current_turn / none 不会缩短这个窗口。 显式配置这两个值时,启动日志和 chord doctor config 会提示它们被 DeepSeek 契约覆盖;移除该配置或设为 all 即可消除提示。 同源 Messages 思考块保留原始文本和可用签名。回放被拒绝时,Chord 不会通过 降低强度、删除必需思考或把工具轨迹转成文本来重试;错误继续按模型池规则 处理。第三方网关需要支持这套 DeepSeek 契约;第三方路由的模型 ID 是 DeepSeek API 模型名、后端却不是 DeepSeek 时,用 compat.reasoning_continuity.contract: none 退出,Chat 和 Messages 都适用。

除上述 DeepSeek Chat/Messages 路径外,其他目标按后端是否要求回传思考选择:

  1. 不思考:模型本身不推理,或者你从不开启思考。无需配置。
  2. 会返回思考,但不要求回传:默认配置就够。Chord 首次尝试会乐观回放 chat 原生 reasoning,被拒后退化为结构化的已完成工具事实。如果后端根本 不返回 reasoning_content,Chord 会判定它无法回放 reasoning,并在本回合 后续请求中剥离按请求的 reasoning 控制项;只有确认端点接受这些控制项、 但没有 reasoning 回放契约时(文档里的例子是走 Chat Completions 的 Grok), 才设置 compat.chat_completions.keep_reasoning_effort: true。
  3. 后端会校验回传的思考:设置 compat.reasoning_continuity.mode: openai_visible 加 reasoning_replay: all,让每条 assistant 消息原样 回传。Kimi K3、Qwen preserve_thinking、GLM clear_thinking: false、 小米 MiMo 都属于这一类。第三方中转不保证遵守官方 契约(有的直接拒绝,有的只是效果变差),把 all 当成必需前 先确认实际端点的行为。本轮工具链必须带,之前轮次是可选项:留着连续性 和缓存更好,去掉每次请求更省。
  4. Responses、Messages、Gemini:原生 continuity 自动生效:Chord 会保存 明文或带签名 / 加密的状态,并在目标线路允许时回放,无需配置。Gemini 原生 端点上,模型 ID 以 gemini-3 开头时还会自动开启缺失思考签名的 修复。走 Chat Completions 网关时,要等 compat.chat_completions.native_thinking 指明家族(Gemini 3 用 gemini-3),Chord 才会回放 Gemini 和 Claude 的状态。

reasoning_replay: all 会让已完成轮次的思考在每次请求中重复回放,后端按 输入计费。默认的 current_turn 会剥离已完成轮次,第 3 条不适用时用默认即可。 过期的思考还可能把模型带偏,只在后端明确要求时才保留全量。

可移植的可见 reasoning 只在目标有结构化承载字段时才转换(Chat Completions 的 openai_visible、经验证的 Messages 兼容端点的 anthropic_unsigned); 没有承载字段就直接丢弃,不会把思考塞进正文。已完成的工具调用及其结果始终 保持结构化,这是切换 provider 时必须保住的上下文。详见 跨协议 fallback 的连续性。

  • 思考 token 算输出;回放的 reasoning 算输入。
  • 已完成轮次的 thinking 默认会被剥离,用来控制请求体积。Anthropic 会在服务端 过滤历史轮的 thinking 块,只为模型实际看到的块计费,省掉它们不花冤枉钱; 原样回放历史的端点会为保留的每个 token 计费,所以上面那些契约要显式选 all。
  • 有些后端会固定采样参数,或在思考设置变化时让缓存失效:Kimi K3 固定 temperature / top_p / penalties,会话中途改 reasoning_effort 会让 prefix cache 失效。
  • TUI 的思考翻译(thinking_translation)只影响显示,不会写回模型上下文; 见 Thinking 附加翻译。

请求报 thinking 模式错误时,从 常见问题排查 查起。