工具大全
亲手实测作者:Coocon2026年8月6日415 次阅读约 3 分钟阅读

Claude Code 到底在用哪个模型?settings.json、环境变量、--model 的优先级实测

为什么要较真这件事

模型配置错了不报错——会话照常跑,只是跑在另一个模型上。GitHub issue #82466 里的用户在 ~/.claude/settings.json 配了 Fable,多智能体任务静默跑了一整天 Sonnet,发现时全部作废重做。

官方文档分别介绍了 settings.json 的 model 字段、ANTHROPIC_MODEL 环境变量、--model 参数和 /model 命令,但没有一张表写清同时存在时谁赢。下面是实测结果。

实测方法:用 modelUsage 拿铁证

无头模式加 --output-format json,返回结果里的 modelUsage 键就是实际计费的模型 ID——比任何界面显示、模型自述都可靠(模型自述"我是谁"可能受系统提示影响,不能作数):

claude -p "reply ok" --output-format json | python3 -c \
  "import json,sys; print(list(json.load(sys.stdin)['modelUsage'].keys()))"

优先级实测矩阵

环境:macOS + Claude Code v2.1.220,每一行都是干净目录里的独立实验,证据取 modelUsage:

实验配置 实际使用 结论
项目 .claude/settings.json 配 haiku,无其它配置 haiku ✅ 项目级 settings 生效
settings 配 claude-fable-5[1m](1M 上下文后缀) claude-fable-5[1m] ✅ 带 [1m] 后缀的写法同样生效
settings 配 haiku + 环境变量 ANTHROPIC_MODEL=sonnet sonnet 环境变量 覆盖 settings
settings 配 haiku + 参数 --model sonnet sonnet 参数 覆盖 settings
环境变量 haiku + 参数 --model sonnet sonnet 参数 覆盖 环境变量

得出的优先级链(高 → 低):

--model 参数  >  ANTHROPIC_MODEL 环境变量  >  项目 settings.json  >  内置默认

这符合"越接近本次调用的配置越优先"的 Unix 直觉,但在此之前它只是直觉——现在是证据。

关于那个 Windows issue

issue #82466 报告的是另一层现象:用户级 ~/.claude/settings.json(注意不是项目级)在 Windows 11 + PowerShell 下被忽略,且交互会话里 /model <精确ID> 返回 "Kept model as X" 拒绝切换。报告者排查了 env、项目覆盖、lastModel 等所有已知落盘位置均无异常,怀疑存在未落盘的客户端 UI 状态覆盖。

我们在 macOS 上无法复现(如上表,配置层层生效),截稿时该 issue 无官方回应。如果你在 Windows 上遇到模型不对:先别怀疑自己的配置写错了,用上面的 modelUsage 方法取证,然后到该 issue 下补充你的环境信息——多一份跨环境报告,修复就近一步。

实用建议

  • CI / 脚本:显式传 --model,它优先级最高、作用域最小,不受任何持久化状态干扰
  • 项目统一默认:写项目 .claude/settings.json(可入库共享),实测可靠
  • 验证手段:任何"感觉模型不对"的时刻,跑一次 --output-format json 看 modelUsage;交互会话里则运行不带参数的 /model 打开选择器看高亮项——issue 报告者的经验是文字提示 "Kept model as X" 可能误导,选择器高亮才是当前真实状态
  • 计费敏感场景:modelUsage 同时带 token 数与成本,顺手可核对账单

适用边界

  • 实测环境见文首适用范围卡;矩阵覆盖无头模式(-p)下的项目级 settings / env / flag 三层,用户级 ~/.claude/settings.json 与交互模式 /model 切换未在本文实测范围内(前者不便在生产机上安全变更,后者见 issue 讨论)
  • Bedrock / Vertex 通道有各自的模型 ID 体系与 env 变量,本文结论仅针对直连 Anthropic API/订阅
  • 优先级属长期稳定的设计语义,预期跨版本有效;但 Windows issue 修复后本文会更新状态

这类实测,每周六汇总一封

订阅码农早餐:每天 8:00 一封 AI 编程早报,每周六另附本周 Claude Code / Codex / 本地模型的实测和踩坑汇总。

相关文章

Claude Code 上下文太长怎么办:Prompt is too long 会自动压缩,中转站 / DeepSeek 的 maximum context length 却不会(实测)

Claude Code 靠报错文案判断「上下文太长」:后端说 prompt is too long 或 input is too long for requested model,它会自动压缩对话后重发,用户无感;DeepSeek 和 OpenAI 风格中转返回的 This model's maximum context length is …,它不认识,直接报 API Error: 400,每轮都失败。手动 /compact 有效;更好的办法是用 CLAUDE_CODE_MAX_CONTEXT_TOKENS(非 claude- 模型 ID)或 CLAUDE_CODE_AUTO_COMPACT_WINDOW(claude- 模型 ID)告诉它真实上限,让它提前压缩。Claude Code 2.1.285 + 本地 stub 实测。

claude-codedeepseek+6
pitfalls2026年10月5日8 min
93

Claude Code 一直卡住、转圈没反应怎么办:后端不回时它要等 6 分钟,重试满 10 次可能卡一个多小时(实测)

Claude Code 转圈不动、或者停在 Retrying in 0s,多半是后端没有回数据。实测 2.1.285(API key + ANTHROPIC_BASE_URL):后端不回响应头时每次等 6 分钟(360 秒)才判超时,把 API_TIMEOUT_MS 调到 60 万、90 万也不变,只能调小;默认重试 10 次,总共可能卡一个多小时。中转站如果把回复缓冲到生成完才返回,超过 6 分钟的回复永远拿不到。按 Esc 可以随时中断。全部在本地 stub 上实测。

claude-code中转站+6
pitfalls2026年10月5日10 min
93

Claude Code 429 怎么办:Request rejected (429) 原文、会重试多久、retry-after 超过 60 秒直接放弃(实测)

Claude Code 遇到 429 会先自动重试,最多 10 次、约 3 分钟。retry-after 不超过 60 秒时会等满再试(实测 10 秒、60 秒都恢复成功),61 秒及以上一次都不重试,立刻报 API Error: Request rejected (429)。中转站(new-api)的中文限流提示会原样显示,空 body 显示 status code (no body)。交互模式下每句话会同时发 2 个请求,限流额度消耗也是 2 倍。全部在本地 stub 上实测,Claude Code 2.1.285。

claude-code中转站+5
pitfalls2026年10月4日9 min
90
Claude Code MCP 显示 Connected 却 0 个工具:Invalid result for tools/list(ttlMs / cacheScope)实测与修法

Claude Code MCP 显示 Connected 却 0 个工具:Invalid result for tools/list(ttlMs / cacheScope)实测与修法

MCP server 显示已连接、工具数却是 0,日志里是 Invalid result for tools/list,ttlMs 与 cacheScope 校验失败。用自写 stub 在 Claude Code 2.1.280 / 2.1.285 / 2.1.288 上复现:根因不是「多了未知字段被严格校验拒掉」,而是 server 协商到 MCP 2026-07-28 后漏了这一版的必填字段(resultType、ttlMs、cacheScope),多加未知字段反而能正常通过。stdio 是否走新协议由一个默认关闭的远程开关决定,所以同一个版本有人中招、有人没事;2.1.280 打开协商后同样失败。用户侧设 MCP_PROTOCOL_NEGOTIATION=legacy(settings.json 的 env 也行)立即恢复,server 侧补上三个字段即可。

mcpclaude-code+4
pitfalls2026年10月3日7 min
75