---
title: "按订阅档位调 Claude Code 配置"
url: "https://turingblog.org/notes/patterns/claude-code-config-by-plan"
date: 2026-11-11
tags: ["Claude Code","Agent","配置"]
description: "主会话用中档模型的默认 effort，搜索和读日志交给小模型子代理，会话到了自然断点就换新的。"
insight: "主会话用中档模型的默认 effort，搜索和读日志交给小模型子代理，会话到了自然断点就换新的。"
problem: "配置是在几代模型之间攒下来的：全局 effort 还停在旧模型的习惯，子代理默认继承主会话的模型，在 Pro 的额度下不划算。"
---

我用的是 Pro 订阅，平时主要用 Opus 5.5 的 medium effort。Fable 5.2 上线后我用它体验了一次，顺便对着 Anthropic 那篇[选模型的文章](https://claude.dev/blog/which-claude-model-should-you-build-with/)，把 `~/.claude` 下的设置、子代理和 CLAUDE.md 过了一遍。下面是改动和理由，配置可以直接抄。

## 主会话用 Opus 和默认 effort

文章的建议是日常工作从 Opus 5.5 的默认 effort（medium）开始，这和我平时的用法一致。Fable 5.2 每个 token 的价格是 Opus 的两倍，我把它留给大型重构、迁移和架构规划。

`settings.json` 里还留着一行全局的 `effortLevel: "high"`，这是 Opus 5 时期写下的。官方文档说 Opus 5.5 的 medium 已经相当于 Opus 5 的 high，所以我删掉了这一行，让每个模型用自己的默认值。

任务做不好时，我按文章给的顺序处理：先确认模型有办法自己验证结果，比如跑测试或构建；再把 effort 升一档；最后才换更大的模型。

## 便宜的活交给小模型子代理

子代理在自己的上下文里跑，按它所用模型的价格计费。没有指定模型的子代理会继承主会话的模型，内置的 Explore 也跟着主会话走。我做了两处改动。

第一处是给没指定模型的子代理设一个默认值：

```jsonc
// ~/.claude/settings.json
{
  "env": {
    "CLAUDE_CODE_SUBAGENT_MODEL": "sonnet"
  }
}
```

第二处是定义一个同名的 Explore 覆盖内置版本，让搜索跑在 Haiku 上：

```markdown
<!-- ~/.claude/agents/Explore.md -->
---
name: Explore
description: 只读搜索代理，用于大范围查找文件和代码位置，只带回结论。
disallowedTools: Edit, Write, NotebookEdit, Agent
model: haiku
omitClaudeMd: true
---
```

分工的依据是出错的代价。找文件、读日志、汇总文档这类活，结果错了很容易看出来，可以交给 Haiku。需要判断的决定都留在主会话。

| 子代理 | 模型 | effort | 做什么 |
| --- | --- | --- | --- |
| Explore | haiku | 默认 | 在代码库里搜索定位 |
| researcher | haiku | medium | 查文档和网页，只带回结论 |
| coder | sonnet | medium | 按已定的方案实现 |
| reviewer | opus | medium | 对照计划审查改动 |

## 查资料的代理要真的只读

我的 researcher 原来只禁了 `Edit` 和 `Write`，「不执行有副作用的命令」只写在提示词里。它能联网，也能跑 Bash，网页上一句「运行这条命令」就可能被照做。

现在 `disallowedTools` 里加上了 `Bash` 和 `PowerShell`，本地文件它用 Read、Grep、Glob 读。让它去找技能、插件或 MCP 服务器时，它只汇报来源、维护者、最近更新时间和所需权限，装不装由我决定。

## 运行中的会话不读新配置

改完 chrome-devtools-mcp 插件的启动参数后，我在当前会话里重启了它的服务进程，拉起来的仍然是旧参数。插件配置在会话启动时读入，之后不再重读。要在不新开会话的前提下验证，只能按新参数单独启动一次服务，向它发 MCP 请求看结果。

这次给它加了两个参数。`chrome-devtools-mcp@latest` 让 npx 每次取最新版。`--ignoreDefaultChromeArg=about:blank` 去掉 Puppeteer 启动 Chrome 时默认追加的空白页。

## 什么时候结束一个会话

每一轮请求都会重发整段对话。平时便宜是因为前面的内容命中了缓存，缓存读取的价格约为正常输入的二十分之一。缓存过期后再发消息，整段对话要重新写入缓存，这一轮会很贵。文章给的数字是：15 万 token 的上下文，每轮缓存读取约 0.03 美元；2 万 token 时约 0.004 美元。

我以前记的教训是「任务结束后不要再发消息」，这个结论偏严了。刚做完就追问是便宜的，也应该留在原会话。满足下面任一条我才新开：

- 新请求不依赖这个会话里查到或决定的东西。
- 交付物已完成并验证，结论已写进代码、文档或记忆。
- 隔了很久再回来，而且上下文已经很大。
- 要换模型。缓存按模型分开，换模型等于整段重写。
- 模型开始重复做过的事，或者引用已经过时的结论。

每个任务收尾时，我把现状和下一步写进项目文档，新会话读一下就能接上。

## 边界与取舍

- Haiku 读错搜索结果时，主模型会打开错的文件，白花一轮 token。仓库很大或命名混乱时，把 Explore 换成 Sonnet 更稳。
- `@latest` 不锁版本，新版发布后会直接运行在带登录态的调试浏览器上。
- 这套配置是按 Pro 的额度定的。额度宽裕时，让子代理继承主模型也说得过去。
- `/doctor` 会检查设置和 CLAUDE.md 并给出裁剪建议，`/doctor prompt-audit` 会找出为旧模型写的指令和引用了不存在文件的内容。两者都要手动运行。
