Claude Code SDK #45:Model Configuration 全解——model × effort × fallback × budget,把质量和成本分开调

Claude Code SDK #45:Model Configuration 全解——model × effort × fallback × budget,把质量和成本分开调

把 Claude Code 的 model、effort、fallback 与预算上限拆成四条控制轴,配合 CLI 和 Python Agent SDK 示例,帮助开发者按问题类型调质量、成本与可靠性。

先给结论:四个旋钮,管的是四件事

Claude Code 里最容易调错的,不是 prompt,而是模型配置。
结果不理想时,很多人直接换更大的模型;速度变慢时,又把模型降下来。问题在于:modeleffort 根本不是同一个旋钮。
  • model 决定「谁来做」:能力上限、知识范围,以及每个 token 的单价。
  • effort 决定「愿意做多少」:会读多少文件、调用多少工具、验证多少次、走多少步。
  • fallback 决定「主模型不可用时怎么办」:它是可用性策略,不是质量调参。
  • budget / max_turns 决定「最多允许跑到哪里」:它们是硬护栏,不是模型路由。
这四件事混在一起,团队就会出现两种典型浪费:小任务用大模型反复验证;大任务用小模型烧很多轮,最后仍然失败。
1

1. modeleffort:能力和投入不是一回事

官方给出的区分很实用:模型选择是在不同的固定权重之间切换;effort 则控制 Claude 为当前任务投入多少工作。高 effort 不只是「多想一会儿」,还可能意味着读取更多文件、执行更多工具调用和做更多验证。2
可以用两个故障问题来定位:
  1. Claude 已经拿到了相关上下文,也认真尝试了,但仍然在陌生领域或复杂架构上判断错误?这是能力问题,优先换更强的 model
  2. Claude 漏读文件、没跑测试、改到一半就停?这是投入问题,优先提高 effort
当前文档列出的常用模型别名包括 sonnetopushaikufable,以及把计划阶段和执行阶段分开的 opusplan。别名会随 provider 和版本变化;需要可复现构建时,应该固定完整模型名,而不是把 sonnet 当成永久不变的版本号。1
# 复杂、含糊、需要架构判断的任务
claude --model opus --effort high "定位这个并发 bug,并给出可验证的修复"

# 机械、边界清楚的任务
claude --model sonnet --effort medium "给所有公开函数补上缺失的类型注解"

effort 的几个边界

effort 可用级别取决于当前模型,常见值是 lowmediumhighxhighmax。如果当前模型不支持你指定的级别,Claude Code 会回退到该模型支持的、且不高于目标级别的最高等级。
ultracode 需要单独理解:它不是普通的 effort 等级,而是一个 Claude Code 会话设置,使用 xhigh,同时打开动态工作流能力。它只适用于当前会话,不能当作持久化的 effortLevel 值写进 settings。1

2. 配置优先级:启动参数最适合做实验,settings 最适合做默认值

一个会话的模型,通常按下面的路径决定:
  • 交互中用 /model 立即切换;交互式选择可以保存为新会话默认值。
  • 启动时用 --model,只影响这次启动的会话,并覆盖 model 设置和 ANTHROPIC_MODEL
  • ANTHROPIC_MODEL 适合在 shell、容器或 CI 环境注入。
  • settings 里的 model 只是初始选择,不等于强制锁定。
恢复 session 时还有一个容易忽略的行为:transcript 会保留当时正在使用的模型。除非本次启动显式传入 --model 或对应环境变量,否则换一个终端里的默认模型,不会悄悄改写旧会话。1 3
这解释了一个常见误判:把 settings 里的 model 写成 sonnet,以为所有人都永远只能用 Sonnet。它实际上只是「启动时先选谁」;要做组织级限制,需要 availableModels,还要考虑 Default 是否被 allowlist 覆盖。

3. fallback:只解决不可用,不负责「答得更好」

CLI 可以这样配置备用模型:
claude --model opus --fallback-model sonnet,haiku "分析这次线上故障"
fallback chain 最多保留 3 个模型,按顺序尝试。它主要在主模型过载、不可用或遇到可切换的服务端错误时生效;认证错误、计费错误、速率限制、请求过大和传输错误,不会因为写了 fallback 就自动变成另一个模型请求。1 3
还有两个运营层面的细节:
  • fallback 只对当前轮次生效;下一条消息仍会先尝试主模型。
  • 如果 fallback 模型不在 availableModels allowlist 中,它会在读取链时被丢弃,不会等到故障发生后才发现不可用。
