
1. 长会话里 TodoList 为什么会丢用 Claude Code 写一个稍微完整点的模块比如给数据库补一套 CRUD API 加单元测试很容易聊到三四十轮。前面十几轮一切正常Claude 记得你定的命名规范、记得你说过分页用 OFFSET FETCH、记得 UserService 已经写完了。然后某一次工具调用返回之后界面弹出一句上下文窗口接近上限接着它自动压缩再回你一句好的接下来做什么。你让它继续写 UserService 的单元测试它却重新创建了一遍 UserService。这不是它变笨了是压缩把已经做过什么这件事从记忆里抹掉了。TodoList 之所以经常一起消失是因为它默认活在对话历史里而对话历史正是被压缩的对象。这篇就围绕 Claude Code 配 TaoToken 之后怎么用/compact的压缩时机加CLAUDE.md的持久化约定把 TodoList 从靠记忆改成靠文件让长会话不再断片。适合谁看已经在用 Claude Code 做多文件、多步骤任务被上下文膨胀和进度丢失折腾过的人。你需要的基础是会用命令行、知道settings.json大概长什么样、能编辑 Markdown 文件。下面所有配置都可以直接复制改掉 Key 就能跑。先说清楚一个前提TaoToken 在这里的角色是统一 Key 和 API 通道。Claude Code 本身支持通过环境变量或配置文件指定 Anthropic 兼容的接入地址把通道收敛到一处之后你换模型、换额度、看用量都在同一个后台不用在多个 Key 之间来回改配置。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 这个地址不带 UTM 参数配置里要写干净。2. 前置把 TaoToken 通道接进 Claude Code2.1 先拿 Key再决定写哪一层配置Claude Code 读取接入信息有两个层次环境变量和项目/用户级settings.json。环境变量适合临时试settings.json适合长期固定。我建议长期用settings.json因为环境变量在换终端、换 IDE 内置终端时经常丢排查起来很烦。拿 Key 的路径是控制台里的 API Keys 页面创建之后复制那串以sk-开头的字符串。这一步别把 Key 贴进任何会提交到 Git 的文件里后面配置里我会用占位符。控制台入口https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite2.2 settings.json 骨架Claude Code 的配置分用户级和项目级。用户级在~/.claude/settings.json项目级在项目根目录的.claude/settings.json。通道这种全局信息放用户级项目相关的规则放项目级。下面这份是用户级骨架把ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址ANTHROPIC_AUTH_TOKEN填你的 Key{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-5, CLAUDE_CODE_MAX_OUTPUT_TOKENS: 8192 }, permissions: { allow: [ Read, Grep, Glob ], deny: [] } }几个参数的实际作用我按踩过的坑说一下。ANTHROPIC_BASE_URL必须是https://taotoken.net/api末尾不要多加斜杠加了有的版本会拼出双斜杠导致 404。ANTHROPIC_MODEL写你实际要用的模型名写错不会报模型不存在而是回退到默认模型你会以为配置没生效。CLAUDE_CODE_MAX_OUTPUT_TOKENS控制单次回复上限设太大对上下文没好处8192 对大多数编码任务够用。注意ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY是两个不同的变量名Claude Code 认前者。如果你之前配过ANTHROPIC_API_KEY两个都留着可能互相覆盖建议只保留ANTHROPIC_AUTH_TOKEN。2.3 项目级配置只放规则不放 Key项目级.claude/settings.json不要写 Key因为项目目录大概率会进版本库。它只放权限和本地行为{ permissions: { allow: [ Read, Grep, Glob, Edit, Bash(git status), Bash(git diff:*) ], deny: [ Bash(rm -rf:*), Bash(git push:*) ] } }把git push放进 deny 是有意的长会话里 Claude 容易在你不注意时提交并推送禁掉之后它只能改本地你确认完再手动推。3. 可复制配置CLAUDE.md 里约定 TodoList 持久化3.1 为什么 TodoList 要落到文件Claude Code 内置的 TodoWrite 工具会维护一份任务清单这份清单在/compact之后通常能保留但它保留的是清单结构不是每个任务背后的上下文。也就是说压缩后它可能还记得第 4 步实现 UserController但忘了第 4 步依赖第 3 步里定的某个返回结构。真正稳的做法是TodoList 的权威副本写在CLAUDE.md里对话里的 TodoWrite 只是它的运行时视图。CLAUDE.md在每次会话开始时自动加载属于系统级内容不会被/compact压掉。这就是它比对话历史可靠的根本原因。3.2 CLAUDE.md 片段把下面这段放进项目根目录的CLAUDE.md按你的项目改# 项目约定 ## 上下文管理规则 - 每完成一个 TodoList 条目立即把该条目状态从 [ ] 改为 [x]并写一行完成说明。 - 触发 /compact 之前必须先把当前 TodoList 全量同步到本文件的任务清单小节。 - 新会话开始时先读本文件的任务清单再决定下一步不要凭对话记忆推进。 - 单个任务涉及超过 3 个文件时拆成子任务每个子任务单独标记。 ## 任务清单 - [x] 创建 User 实体类字段id, email, passwordHash, createdAt - [x] 创建 UserMapperMyBatis-Plus不用 JPA - [x] 实现 UserService 增删改查分页用 OFFSET FETCH - [ ] 实现 UserController REST 接口 - [ ] 添加参数校验email 格式、密码强度 - [ ] 编写 UserService 单元测试 ## 技术约束 - 分页查询统一 OFFSET FETCH禁止 ROW_NUMBER() - 密码加密 bcrypt轮次 12 - 所有 SQL 参数化禁止字符串拼接 - 异常统一抛 BizException3.3 压缩前的固定动作在CLAUDE.md里约定好之后压缩前你只需要说一句按 CLAUDE.md 的规则先把任务清单同步过去Claude 就会把当前 TodoList 写回文件。这一步花不了多少 Token但能省掉压缩后重新对齐进度的几万 Token。4. 验证压缩前后 TodoList 是否保留4.1 先看上下文占用Claude Code 有/context命令能看到各部分占用。跑一次/context输出大概长这样System Prompt: 3,200 tokens (1.6%) CLAUDE.md: 1,900 tokens (1.0%) 对话历史: 48,000 tokens (24.0%) 工具调用结果: 86,000 tokens (43.0%) 文件读取: 51,000 tokens (25.5%) ───────────────────────────────────────── 总计: 190,100 / 200,000 tokens (95.1%)看到没有对话本身只占 24%工具调用和文件读取加起来接近 70%。这就是为什么少聊两句根本救不了上下文真正的大户是 Read 和 Grep 的输出。4.2 压缩前记录基线在触发/compact之前先让 Claude 输出当前任务清单把当前 TodoList 完整列出来每条带上状态和一句话说明。记下这份清单。然后执行同步按 CLAUDE.md 的规则把这份 TodoList 同步到文件的任务清单小节。确认CLAUDE.md已经更新再执行/compact4.3 压缩后验证压缩完成后开一个新会话或者就在当前会话里问读 CLAUDE.md 的任务清单告诉我下一步该做什么。如果它准确说出下一步是实现 UserController REST 接口说明持久化生效了。如果它说我不清楚之前做到哪了说明同步那一步没执行或者CLAUDE.md没被加载——检查文件是不是放在项目根目录文件名大小写是不是CLAUDE.md。再补一个更严格的验证让它复述技术约束。根据 CLAUDE.md分页查询用什么语法密码加密用什么算法和轮次正确回答应该是OFFSET FETCH和bcrypt 12 轮。这两个答案在压缩后的对话历史里大概率已经没了能答对只可能来自CLAUDE.md。4.4 用模型对话快速验证通道如果你只想确认 TaoToken 通道本身通不通不用开 Claude Code直接用模型对话页面发一条消息最快模型对话入口https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite发一句用一句话说明 OFFSET FETCH 和 ROW_NUMBER 分页的区别能正常返回就说明 Key 和通道没问题剩下的问题都在 Claude Code 配置层。5. 本篇常见错排查5.1 报 401 或 invalid api key先确认settings.json里写的是ANTHROPIC_AUTH_TOKEN而不是ANTHROPIC_API_KEY。再确认 Key 没有多余空格复制时经常带上首尾空白。最后确认ANTHROPIC_BASE_URL是https://taotoken.net/api不是官网首页地址也不是带 UTM 的地址。5.2 报 404 或 model not found大概率是ANTHROPIC_BASE_URL末尾多了斜杠或者ANTHROPIC_MODEL写了一个通道不支持的模型名。把模型名去掉让它用默认模型试一次能通就说明是模型名的问题。5.3 压缩后 TodoList 还是丢了按可能性排序第一压缩前没执行同步对话里的 TodoList 没写回CLAUDE.md第二CLAUDE.md不在项目根目录或者文件名写成了claude.md第三CLAUDE.md内容太长被截断加载。第三种情况把文件控制在 200 行以内把不常用的规则挪到单独文件里按需引用。5.4 上下文还是涨得很快跑/context看是哪一项在涨。如果是文件读取占大头说明 Claude 在全文 Read 大文件。在CLAUDE.md里加一条规则读取文件前先用 Grep 定位行号只读相关区间单次 Read 不超过 100 行。如果是工具调用结果占大头多半是 Bash 命令输出了大量日志让它把输出重定向到文件再读关键行。5.5 换了 Key 之后旧会话行为异常settings.json的改动对已经打开的会话不一定立即生效重启 Claude Code 再试。另外确认没有同时在 shell 里export了旧的ANTHROPIC_AUTH_TOKEN环境变量优先级高于配置文件会把你新写的配置盖掉。用echo $ANTHROPIC_AUTH_TOKEN检查一下。6. 把通道和进度都固定下来长会话管理的核心不是怎么压得更狠而是怎么让关键信息不依赖对话历史。TodoList 写进CLAUDE.md、技术约束写进CLAUDE.md、压缩前固定同步一次这三件事做完/compact就从失忆开关变成了普通的空间回收。通道这边同理把 Key 和 API 地址固定在一份settings.json里比每次开终端重新 export 稳得多。如果你还在多个 Key 之间切换建议直接收敛到一处接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite如果你打算长期用 Claude Code 跑编码和 Agent 类任务按量计费之外可以看看 Coding Plan额度包月对高频长会话更划算Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite最后留一个我自己的习惯每次开新会话第一句话固定是读 CLAUDE.md告诉我任务清单和下一步。这句话花不到 100 Token但能让 Claude 在压缩、重启、换窗口之后都从同一个事实源出发比任何压缩技巧都管用。