Reasoning Effort 设计对比:Claude Code / Codex CLI / OpenCode

May 4, 2026 · View on GitHub

处理 Issue #130。逐源码对比 reasoning_effort / effort 在三家的设计差异、cache 影响、对 Qwen Code 支持 DeepSeek reasoning_effort 的启发。

数据

  • Claude utils/effort.ts 329 行 + commands/effort/ ~80 行
  • Codex protocol/src/openai_models.rs + core/src/config/mod.rs + tools/src/agent_tool.rs
  • OpenCode provider/transform.ts ~1100 行(per-provider effort 适配器)

DeepSeek 支持参考DeepSeek API 文档 · DeepSeek-Chat / DeepSeek-Reasoner / DeepSeek-V3 / DeepSeek-V4 系列均通过 OpenAI-compatible API 接收 reasoning_effort


一、TL;DR

维度Claude CodeCodex CLIOpenCode
levels5low / medium / high / xhigh / max(v2.1.123 二进制确认)6:none / minimal / low / medium / high / xhighper-provider 自适应(见 §2.5)
defaultOpus 4.7 launch pin = xhigh;Opus 4.6 + Pro = medium;其他 = undefined(→API high)Medium(静态)provider 默认
CLI flag--effort <level>✗(用 -c✗(走 model variants)
Slash 命令/effort✗(合并在 /model
环境变量CLAUDE_CODE_EFFORT_LEVEL
持久化配置✓ settings.json✓ TOML✓ JSON provider.<id>.options
Plan 模式专用plan_mode_reasoning_effort
Profile 切换config_profile通过 model variant
Agent 级✓ skill frontmatter✓ agent TOMLagent.<name>.model 含 variant
per-call override⚠️ 不鼓励spawn_agent 参数通过 variant 机制
per-provider 适配白/黑名单nearest_effort() snapper-provider 表驱动(最丰富)
DeepSeek 支持⚠️ 仅 1P 模型默认开 effort✓ 通过 -c 通用机制明确支持 V3/Chat/Reasoner/V4(V4 含 max
设计哲学session-level + cache-friendly配置驱动 + 模式分支 + 灵活per-provider 适配 + variant 机制

二、关键差异深度分析

2.1 Levels 与默认值

Claude(v2.1.123 实测 5 档)

// 二进制 v2.1.123 反编译 (LB 常量)
EFFORT_LEVELS = ['low', 'medium', 'high', 'xhigh', 'max']

⚠️ 泄露源码(utils/effort.ts:13-18)只有 4 档low / medium / high / max),但 v2.1.123 的二进制已添加 xhigh。差异说明泄露源码早于 Opus 4.7 发布(undercover.ts:49opus-4-7 列为 "Unreleased model version numbers")。

支持矩阵(v2.1.123 确认)

LevelOpus 4.7Opus 4.6Sonnet 4.6其他
low / medium / high(3P override 决定)
xhigh独占snap → highsnap → highsnap → high
maxsnap → high

默认值(关键)

  • Opus 4.7 launch pinY86() 函数返回 xhigh(专门为 4.7 launch 启用)
  • Opus 4.6 + Pro/Max/Team subscriber + tengu_grey_step2medium
  • 其他undefined(API 解析为 high

Opus 4.7 的 launch pin 机制

// 二进制 v2.1.123 反编译核心逻辑(vxH = resolveAppliedEffort)
function vxH(model, appStateEffort) {
  let isLaunchPinActive = model.includes("opus-4-7") &&
                          !globalConfig.unpinOpus47LaunchEffort
  let launchDefault = Y86(model)              // opus-4-7 → "xhigh", 其他 → "high"
  let envOverride   = mPH()                    // CLAUDE_CODE_EFFORT_LEVEL

  if (envOverride === null) return isLaunchPinActive ? launchDefault : undefined
  let resolved = envOverride ?? (isLaunchPinActive ? launchDefault : undefined)
                              ?? appStateEffort
                              ?? launchDefault
  if (resolved === "max"   && !V9$(model)) return "high"  // max 不支持 → snap
  if (resolved === "xhigh" && !k9$(model)) return "high"  // xhigh 不支持 → snap
  return resolved
}

// 用户首次显式选 effort → 永久解除 launch pin(globalConfig 写盘)
function setOpusLaunchEffort(value) {
  if (parsed !== undefined) {
    setGlobalConfig(c => c.unpinOpus47LaunchEffort
                          ? c
                          : { ...c, unpinOpus47LaunchEffort: true })
  }
  return parsed ?? bN1()
}

Anthropic 在二进制内嵌的官方说明shared/models.md 等内置文档字符串):

"Opus 4.7 adds "xhigh" (between high and max) — the best setting for most coding and agentic use cases on 4.7, and the default in Claude Code; use a minimum of high for most intelligence-sensitive work."

持久化(N9$ = toPersistableEffort

function N9$(value) {
  if (value === "low" || value === "medium" || value === "high" || value === "xhigh") return value
  // max 仍然不持久化(避免 session-only 选择泄漏)
  return undefined
}

xhigh 已加入持久化白名单;max 维持非持久化。

Codex(6 档)

// protocol/src/openai_models.rs:43-51
pub enum ReasoningEffort {
    None, Minimal, Low, #[default] Medium, High, XHigh,
}
  • 比 Claude 多 None不发送 reasoning 字段,不是 effort=0)和 Minimal
  • 默认 Medium(静态 enum default)
  • nearest_effort() (line 525) 把不支持的 effort snap 到最近档(用户配 xhigh 但模型只支持 [low, medium, high]high

xhigh 趋同:Claude v2.1.123 + Codex 都引入 xhigh(位于 highmax 之间),但 Codex 的 xhigh全局枚举的一档,Claude 的 xhighopus-4-7 独占默认值


2.2 用户入口(Claude 4 层 vs Codex 主走配置)

Claude 4 层入口

机制持久源码
CLI--effort low|medium|high|xhigh|maxmain.tsx:993xhigh 仅 Opus 4.7)
Slash/effort low✓ 写 settings.jsoncommands/effort/effort.tsx
EnvCLAUDE_CODE_EFFORT_LEVELenv-controlledutils/effort.ts:136-142
Configsettings.json effortLevelutils/effort.ts:107-111

优先级utils/effort.ts:152-172):env → appState → model default

Codex 主走配置

机制源码
CLI 临时codex -c model_reasoning_effort=high(通用 -c无独立 flag通用机制
Profileconfig_profile.model_reasoning_effortconfig/mod.rs:2575-2577
全局 TOMLmodel_reasoning_effort = "medium"config/mod.rs:595
Plan 模式专用plan_mode_reasoning_effort = "high"config/mod.rs:602

优先级config/mod.rs:2575-2580):profile → global config


2.3 Plan 模式专用(Codex 独有)

// codex-rs/core/src/config/mod.rs:596-602
/// When unset, Plan mode uses the built-in Plan preset default (currently
/// `medium`). When explicitly set (including `none`), this overrides the
/// Plan preset. The `none` value means "no reasoning" (not "inherit").
pub plan_mode_reasoning_effort: Option<ReasoningEffort>,

关键None 是显式值(不发送 reasoning),不等于"未设置走全局默认"。这是 Rust Option<Option<T>> 风格的二阶可选语义。

Claude 没有 Plan-mode 专用配置 —— Plan 模式走当前 session effort。


2.4 Agent / Skill 级配置(双方均有,路径不同)

Claude:YAML frontmatter

# .claude/skills/code-reviewer/SKILL.md
---
name: code-reviewer
effort: high      # 或数值(ANT-only)
---

源码 skills/loadSkillsDir.ts:205, 230parseEffortValue(frontmatter['effort'])

Codex:独立 TOML 文件

# codex-rs/core/src/agent/builtins/awaiter.toml
background_terminal_max_timeout = 3600000
model_reasoning_effort = "low"      # awaiter 是 polling-only,无需复杂推理
developer_instructions = """..."""

Codex 还允许 spawn_agent 工具 per-call 覆盖tools/src/agent_tool.rs:539-541):

