1. 长任务跑到一半,Claude Code 为什么突然“失忆”
如果你用 Claude Code 做过超过 30 轮的重构任务,大概率遇到过这个场景:前面十几轮它还能准确引用你确认过的接口命名,到了第 40 轮,它开始把services/auth.js写成utils/auth.js,或者干脆问你“我们刚才在改哪个模块”。这不是模型变笨了,而是上下文窗口被填满了。
Claude Code 的默认上下文窗口是 200K token,可以扩展到 1M。听起来很大,但实际消耗速度远超直觉。一次中等规模的重构任务,Claude 需要读取 20 到 30 个相关文件,每个文件按 2000 token 算就是 4 到 6 万 token;运行几次npm test或cargo build,命令输出又是几千 token;再加上你和它之间 20 到 30 轮对话,每轮都携带历史消息重发。200K 的窗口在这种场景下被填满只是时间问题。
更麻烦的是,上下文膨胀带来的不是“突然崩溃”,而是“渐进式退化”。在窗口使用率达到 60% 到 70% 时,模型对早期指令的注意力就开始下降;到 85% 以上,它可能开始重复之前说过的话、做出前后矛盾的决策。等到你发现它“失忆”时,往往已经浪费了好几轮交互。
这篇文章要解决的问题很具体:在 TaoToken 统一 Key/API 通道下,如何通过 CLAUDE.md 上下文分层配置和压缩触发规则,让 Claude Code 在长任务中稳定保留重点。我会给出可复制的配置片段、验证请求的成功结果,以及我实际踩过的报错排查路径。适合需要连续编码数小时、任务跨越多个子模块的开发者。
核心检索词先明确:Claude Code 上下文管理,指的是通过配置和命令控制上下文窗口的占用结构,让关键信息在长任务中不被压缩或遗忘。它适合所有用 Claude Code 做持续开发的人,尤其是任务周期超过 1 小时、涉及多文件修改的场景。
2. TaoToken 前置:统一 Key 与 API 通道的配置
在讲上下文管理之前,需要先把接入层配好。我用 TaoToken 作为统一通道,原因是它把 Claude Code 的 API 调用收敛到一个 Base URL 和一个 Key 上,省去了多环境切换的麻烦。下面是我实际使用的配置路径和参数。
2.1 获取 API Key 与确认 Base URL
首先在 TaoToken 控制台创建 API Key。地址是https://taotoken.net/api-keys,登录后点击创建,复制生成的 Key。这个 Key 后面会写入 Claude Code 的配置文件。
Base URL 固定为https://taotoken.net/api,注意不要加 UTM 参数,直接使用这个地址作为 API 端点。
2.2 Claude Code 的 settings.json 配置片段
Claude Code 读取的配置文件位于~/.claude/settings.json。如果你之前没有这个文件,手动创建即可。以下是我实测可用的配置,路径和字段名与 Claude Code 当前版本一致:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "Read", "Edit", "Bash(npm test)", "Bash(git diff)" ] } }这里三个字段必须同时存在:ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,ANTHROPIC_API_KEY填入你创建的 Key,ANTHROPIC_MODEL指定模型 ID。如果你用的是 Claude Code 的 coding-plan 模式,模型 ID 可以换成对应的 plan 模型标识。
2.3 验证配置是否生效
配置写完后,在终端执行:
claude --version然后启动一个会话,输入/status,检查输出中的 API 端点是否显示为https://taotoken.net/api。如果显示的是默认的 Anthropic 地址,说明 settings.json 没有被正确加载,检查文件路径和 JSON 格式。
另一个验证方式是直接发一个最小请求:
claude -p "回复 OK"如果返回OK,说明 Key 和 Base URL 都通了。如果返回 401,说明 Key 无效或未正确写入;如果返回连接超时,检查网络是否能访问taotoken.net。
2.4 为什么上下文管理要在接入层之后做
上下文管理的所有配置——CLAUDE.md、压缩规则、子 Agent——都依赖一个稳定的 API 通道。如果 Base URL 或 Key 配置有问题,Claude Code 会在请求阶段就失败,根本走不到上下文压缩的逻辑。所以先把接入层跑通,再调上下文策略,顺序不能反。
另外,TaoToken 的 coding-plan 模式对长任务更友好,因为它的计费方式适合连续多轮调用。如果你打算做超过 1 小时的重构任务,建议在控制台确认当前 Key 绑定的 plan 类型。
3. 可复制配置:CLAUDE.md 分层与压缩触发规则
这一节是全文的核心。我会给出一个完整的 CLAUDE.md 分层模板,以及压缩触发规则的具体配置。你可以直接复制到项目根目录的CLAUDE.md文件中。
3.1 CLAUDE.md 的三层结构
CLAUDE.md 是项目级上下文文件,每次请求都会加载。它的内容不会被自动压缩,所以适合放“必须始终保留”的信息。但如果写得太长,每个请求都背着它,反而加速上下文消耗。我的做法是分三层:
第一层是项目级 CLAUDE.md,放在项目根目录,只放架构原则、代码规范和常用命令。控制在 500 字以内。
第二层是模块级 CLAUDE.md,放在各子目录下,比如services/CLAUDE.md、routes/CLAUDE.md。Claude Code 在读取该目录文件时会自动加载对应的模块级配置。
第三层是任务级上下文,不写入 CLAUDE.md,而是通过会话中的/compact保留指令动态指定。
以下是我在一个 Node.js 项目中实际使用的根目录 CLAUDE.md:
# 项目上下文 ## 架构原则 - 认证逻辑统一收敛到 services/auth.js,禁止在 routes 中直接写 JWT 验证 - 所有数据库操作必须通过 repositories 层,禁止在 service 中直接调用 ORM - 错误处理统一使用 AppError 类,禁止裸抛 Error ## 代码规范 - 使用 ES Module,禁止 require - 函数参数超过 3 个时使用对象解构 - 测试文件命名 *.test.js,与源文件同目录 ## 常用命令 - 运行测试:npm test - 运行单个测试:npm test -- --grep "auth" - 构建:npm run build ## 压缩时必须保留 - 当前任务的架构决策(如接口命名、模块划分) - 已确认的 API 格式和数据结构 - 未完成的 TODO 列表注意最后一段“压缩时必须保留”,这是给/compact的提示词,告诉模型在压缩时优先保留这些内容。
3.2 压缩触发规则
Claude Code 默认在上下文使用率达到约 95% 时自动压缩。但前面说过,到 95% 时模型性能早已下降。我的做法是手动设置更早的触发点。
Claude Code 支持通过 settings.json 配置自动压缩阈值。以下是我使用的配置:
{ "context": { "autoCompactThreshold": 0.7, "microCompactEnabled": true, "preserveOnCompact": [ "架构决策", "API 格式", "TODO 列表" ] } }autoCompactThreshold设为 0.7,意思是上下文使用率达到 70% 时触发自动压缩。microCompactEnabled开启微压缩,让规则驱动的清理先跑一轮,减少大模型压缩的调用次数。preserveOnCompact指定压缩时必须保留的内容类别。
这个配置需要和 CLAUDE.md 中的“压缩时必须保留”配合使用。settings.json 里的preserveOnCompact是全局规则,CLAUDE.md 里的是项目级规则,两者会合并。
3.3 手动压缩的时机与命令
除了自动压缩,手动压缩在长任务中更可控。我通常在三个时机执行/compact:
第一个时机是完成分析阶段、进入实施阶段之前。比如你已经让 Claude 读完了所有相关文件、确认了重构方案,接下来要开始改代码。这时执行:
/compact 保留认证模块的架构决策和已确认的 API 格式,丢弃文件读取的原始内容第二个时机是完成一个子任务、开始下一个子任务之前。比如认证模块重构完了,接下来要改测试。这时压缩掉重构过程中的调试细节。
第三个时机是上下文使用率达到 50% 时主动压缩,而不是等到 70%。我试过在 50% 时压缩,压缩后的上下文质量明显比 70% 时好,因为模型在低负载下的摘要能力更强。
3.4 子 Agent 的隔离配置
子 Agent 是另一个重要的上下文管理工具。每个子 Agent 以全新对话开始,不加载主会话的历史消息,只加载自己的系统提示和项目级 CLAUDE.md。这意味着子 Agent 不会被主会话的上下文包袱拖累。
在 Claude Code 中,你可以通过 Task 工具启动子 Agent。以下是一个实际使用的例子:
# 在主会话中 > 使用子 Agent 分析 services/ 目录下所有文件的依赖关系,输出一个依赖图Claude Code 会启动一个子 Agent,该 Agent 独立读取services/目录下的文件,分析依赖关系,返回结果给主会话。主会话只接收最终结果,不接收子 Agent 读取的原始文件内容。这样主会话的上下文消耗只有子 Agent 返回的摘要,而不是几十个文件的全文。
子 Agent 适合处理可以独立完成的子任务:生成某个模块的测试、分析某个子目录的依赖、排查某个独立 bug。不适合需要主会话历史上下文的任务。
3.5 完整配置清单
把以上配置汇总,你需要创建或修改的文件有三个:
~/.claude/settings.json:写入 API 配置和压缩阈值。
项目根目录CLAUDE.md:写入架构原则、代码规范、常用命令、压缩保留项。
各模块目录CLAUDE.md:写入模块特有的约束和接口说明。
这三个文件配好后,Claude Code 在长任务中的上下文行为就完全可控了。接下来验证配置是否生效。
4. 验证请求与成功结果:长任务前后重点保留的检查动作
配置写完后,需要实际跑一个长任务来验证。我设计了一个最小验证流程,你可以在自己的项目里复现。
4.1 验证前的准备
找一个中等规模的重构任务,比如把一个散落在多个文件中的工具函数收敛到一个模块。任务需要满足两个条件:涉及至少 5 个文件的读取,以及至少 10 轮对话交互。这样才能触发上下文膨胀。
启动 Claude Code 会话,输入任务描述:
我需要重构 utils 目录下的日期处理函数。当前 dateFormat、dateParse、dateDiff 散落在 utils/date.js、utils/format.js 和 helpers/time.js 中。请先分析这三个文件,然后提出一个收敛方案,统一到 utils/date.js。4.2 验证上下文监控
在 Claude 读取文件的过程中,执行/context命令。你会看到类似以下的输出:
Context Usage: 45,230 / 200,000 tokens (22.6%) - Conversation: 12,400 tokens - File reads: 28,500 tokens - CLAUDE.md: 1,200 tokens - System prompt: 3,130 tokens这个输出按来源分类展示消耗。重点看 File reads 的占比。如果它超过 50%,说明文件读取是主要消耗源,需要考虑用子 Agent 隔离。
4.3 验证压缩触发
继续对话,让 Claude 提出方案并迭代。当上下文使用率达到 70% 时,检查是否触发了自动压缩。你可以通过/context观察使用率是否突然下降。
如果配置生效,你会看到使用率从 70% 左右回落到 30% 到 40%,同时对话历史被摘要替换。压缩后,Claude 应该仍然记得你确认过的架构决策,比如“日期格式化统一用 dayjs,不用 moment”。
4.4 验证重点保留
这是最关键的验证动作。在压缩后,问 Claude 一个需要引用早期决策的问题:
我们之前确认的日期格式化库是哪个?为什么选它?如果 Claude 能准确回答“dayjs,因为 moment 体积太大且已停止维护”,说明压缩保留了关键决策。如果它回答“我不记得我们讨论过这个”,说明压缩丢失了重点,需要调整preserveOnCompact配置。
4.5 验证子 Agent 隔离
在另一个子任务中,让 Claude 启动子 Agent:
使用子 Agent 分析 helpers/ 目录下所有文件的导出函数,列出每个函数的签名和用途。子 Agent 完成后,主会话的/context应该只增加了子 Agent 返回的摘要 token,而不是 helpers/ 目录下所有文件的全文。你可以对比子 Agent 执行前后的 File reads 数值来确认。
4.6 成功结果的标准
一个配置正确的长任务会话,应该满足以下指标:
上下文使用率在任务全程不超过 75%,因为 70% 时已经触发压缩。压缩后关键决策保留率 100%,即你问早期确认的决策,Claude 能准确回答。子 Agent 执行后主会话上下文增长不超过 2000 token。任务结束时,Claude 能准确列出所有已完成的修改和未完成的 TODO。
如果这些指标都达标,说明你的 CLAUDE.md 分层配置和压缩触发规则生效了。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易遇到的几个报错,我按实际出现的频率排列,并给出排查路径。
5.1 401 Unauthorized
报错原文:
API Error: 401 Unauthorized - invalid api key这是最常见的错误。原因有三个:Key 没有正确写入 settings.json、Key 已过期或被撤销、Key 绑定的 plan 不支持当前模型。
排查步骤:首先检查~/.claude/settings.json中的ANTHROPIC_API_KEY字段是否与 TaoToken 控制台创建的 Key 完全一致,注意不要有多余空格。然后到 TaoToken 控制台的 API Keys 页面确认该 Key 的状态是“启用”。最后检查ANTHROPIC_MODEL字段指定的模型 ID 是否在当前 plan 的支持范围内。
如果三个都确认无误仍然报 401,尝试重新创建一个 Key 并替换。
5.2 local proxy failed
报错原文:
Error: local proxy failed to connect to upstream这个错误通常出现在 Base URL 配置错误或网络无法访问taotoken.net时。排查步骤:检查ANTHROPIC_BASE_URL是否为https://taotoken.net/api,注意不要写成https://taotoken.net/api/(末尾斜杠可能导致路径拼接问题)。然后在终端执行curl -I https://taotoken.net/api确认网络可达。
如果 curl 返回 200 或 401,说明网络通,问题在 Claude Code 的配置。如果 curl 超时,检查本地网络环境。
5.3 reading choices 报错
报错原文:
Error: reading choices - unexpected response format这个错误说明 API 返回的响应格式不符合 Claude Code 的预期。通常是因为 Base URL 指向了一个不兼容的端点,或者模型 ID 写错了。
排查步骤:确认ANTHROPIC_BASE_URL是https://taotoken.net/api,不是其他路径。确认ANTHROPIC_MODEL是有效的模型 ID,比如claude-sonnet-4-20250514。如果模型 ID 拼写错误,API 可能返回一个错误格式的响应,导致 Claude Code 解析失败。
5.4 OAuth 相关报错
报错原文:
Error: OAuth token expired or invalidClaude Code 在某些版本中会尝试 OAuth 认证。如果你使用的是 API Key 模式,需要确保没有残留的 OAuth 配置。排查步骤:检查~/.claude/目录下是否有oauth.json或类似的凭证文件,如果有,重命名或删除。然后在 settings.json 中确认只使用ANTHROPIC_API_KEY,不要混用 OAuth 字段。
5.5 压缩后重点丢失
这不是报错,但比报错更隐蔽。表现为压缩后 Claude 忘记了早期确认的决策。排查步骤:检查 CLAUDE.md 中的“压缩时必须保留”段落是否包含该决策。检查 settings.json 中的preserveOnCompact数组是否包含对应的类别。如果都没有,手动在/compact命令后附加保留指令。
5.6 子 Agent 没有隔离上下文
表现为子 Agent 执行后主会话上下文仍然大幅增长。原因通常是子 Agent 的配置没有正确加载,或者任务描述让主会话也读取了文件。排查步骤:确认子 Agent 的任务描述中没有让主会话直接读取文件的指令。检查 CLAUDE.md 中是否有全局的文件读取规则导致主会话也加载了文件。
5.7 配置不生效的通用排查
如果以上都排查了仍然有问题,按以下顺序检查:确认~/.claude/settings.json的 JSON 格式合法,可以用python -m json.tool ~/.claude/settings.json验证。确认 Claude Code 版本支持你使用的配置字段,执行claude --version查看版本号。确认项目根目录的 CLAUDE.md 文件名大小写正确,必须是全大写CLAUDE.md。
6. 稳定复现的接入路径与长期编码建议
把上面的配置跑通后,你需要在 TaoToken 上完成两件事:创建 API Key 和确认接入文档。API Keys 页面在https://taotoken.net/api-keys,接入文档在https://taotoken.net/doc。这两个页面是你后续排查配置问题的第一手资料。
如果你打算长期用 Claude Code 做连续编码任务,建议在 TaoToken 控制台确认当前 Key 绑定的 plan 类型。coding-plan 模式对多轮连续调用更友好,适合长任务场景。你可以在https://taotoken.net/coding-plan查看 plan 详情。
验证模型是否正常工作时,可以用模型对话页面发一个最小请求,地址是https://taotoken.net/chat。如果模型对话能正常返回,说明 Key 和通道都没问题,问题就集中在 Claude Code 的本地配置上。
最后说一个我实际踩过的坑:CLAUDE.md 不要写太长。我一开始把整个项目的架构文档都塞进去,结果每个请求都背着 3000 token 的 CLAUDE.md,上下文消耗速度反而更快。后来精简到 500 字以内,只保留必须始终存在的约束,效果明显好转。模块级的细节放到各子目录的 CLAUDE.md 里,按需加载。
另一个实用技巧是在任务开始时先执行一次/context,记录初始使用率。任务过程中每隔 10 轮检查一次,如果使用率超过 50% 就主动压缩。不要等到 70% 才动手,更不要依赖 95% 的自动压缩。主动管理永远比被动等待可靠。