所以,fallback 不是「Opus 答不好就自动换 Sonnet」。它是「Opus 暂时不可达时,保证任务还有机会继续」。如果你希望根据任务难度切换模型,应在任务入口做路由,而不是把质量策略伪装成 fallback。

4. 预算与轮数:CLI 和 Agent SDK 的硬护栏

非交互模式下,CLI 提供两个很有用的停止条件:
claude -p \
  --model sonnet \
  --effort medium \
  --fallback-model haiku \
  --max-budget-usd 2.00 \
  --max-turns 6 \
  "检查最近改动,运行测试,并只输出 JSON 结果"
--max-budget-usd 限制 print mode 下 API 调用的美元预算;--max-turns 限制 agentic turn 数,达到上限会报错退出。两者都不是「换一个便宜模型继续跑」的开关。3
在 Python Agent SDK 里,对应的配置集中在 ClaudeAgentOptions
from claude_agent_sdk import ClaudeAgentOptions, query

options = ClaudeAgentOptions(
    model="sonnet",
    effort="high",
    fallback_model="haiku",
    max_turns=8,
    max_budget_usd=3.0,
    allowed_tools=["Read", "Glob", "Grep", "Edit", "Bash"],
)

async for message in query(
    prompt="检查 auth 模块,修复 bug,并运行最小必要测试",
    options=options,
):
    if hasattr(message, "result"):
        print(message.result)
SDK 的 max_budget_usd 是客户端侧成本估算达到指定美元值时停止查询;它和结果消息中的 total_cost_usd 使用同一估算口径,官方也提醒它存在精度边界。SDK 的 max_turns 则限制工具使用往返次数。4
这里有一个很重要的工程结论:预算是「最多花多少」,轮数是「最多走几步」,模型是「每一步由谁完成」。不要用提高 max_turns 来弥补模型能力不足,也不要用降低预算来处理本该由权限或工具范围解决的问题。

5. 团队治理:model 不是 allowlist

如果只是给团队一个默认模型,可以写:
{
  "model": "sonnet"
}
如果要限制用户可选范围,则要使用:
{
  "model": "claude-sonnet-4-5",
  "availableModels": ["claude-sonnet-4-5", "haiku"],
  "enforceAvailableModels": true,
  "env": {
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-5"
  }
}
availableModels 负责限制命名模型;enforceAvailableModels 进一步让 Default 也必须落在 allowlist 内。只写 model,用户仍然可以打开 /model 选择其他模型;只写 availableModelsDefault 仍可能解析到账户级默认模型。1
这也和上一期的网关边界不同:ANTHROPIC_BASE_URL 改变请求发往哪里,model 决定请求由哪个模型处理。网关可以统一凭据、审计和 provider,但它不替你完成模型选择策略。1
云端 Web、Desktop 和本地 CLI 对 settings 的到达路径也不同。官方文档指出,Anthropic 管理的云端 VM 不会自动读取你设备上的 managed settings;企业要让云端会话遵守模型 allowlist,应通过服务端管理配置,而不是只把 JSON 文件放在开发者电脑上。1

6. 一套可落地的调参顺序

把每次失败先归类,再动旋钮:
  1. 先看上下文:文件、工具、CLAUDE.md 和任务边界是否完整。上下文缺失时,换模型通常只是更昂贵地猜。
  2. 再看能力:确实是陌生领域、隐蔽 bug 或架构决策,提升 model
  3. 再看投入:漏读文件、没验证、过早收工,提升 effort
  4. 再加护栏:脚本加 max-budget-usdmax-turns;SDK 加 max_budget_usdmax_turns
  5. 最后做可用性兜底:为服务端过载配置 fallback,但不要把它当质量路由。
  6. 团队统一策略:用 availableModels + enforceAvailableModels 做真正的模型边界;需要版本复现时固定完整模型名。
最值得记住的一句是:
model 管能力,effort 管投入,fallback 管可用性,budget 管止损。
把四条轴分开,Claude Code 才能从「凭感觉换模型」变成可解释、可审计、可控制的工程系统。

官方资料

相似内容

  • 登录后可发表评论。
More from this channel