"reasoning_effort".to_string(),
"Optional reasoning effort override for the new agent. Replaces the inherited reasoning effort."

2.5 OpenCode 的 per-provider 适配器模式

OpenCode provider/transform.ts单一函数 + provider 大 switch 给每个 provider/model 组合返回一份 effort 列表,作为 model 的 variants

核心常量(line ~447):

const WIDELY_SUPPORTED_EFFORTS = ["low", "medium", "high"]
const OPENAI_EFFORTS = ["none", "minimal", ...WIDELY_SUPPORTED_EFFORTS, "xhigh"]

Provider 适配示例

// transform.ts 简化版
switch (sdkName) {
  case "@ai-sdk/openai":
    return OPENAI_EFFORTS  // 6 档全开

  case "@ai-sdk/anthropic":
    if (apiId.includes("opus-4-7")) return ["low","medium","high","xhigh","max"]
    if (apiId.includes("opus-4-6") || apiId.includes("sonnet-4-6")) return ["low","medium","high","max"]
    return []

  case "@ai-sdk/openai-compatible":  // ← DeepSeek 走这里
    const efforts = [...WIDELY_SUPPORTED_EFFORTS]  // [low, medium, high]
    if (model.api.id.includes("deepseek-v4")) efforts.push("max")  // V4 加 max
    return efforts

  case "@ai-sdk/azure":
    if (id === "o1-mini") return []
    return ["low","medium","high"]

  case "@ai-sdk/github-copilot":
    if (id.includes("gemini")) return []  // gemini 不支持
    if (id.includes("claude")) return ["low","medium","high"]
    if (id.includes("5.1-codex-max")||id.includes("5.2")||id.includes("5.3"))
      return [...WIDELY_SUPPORTED_EFFORTS, "xhigh"]
    return OPENAI_EFFORTS
}

