同时开几个 Claude Code 窗口,为什么它们会互相改设置
effort 会写盘、model 不会。一次随手拖动滑杆,所有正在跑的窗口都被默默改掉。这是一次事故复盘,附四种让会话彼此独立的做法。
- 出处
- Model configuration — Adjust effort level
- 来自
- Anthropic 官方文档
- 查证日期
- 2026/08/04
同时开三四个 Claude Code 窗口跑不同任务,是稍微熟练之后的常态:一个窗口整理访谈稿,一个窗口改报告,一个窗口跑数据。
问题是这几个窗口并不是完全独立的。
现象
新开一个窗口,预期是账户默认的 Opus 5 + xhigh,实际显示 Opus 5 + low。没有人动过全局配置——上一次只是在另一个窗口里用 /model 切了模型,顺手把 effort 滑杆拖到了 low。
三件事同时发生,而且没有任何提示:
- 新窗口的 effort 没有回到默认
- 配置文件里的
effortLevel被改成了low - 正在运行的其他窗口,也跟着变了
原因:effort 写盘,model 不写盘
这两个设置的持久化行为不一样,而这正是所有困惑的来源。
model 用 /model 切换,默认只对当前会话生效,不写进配置文件。
effort 不一样。官方文档的原话是:low、medium、high、xhigh 这四档,在交互式会话里设置时会跨会话持久化,写进 ~/.claude/settings.json 的 effortLevel。只有 max 是会话级的(除非通过环境变量设置)。
引爆点在 /model 面板里。官方文档明确写了这个设计:
In
/model: use left/right arrow keys to adjust the effort slider when selecting a model
也就是说,你打开 /model 本来只想切模型,但左右箭头调的是 effort,回车之后 effort 就被写盘了。这不是 bug,是文档里写着的行为——只是没人会预期「切模型」这个动作会改全局配置。
因为 ~/.claude/settings.json 全局唯一,写盘那一刻:
- 正在运行的其他会话被实时改掉
- 之后新开的会话读到的也是新值
- 「最后一次修改胜出」,没有任何会话隔离
model 之所以没事,只是因为它压根没写盘。
哪些模型支持哪些档位
设置之前先确认目标模型支持什么。官方当前的对照表:
| 模型 | 可用档位 |
|---|---|
| Fable 5 | low medium high xhigh max |
| Opus 5、Sonnet 5、Opus 4.8、Opus 4.7 | low medium high xhigh max |
| Opus 4.6、Sonnet 4.6 | low medium high max |
没列在表里的模型不支持 effort——Haiku 就不支持。
设了不支持的档位不会报错,而是向下取最近的可用档:在 Opus 4.6 上设 xhigh,实际按 high 跑。
默认档位是 high,Opus 4.7 例外,它默认 xhigh。
四种让会话彼此独立的做法
核心思路一句话:在启动时决定,不要进去之后改。
一、启动参数(推荐)
--model 和 --effort 都只对当前会话生效,不写盘。
claude --model opus --effort xhigh
claude --model sonnet --effort high
claude --model haiku
模型别名不用记版本号:opus 指向最新的 Opus,sonnet 指向最新的 Sonnet,haiku 指向 Haiku。另外还有 fable(最难最长的任务)、best(有 Fable 5 权限就用它,否则用最新 Opus)、default(清除覆盖,回到账户推荐值)。
二、环境变量(固定某个终端的偏好)
在某个终端窗口里 export,只对这个 shell 生效,优先级高于配置文件。
export CLAUDE_CODE_EFFORT_LEVEL=xhigh
claude
注意一个例外:max 通过环境变量设置时不是会话级的,这跟在会话里设 max 的行为不同。
三、一次性内联
最临时的写法,只影响这一次启动:
CLAUDE_CODE_EFFORT_LEVEL=low claude
四、给常用组合起别名(日常最省事)
写进 ~/.zshrc(macOS 默认)或 ~/.bashrc,之后开窗口直接敲别名:
alias claude-deep='claude --model opus --effort xhigh'
alias claude-fast='claude --model sonnet --effort low'
改完执行 source ~/.zshrc 生效。以后每个窗口都是彻底独立的。
进会话之后的纪律
| 操作 | 会不会影响其他窗口 | 用不用 |
|---|---|---|
/effort <档位> |
写盘 → 全局生效 | 避免 |
/model 打开面板 + 拖滑杆 |
写盘 → 全局生效 | 避免 |
/model sonnet 带参数 |
不开面板,仅当前会话 | 可以 |
CLAUDE_CODE_EFFORT_LEVEL |
不写盘,仅当前 shell | 推荐 |
--model / --effort 启动参数 |
不写盘,仅当前会话 | 推荐 |
优先级顺序
设置从多个地方来,冲突时的顺序是(官方文档):
环境变量 > 你配置的档位 > 模型默认值
另外,Skill 和 subagent 的 frontmatter 里也能设 effort,它在那个 Skill 运行期间覆盖会话档位,但盖不过环境变量。
一句话总则
要让多个 Claude Code 窗口互不干扰,所有 model 和 effort 的配置都在启动时用命令行参数或环境变量决定;进会话之后只用 /model sonnet 这种带参数的形式临时切换,不碰 /effort,也不拖 /model 面板里的滑杆。
怎么确认当前档位
不用打开 /model 也能看:会话头部会在模型名旁边显示,比如 “with low effort”。启动时和切换时,底栏也会短暂闪一下当前档位。
养成一个习惯:开始一个重要任务之前,先扫一眼头部那行字。 两秒钟,能省掉一次「为什么这次它这么敷衍」的返工。