Files
team/memory/claude-code-model-config.md
T
2026-04-19 21:47:08 +08:00

38 lines
2.8 KiB
Markdown

---
name: Claude Code 模型配置传播
description: runcc.sh/cc4/cc5 模型切换机制,tmux 三层传播方案,settings.json 优先级问题
type: feedback
originSessionId: 3abc1791-7202-45cf-85af-98b1f235a3c9
---
## 模型配置传播机制
**规则**: Claude Code 的 `settings.json` `env` 段优先级高于 shell `export`,会将同名环境变量覆盖。因此模型配置变量(`ANTHROPIC_DEFAULT_*_MODEL`)不能放在 `settings.json` 中,必须通过 `runcc.sh` 启动时删除 + shell export 设置。
**Why**: 用户发现运行 `cc4` 时状态栏仍显示 `glm-5.1`,因为 `settings.json` 中的 `ANTHROPIC_DEFAULT_OPUS_MODEL: "glm-5.1"` 覆盖了 shell 的 `export ANTHROPIC_DEFAULT_OPUS_MODEL="glm-4.7"`
**How to apply**: `runcc.sh` 每次启动时先 `jq 'del(.env.ANTHROPIC_DEFAULT_*)'` 清理 settings.json,再 export 设置,再写入 tmux 三层传播。
## tmux 三层传播
| 层级 | 机制 | 覆盖范围 | 隔离能力 |
|------|------|----------|----------|
| 1 | shell `export` | 当前进程 | 进程级 |
| 2 | `tmux setenv -t <session>` | 该 session 内新 pane | session 级 |
| 3 | `tmux set-option -p @anthropic_*` + `.bashrc` 读取 | 同 session 不同 pane | pane 级 |
## 关键文件
- `runcc.sh` / `templates/runcc.sh`: 删除 settings.json 模型变量 → shell export → tmux 三层传播
- `templates/bashrc.tail.sh`: 新 shell 启动时读取 pane option(容器重建时自动生效)
- `.claude/hooks/agent-pane-track.sh`: 将 PM pane 的模型 option 复制到新增 Agent pane
## 经验教训
1. **settings.json env 优先级陷阱**: Claude Code 读取 settings.json env 并覆盖进程环境变量,即使 shell 已 export。模型切换变量必须从 settings.json 中删除。
2. **tmux 环境继承限制**: tmux 新 pane 从 tmux server 继承环境,不从父 shell 继承。需用 `tmux setenv` / `set-option` 显式传播。
3. **同 session 并发隔离**: `tmux setenv -t` 是 session 级的,同 session 不同 pane 无法隔离。用 pane option (per-pane) 实现隔离,`.bashrc` 读取后覆盖 session 级值。
4. **Agent Team 子 pane**: 新 pane 不继承父 pane 的 pane option,需在 hook 中显式复制。
5. **模板文件同步**: 修改 `runcc.sh``.bashrc` 时,必须同时更新 `templates/` 下的模板文件,确保容器重建后一致。
6. **GLM 模型代码必须完整前缀**: `4.5-air` 无效,正确代码是 `glm-4.5-air`。Explore agent 默认使用 haiku 层级,haiku 模型代码错误导致 Agent tool 报 1211。可用 `curl https://open.bigmodel.cn/api/paas/v4/models` 查询有效模型列表。
7. **settings.json env 的双面性**: 虽然它会覆盖 shell export(需要删除),但在已运行的会话中可临时写入正确值来修复子 agent 模型问题(利用其覆盖优先级),修复后再删除。