核心机制:每个 effort 注册为 model 的 variantprovider.<id>.models.<id>.variants.high = { reasoningEffort: "high" }),用户通过 model variant 切换:

{
  "agent": {
    "build": { "model": "anthropic/claude-sonnet-4-6", "variant": "high" },
    "plan":  { "model": "anthropic/claude-sonnet-4-6", "variant": "max" }
  }
}

与 Claude/Codex 区别

  • Claude / Codex:effort 是独立 API 参数
  • OpenCode:effort 通过 model variant 名字间接表达 → variant name 进入 model id → 完全融入 model 选择路径

OpenCode 对 DeepSeek 的特别处理(双层)

Layer 1:assistant 消息强制含 reasoning part(transform.ts:200-215):

// Deepseek requires all assistant messages to have reasoning on them
if (model.api.id.includes("deepseek")) {
  msgs = msgs.map((msg) => {
    if (msg.role !== "assistant") return msg
    if (Array.isArray(msg.content)) {
      if (msg.content.some((part) => part.type === "reasoning")) return msg
      return { ...msg, content: [...msg.content, { type: "reasoning", text: "" }] }
    }
    // ...
  })
}

Layer 2interleaved.field = "reasoning_content" 触发的 providerOptions 注入(transform.ts:217-249):

if (typeof model.capabilities.interleaved === "object" &&
    model.capabilities.interleaved.field &&
    model.api.npm !== "@openrouter/ai-sdk-provider") {
  const field = model.capabilities.interleaved.field   // "reasoning_content"
  return msgs.map((msg) => {
    if (msg.role === "assistant" && Array.isArray(msg.content)) {
      const reasoningParts = msg.content.filter(p => p.type === "reasoning")
      const reasoningText  = reasoningParts.map(p => p.text).join("")
      return {
        ...msg,
        content: msg.content.filter(p => p.type !== "reasoning"),  // 提出 reasoning
        providerOptions: {
          openaiCompatible: { [field]: reasoningText }              // 转 reasoning_content
        }
      }
    }
    return msg
  })
}

自动检测(commit 738b3065d, 2026-04-27 合并 PR#24630):当 DeepSeek 模型走 @ai-sdk/openai-compatible 且无 existingModel 定义时,OpenCode 自动设置 interleaved = { field: "reasoning_content" }

// provider.ts:1182-1187
interleaved:
  model.interleaved ??
  existingModel?.capabilities.interleaved ??
  (!existingModel && apiNpm === "@ai-sdk/openai-compatible" && apiID.includes("deepseek")
    ? { field: "reasoning_content" }
    : false),

DeepSeek 多轮对话需要 reasoning 字段在 message 间持续传递,OpenCode 通过两层处理保证:

  • Layer 1 保证 message 结构合法(即使空 reasoning 也补占位符)
  • Layer 2 把 reasoning 文本提到 providerOptions.openaiCompatible.reasoning_content,符合 DeepSeek API 格式

Qwen Code 当前未处理任一层约束provider/deepseek.ts 仅做 content array → string 扁平化)。


