
Claude Code SDK #45:Model Configuration 全解——model × effort × fallback × budget,把质量和成本分开调
把 Claude Code 的 model、effort、fallback 与预算上限拆成四条控制轴,配合 CLI 和 Python Agent SDK 示例,帮助开发者按问题类型调质量、成本与可靠性。
先给结论:四个旋钮,管的是四件事
Claude Code 里最容易调错的,不是 prompt,而是模型配置。
结果不理想时,很多人直接换更大的模型;速度变慢时,又把模型降下来。问题在于:
model 和 effort 根本不是同一个旋钮。model决定「谁来做」:能力上限、知识范围,以及每个 token 的单价。effort决定「愿意做多少」:会读多少文件、调用多少工具、验证多少次、走多少步。fallback决定「主模型不可用时怎么办」:它是可用性策略,不是质量调参。budget/max_turns决定「最多允许跑到哪里」:它们是硬护栏,不是模型路由。
这四件事混在一起,团队就会出现两种典型浪费:小任务用大模型反复验证;大任务用小模型烧很多轮,最后仍然失败。
11. model 与 effort:能力和投入不是一回事
官方给出的区分很实用:模型选择是在不同的固定权重之间切换;effort 则控制 Claude 为当前任务投入多少工作。高 effort 不只是「多想一会儿」,还可能意味着读取更多文件、执行更多工具调用和做更多验证。2
可以用两个故障问题来定位:
- Claude 已经拿到了相关上下文,也认真尝试了,但仍然在陌生领域或复杂架构上判断错误?这是能力问题,优先换更强的
model。 - Claude 漏读文件、没跑测试、改到一半就停?这是投入问题,优先提高
effort。
当前文档列出的常用模型别名包括
sonnet、opus、haiku、fable,以及把计划阶段和执行阶段分开的 opusplan。别名会随 provider 和版本变化;需要可复现构建时,应该固定完整模型名,而不是把 sonnet 当成永久不变的版本号。1# 复杂、含糊、需要架构判断的任务
claude --model opus --effort high "定位这个并发 bug,并给出可验证的修复"
# 机械、边界清楚的任务
claude --model sonnet --effort medium "给所有公开函数补上缺失的类型注解"effort 的几个边界
effort 可用级别取决于当前模型,常见值是 low、medium、high、xhigh 和 max。如果当前模型不支持你指定的级别,Claude Code 会回退到该模型支持的、且不高于目标级别的最高等级。ultracode 需要单独理解:它不是普通的 effort 等级,而是一个 Claude Code 会话设置,使用 xhigh,同时打开动态工作流能力。它只适用于当前会话,不能当作持久化的 effortLevel 值写进 settings。12. 配置优先级:启动参数最适合做实验,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 模型不在
availableModelsallowlist 中,它会在读取链时被丢弃,不会等到故障发生后才发现不可用。
所以,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 选择其他模型;只写 availableModels,Default 仍可能解析到账户级默认模型。1云端 Web、Desktop 和本地 CLI 对 settings 的到达路径也不同。官方文档指出,Anthropic 管理的云端 VM 不会自动读取你设备上的 managed settings;企业要让云端会话遵守模型 allowlist,应通过服务端管理配置,而不是只把 JSON 文件放在开发者电脑上。1
6. 一套可落地的调参顺序
把每次失败先归类,再动旋钮:
- 先看上下文:文件、工具、CLAUDE.md 和任务边界是否完整。上下文缺失时,换模型通常只是更昂贵地猜。
- 再看能力:确实是陌生领域、隐蔽 bug 或架构决策,提升
model。 - 再看投入:漏读文件、没验证、过早收工,提升
effort。 - 再加护栏:脚本加
max-budget-usd和max-turns;SDK 加max_budget_usd和max_turns。 - 最后做可用性兜底:为服务端过载配置 fallback,但不要把它当质量路由。
- 团队统一策略:用
availableModels+enforceAvailableModels做真正的模型边界;需要版本复现时固定完整模型名。
最值得记住的一句是:
model管能力,effort管投入,fallback管可用性,budget管止损。
把四条轴分开,Claude Code 才能从「凭感觉换模型」变成可解释、可审计、可控制的工程系统。
官方资料
Contenido relacionado
- Inicia sesión para comentar.
More from this channel›
- Claude Code SDK #46:ClaudeSDKClient 全解:query、receive_response、interrupt,把 Agent 变成可控多轮会话
- Claude Code SDK #44:LLM Gateway 全解——ANTHROPIC_BASE_URL × apiKeyHelper × provider switching,把模型请求收口到团队网关
- Claude Code SDK #43:Corporate Proxy 全解——HTTPS_PROXY × CA store × mTLS,让 Claude Code 穿过企业内网
- Claude Code SDK #42:Hosting 全解——subprocess × SessionStore × tenant isolation,把 Agent 跑进生产环境
- Claude Code SDK #41:GitHub Actions 全解——@claude × workflow × GitHub App,把 Issue 变成可审查 PR