2.6 ⚠️ Cache 影响(Issue 核心点)

Claude 的设计权衡

源码 query.ts:694 主 loop 用 appState.effortValue(session-level)。Issue #130 引用的关键证据:

"prompt suggestion 曾尝试设置 effort: 'low',但因影响 prompt cache 命中率,最终避免覆盖 effortValue"

机制:Anthropic API 把 reasoning_effort 纳入 prompt cache key,同一 conversation 用 medium vs high独立 cache 链。反复切换 → 每次 cache miss → token 成本爆炸。

Claude 的应对

  1. session-scoped 持久(/effort 改后整 session 不变)
  2. subagent 默认继承父 effort
  3. 高频路径禁止覆盖(prompt suggestion / forked agent 不改 effort)

Codex 的不同选择

源码 tools/src/agent_tool.rs:539-541 主动暴露 reasoning_effort per-call 参数。multi_agents_common.rs:317-331 在 spawn agent 时主动注入 effort。与 Claude 的"高频禁覆盖"哲学相反

可能原因(待源码核对):

  • OpenAI Responses API 的 cache 策略与 Anthropic Messages API 不同
  • spawn agent 是独立 conversation context,与父 cache 无重叠

⚠️ 未验证项:OpenAI Responses API 的 cache key 是否含 reasoning_effort —— 待官方文档/源码进一步核对。

结论

路径是否安全原因
Session-level 持久切换cache 链一致
Subagent spawn 时设置(独立 context)无 cache 重叠
同一 turn 内反复切换破坏 cache 链
prompt suggestion 等高频路径 overrideClaude 实测确认

三、对 Qwen Code 支持 DeepSeek reasoning_effort 的具体方案

用户主要诉求:"主要是要支持 deepseek 的 reasoning_effort"。本节聚焦 DeepSeek(通用 effort 框架是基础)。

3.1 Qwen Code 当前状态

2026-05-04 更新PR#3800已合并 2026-05-04 14:42 UTC —— 体量从 OPEN 时 +516/-57 增长到 +926/-80直接命中本节 §3.3 推荐实施方案 Step 1 + Step 2:① ContentGeneratorConfig.reasoning.effort 类型扩展含 'max';② DeepSeek provider 新 translateReasoningEffort()buildRequestreasoning.effort 拍平为顶级 reasoning_effort;③ backward-compat low/mediumhighxhighmax(与 §2.4 表 Codex 行为一致);④ 用户 samplingParams / extra_body 已设值时不覆盖;⑤ Anthropic generator output_config.effort'max'thinking.budget_tokens 阶梯:low 16K / med 32K / high 64K / max 128K§3.1 当前缺失清单的 max 档识别项已 ✓ 落地

源码 packages/core/src/core/openaiContentGenerator/pipeline.ts:437-464 buildReasoningConfig

// 已经支持透传 reasoning 字段到 OpenAI-compatible 请求
private buildReasoningConfig(request: GenerateContentParameters) {
  if (request.config?.thinkingConfig?.includeThoughts === false) return {}
  const reasoning = this.contentGeneratorConfig.reasoning
  if (reasoning === false || reasoning === undefined) return {}
  return { reasoning }
}

已具备的基础

  • pipeline.ts:431 在请求中拼入 reasoning 配置
  • pipeline.ts:443-447 注释列出多 provider 的 thinking 行为差异(含 deepseek-reasoner)
  • provider/deepseek.ts:13 DeepSeekOpenAICompatibleProvider 类已存在(处理 content array → string flatten)

当前缺失(截至 2026-05-04,PR#3800 / PR#3788 已合并解决多项):

  • 🟡 user-facing 入口 —— PR#3800 提供 settings.json 入口(用户配 reasoning.effort: 'max' 生效);CLI flag / slash 命令仍可补
  • DeepSeek V4 的 max识别 —— PR#3800已合并 2026-05-04(+926/-80 · type expansion + DeepSeek provider 扁平化 translateReasoningEffort() + Anthropic generator thinking.budget_tokens 128K 阶梯)
  • DeepSeek assistant-message-must-have-reasoning 约束 —— PR#3788(已合并 2026-05-02 +1407/-76)已覆盖injectThinkingOnToolUseTurns + normalizeAssistantThinkingSignature 跨提供商规范化)
  • DeepSeek reasoning_content 字段往返 —— PR#3729 / PR#3747 / PR#3737 / PR#3788 系列(均已合并)已覆盖(详见 item-22 thinking 块跨轮保留
  • 🟡 per-provider effort 列表表(Claude 用白/黑名单,Codex 用 nearest_effort,OpenCode 用 per-provider switch)—— PR#3800 的 deepseek provider translateReasoningEffort() 已是第一个 per-provider 适配;其他 provider(GPT/Anthropic/Gemini)的 effort 范围是否有特殊处理待源码二次核查

3.2 DeepSeek 系列的实际 effort 行为

参考 DeepSeek API 文档 + OpenCode 源码确认:

模型reasoning_effort 支持档默认行为
deepseek-chatlow / medium / high(推测,参考 OpenCode WIDELY_SUPPORTED_EFFORTS不开 thinking
deepseek-reasoner (R1)thinking 默认开,无法 disable(pipeline.ts:443 注释)始终 reasoning
deepseek-v3low / medium / high见模型卡
deepseek-v4low / medium / high / **max** ← V4 独有 max 档OpenCode transform.ts:576-579 确认

⚠️ 未现场验证:上表 effort 档列表来自 OpenCode 源码推断 + 行业惯例,建议实施时对照 DeepSeek 官方 API 文档 最新值确认。

3.3 推荐实施方案(4 步)

Step 1:扩展 ContentGeneratorConfig.reasoning schema 支持 effort(~30 行 / 0.5 天)

// packages/core/src/core/contentGenerator.ts
export type ReasoningEffort = 'low' | 'medium' | 'high' | 'max' | 'none'

export interface ReasoningConfig {
  effort?: ReasoningEffort
  // ... 其他保留字段
}

Step 2:DeepSeek provider 实现 effort 映射(~80 行 / 1 天)

// packages/core/src/core/openaiContentGenerator/provider/deepseek.ts
export class DeepSeekOpenAICompatibleProvider extends DefaultOpenAICompatibleProvider {

  private supportedEfforts(): string[] {
    const model = this.contentGeneratorConfig.model ?? ''
    if (model.toLowerCase().includes('deepseek-v4')) {
      return ['low', 'medium', 'high', 'max']  // V4 加 max
    }
    if (model.toLowerCase().includes('deepseek-reasoner')) {
      return []  // R1 always thinking, no effort override
    }
    return ['low', 'medium', 'high']  // V3 / chat
  }

  override buildRequest(request, userPromptId): OpenAI.Chat.ChatCompletionCreateParams {
    const baseRequest = super.buildRequest(request, userPromptId)

    // Step A: 现有 content flatten 逻辑保留

    // Step B: 验证 effort 在该模型支持档内(snap 不支持的到最近档)
    if (baseRequest.reasoning_effort) {
      const supported = this.supportedEfforts()
      if (supported.length === 0) {
        delete baseRequest.reasoning_effort  // R1 模型移除
      } else if (!supported.includes(baseRequest.reasoning_effort)) {
        baseRequest.reasoning_effort = nearestEffort(baseRequest.reasoning_effort, supported)
      }
    }

    // Step C: assistant message 必须含 reasoning(OpenCode Layer 1,transform.ts:200-215)
    baseRequest.messages = baseRequest.messages.map(msg => {
      if (msg.role !== 'assistant') return msg
      // 给 array content 加空 reasoning 占位
      if (Array.isArray(msg.content) && !msg.content.some(p => p.type === 'reasoning')) {
        return { ...msg, content: [...msg.content, { type: 'reasoning', text: '' }] }
      }
      return msg
    })

    // Step D: reasoning 文本提到顶层 reasoning_content(OpenCode Layer 2,transform.ts:217-249)
    //         多轮对话时 DeepSeek 期望 reasoning_content 跟随 assistant 消息一起回传
    baseRequest.messages = baseRequest.messages.map((msg: any) => {
      if (msg.role !== 'assistant' || !Array.isArray(msg.content)) return msg
      const reasoningParts = msg.content.filter((p: any) => p.type === 'reasoning')
      const reasoningText  = reasoningParts.map((p: any) => p.text).join('')
      return {
        ...msg,
        content: msg.content.filter((p: any) => p.type !== 'reasoning'),
        reasoning_content: reasoningText,  // 即使空字符串也保留(OpenCode 注释说明)
      }
    })

    return baseRequest
  }
}

Step 3:用户入口(settings.json 优先,~50 行 / 0.5 天)

// .qwen/settings.json
{
  "reasoning": {
    "effort": "high"     // 全局
  }
}

pipeline.ts:457this.contentGeneratorConfig.reasoning 已经从 settings 读取 —— 只需保证 schema 支持 effort 字段。

可选扩展(参考 Codex):

{
  "reasoning": {
    "effort": "medium",
    "planModeEffort": "high"   // 如 Qwen 实现 Plan 模式
  }
}

Step 4:可选 - CLI flag + /effort slash(~80 行 / 1 天)

参考 Claude --effort + /effort 的实现模式。警告:实施 /effort 之前先做 cache 度量(见 §2.6)。

3.4 实施 checklist

任务文件工作量
扩展 ReasoningConfig.effort 类型core/contentGenerator.ts0.5 天
DeepSeek provider 模型映射core/openaiContentGenerator/provider/deepseek.ts1 天
DeepSeek V4 max 档支持同上
DeepSeek assistant message reasoning placeholder同上
settings.json schema 支持 reasoning.effortcli/src/config/settingsSchema.ts0.5 天
单测:3 模型 × 4 effort 档行为provider/deepseek.test.ts0.5 天
文档更新:Qwen Code DeepSeek 配置示例docs/users/...0.3 天
--effort CLI flag(可选)cli/src/cli.ts0.5 天
/effort slash(可选)cli/src/commands/effortCommand.ts0.5 天

核心实施 ~3 天(不含 CLI/slash)。

3.5 通用 effort 框架(更长期)

如果除了 DeepSeek 还想做通用支持:

Phase内容工作量
P0DeepSeek reasoning_effort 完整支持(§3.3 全 4 步)~3 天
P1OpenAI / GPT-5.x / Anthropic Opus 4.6+ 的 effort 适配~2 天
P2per-provider effort 表(OpenCode 风格 transform.ts)~3 天
P3CLI / slash / env / /status 显示(Claude 风格)~2 天
P4Cache 监控 dashboard~1 天

总 ~11 天。建议先 P0 + P4(DeepSeek 落地 + cache 度量基线)。

3.6 ⚠️ Cache 影响(实施前必读)

参考 §2.6 Claude 经验。对 DeepSeek 特别注意

  • DeepSeek 走 OpenAI-compatible API,cache 行为可能跟 OpenAI 一致(待官方文档确认)
  • reasoning_effort 切换可能破坏 prompt cache hit rate
  • 建议:session-level 持久(用户改才变),不在 turn 中切换

四、附录 A:源码引用索引

Claude Code(泄露源码)

⚠️ 泄露源码先于 Opus 4.7 发布。下表反映泄露源码的 4 档设计;v2.1.123 二进制已升级为 5 档(见下方"v2.1.123 二进制反编译")。

文件功能
utils/effort.ts13-18EFFORT_LEVELS 4 档
23-49modelSupportsEffort
53-65modelSupportsMaxEffort(仅 Opus 4.6)
71-92parseEffortValue(含 ANT 数值)
95-105toPersistableEffort(max 不持久)
107-111getInitialEffortSetting
136-142getEffortEnvOverride
152-172resolveAppliedEffort 优先级链
279-329getDefaultEffortForModel(subscription tier)
commands/effort/effort.tsx/effort slash
main.tsx993--effort CLI flag
query.ts694主 loop 用 appState.effortValue
skills/loadSkillsDir.ts205, 230skill frontmatter effort
utils/undercover.ts49opus-4-7 列为 unreleased(说明泄露时点)

Claude Code(v2.1.123 二进制反编译)

反编译 ID 为 mangled 标识符(Y86/vxH/V9$/k9$ 等);功能映射到原源码语义。

Mangled 名源码对应功能
LBEFFORT_LEVELS5 档:["low","medium","high","xhigh","max"]
Y86新增(无源码对应)返回模型的 launch 默认 effort:opus-4-7 → "xhigh",其他 → "high"
vxHresolveAppliedEffortunpinOpus47LaunchEffort 状态分支
z86新增(unpin trigger)用户首次设置 effort 时把 unpinOpus47LaunchEffort = true 写盘
V9$modelSupportsMaxEffort允许:opus-4-7 + opus-4-6 + sonnet-4-6
k9$新增(xhigh 支持检测)允许:opus-4-7
kfH / x5$modelSupportsEffort允许:opus-4-7 / opus-4-6 / sonnet-4-6
N9$toPersistableEffort持久化:low/medium/high/xhighmax 仍排除
全局配置字段unpinOpus47LaunchEffort: boolean(写到 ~/.claude.json

对应的 Anthropic 内嵌文档(二进制内 shared/models.md 字符串)

  • "Opus 4.7 adds "xhigh" (between high and max) — the best setting for most coding and agentic use cases on 4.7, and the default in Claude Code"
  • "On Opus 4.7, effort matters more than on any prior Opus — re-tune it when migrating"
  • Opus 4.7 同时移除 temperature / top_p / top_k / budget_tokens(强制 adaptive thinking)

Codex CLI(main 分支 @ 2026-04-28 21:41 commit 3d10ba9f36

文件功能
codex-rs/protocol/src/openai_models.rs43-51ReasoningEffort enum 6 档
514-532nearest_effort snap
codex-rs/core/src/config/mod.rs595model_reasoning_effort 全局
596-602plan_mode_reasoning_effort Plan 模式
2575-2580profile → cfg fallback
codex-rs/core/src/tools/handlers/multi_agents_common.rs317-331spawn 时注入
codex-rs/core/src/agent/builtins/awaiter.toml2内置 agent model_reasoning_effort = "low"
codex-rs/tools/src/agent_tool.rs539, 572spawn_agent 工具 reasoning_effort 参数
codex-rs/tui/src/slash_command.rs102/model 描述含 reasoning effort
codex-rs/core/src/session/turn_context.rsAdd reasoning effort to turn tracing spans (commit 99b39b6350dev/charley/turn-reasoning-effort-tracing 分支,未合并 main)

OpenCode(dev 分支 @ 2026-04-29 13:23 commit d71b827d8

文件功能
packages/opencode/src/provider/transform.ts200-215Layer 1:DeepSeek assistant message 补 reasoning 占位符
217-249Layer 2interleaved.field = "reasoning_content"providerOptions.openaiCompatible.reasoning_content 注入
~446-449WIDELY_SUPPORTED_EFFORTS = [low,medium,high] / OPENAI_EFFORTS
大 switchper-provider effort 列表(openai / anthropic / openai-compatible / azure / github-copilot 等)
~576-579DeepSeek-V4 在 openai-compatible 分支加 max
packages/opencode/src/provider/provider.ts1182-1187自动检测 DeepSeek + openai-compatible → 默认 interleaved = { field: "reasoning_content" }(PR#24630 / commit 738b3065d 2026-04-27 合并)

每个 effort 注册为 model 的 variant(参见 Provider.ts model.variants),用户通过 provider/<id>:variant 间接选 effort。

Qwen Code(当前状态参考)

文件功能
packages/core/src/core/openaiContentGenerator/pipeline.ts437-464buildReasoningConfig 已支持 reasoning passthrough
packages/core/src/core/openaiContentGenerator/provider/deepseek.tsDeepSeekOpenAICompatibleProvider(仅 content 扁平化,无 effort 适配)

五、附录 B:相关文档


最后更新:2026-04-29 · Issue#130