1. 为什么我要从 Claude Code 的记忆系统倒推 settings.json
Claude Code 是 Anthropic 推出的终端 Agent 工具,它能读写文件、执行命令、跨会话保留项目上下文。很多人第一次用它时会好奇:为什么它记得我上周改过哪个模块,为什么它知道这个仓库不能用某个测试命令?答案藏在它的 Agent 记忆系统里。而记忆系统的落地,最终会收敛到一个配置文件——settings.json。
我试过把 Claude Code 的记忆逻辑拆开看,发现它本质上是一套「文件级记忆 + 按需召回 + 分层压缩」的组合拳。记忆不是存在某个黑盒向量库里,而是以 Markdown 文件的形式落在本地目录,由 Agent 通过工具调用显式写入和更新索引。这个设计的好处是:你可以用cat看到 Agent 到底记住了什么,也可以用git diff追踪记忆的变化。
但问题来了:如果你只是把 Claude Code 装好,用默认配置跑,记忆系统能工作,却不一定高效。真正决定记忆质量的,是settings.json里的几个关键参数——它们控制着记忆的存储路径、召回数量、压缩阈值和工具权限。这篇文章就围绕这 4 个「胜负手」展开,结合 TaoToken 的统一 Key/API 通道,给出一份可以直接复制的配置骨架。
适合谁读:正在用 Claude Code 做长期项目的人、想理解 Agent 记忆落地方式的开发者、以及需要把多个模型通道统一管理的人。读完之后,你能拿到一份可运行的settings.json,并知道每个字段为什么这么设。
2. TaoToken 前置:统一 Key 与 API 通道的接入准备
在配置settings.json之前,需要先解决一个前置问题:Claude Code 默认走 Anthropic 官方通道,但如果你同时用多个模型或需要统一管理 Key,直接写死官方地址会很不灵活。TaoToken 提供的是一个统一 API 通道,把模型对话、Coding Plan、API Keys 管理收敛到一个入口。
你需要先拿到一个可用的 API Key。操作路径是:访问 TaoToken 官网,注册后在控制台创建 API Key。官网地址是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,控制台入口在https://taotoken.net/console,API Keys 管理页在https://taotoken.net/api-keys。
拿到 Key 之后,API 的基础地址是https://taotoken.net/api,注意这个地址不加 UTM 参数,直接用于程序调用。Claude Code 的接入文档在https://taotoken.net/doc,里面有针对不同客户端的配置说明。如果你用的是 Claude Code 的 Anthropic 兼容模式,可以参考https://taotoken.net/ClaudeCodeAnthropic这个 deep link。
这里有一个容易踩的坑:很多人把 API 地址和官网地址搞混,在settings.json里填了带 UTM 的官网链接,结果请求全部 404。记住,程序调用只认https://taotoken.net/api,UTM 参数是给网页统计用的,不要写进配置文件。
另外,如果你打算长期跑编码任务或 Agent 工作流,可以了解一下 Coding Plan,入口在https://taotoken.net/coding-plan。它和按量计费的 API Key 是两种模式,前者更适合高频调用场景。模型对话的验证入口在https://taotoken.net,你可以在网页上先测一下 Key 是否可用,再写进配置。
3. 可复制配置:settings.json 的 4 个关键胜负手
Claude Code 的settings.json通常位于项目根目录的.claude/文件夹下,或者用户级的~/.claude/settings.json。下面这份配置骨架,我按记忆系统的 4 个关键点拆开讲。
3.1 胜负手一:记忆存储路径与文件格式
第一个胜负手是记忆存哪里、存成什么格式。Claude Code 的记忆系统默认使用 Markdown 文件作为持久化格式,索引文件叫MEMORY.md,其他记忆按类别存成独立文件。你需要在settings.json里显式指定记忆目录,避免它散落在临时路径里。
{ "memory": { "enabled": true, "storagePath": ".claude/memory", "indexFile": "MEMORY.md", "format": "markdown", "categories": ["user", "feedback", "project", "reference"] } }storagePath设为项目内的.claude/memory,这样记忆可以跟着仓库走,团队成员 clone 之后也能看到同一份记忆索引。categories对应源码里的记忆类型学:用户偏好、反馈、项目决策、参考资料。分门别类的好处是召回时可以按类型过滤,而不是一股脑全塞进上下文。
这里的关键决策是:不要用私有二进制格式。Markdown 的好处是可读、可 diff、可手动编辑。当 Agent 记错东西时,你可以直接打开文件改掉,而不是对着数据库发呆。
3.2 胜负手二:召回数量与信噪比控制
第二个胜负手是每次召回多少条记忆。Claude Code 源码里的策略是「最多 5 条,不确定就不选」。这个数字不是随便定的——太多会污染上下文,太少会漏掉关键信息。你可以在settings.json里控制这个上限。
{ "memory": { "recall": { "maxItems": 5, "requireReason": true, "dedupeBySession": true, "minConfidence": "medium" } } }maxItems设为 5,和源码保持一致。requireReason要求模型在召回时给出理由,这能逼它做判断,而不是随机选。dedupeBySession对应源码里的readFileState机制——同一条记忆在同一会话里只注入一次,防止重复污染。minConfidence设为medium,意思是模型不确定的记忆就不召回。
这个配置的核心思想是「饥饿营销」:把记忆当成稀缺资源,只选那些不提供就会导致任务失败的条目。很多 RAG 方案喜欢把相似度前 10 条全塞进去,结果模型被无关信息干扰,反而做不好决策。
3.3 胜负手三:压缩阈值与遗忘策略
第三个胜负手是上下文压缩。Claude Code 的压缩分三层:微压缩、会话记忆压缩、传统 LLM 摘要压缩。你需要在settings.json里设定触发阈值和熔断条件。
{ "memory": { "compaction": { "microCompactThreshold": 0.7, "sessionMemoryEnabled": true, "llmSummaryThreshold": 0.9, "maxRetries": 3, "restoreRecentFiles": 5 } } }microCompactThreshold设为 0.7,意思是上下文窗口用到 70% 时,先做轻量级压缩——截断过时的工具输出、删除重复内容。sessionMemoryEnabled开启会话记忆压缩,用结构化的会话记忆文件替代旧消息。llmSummaryThreshold设为 0.9,只有到 90% 才动用昂贵的 LLM 摘要。maxRetries设为 3,连续失败 3 次就放弃,避免死循环烧钱。restoreRecentFiles设为 5,压缩后自动恢复最近读过的 5 个文件,防止模型「失忆」。
这套配置的本质是「遗忘经济学」:先尝试最便宜的遗忘手段,实在不行才调用模型摘要。你要保护的不只是上下文窗口,还有 API 账单。
3.4 胜负手四:工具权限与记忆写入控制
第四个胜负手是记忆写入的权限控制。Claude Code 把记忆操作工具化,Agent 通过调用工具来写记忆。你需要在settings.json里限制哪些工具可以写记忆、哪些只能读。
{ "memory": { "write": { "allowedTools": ["write_memory", "update_memory_index"], "requireConfirmation": false, "maxWritesPerSession": 10 }, "read": { "allowedTools": ["read_memory", "search_memory"], "readOnly": true } } }allowedTools限定只有write_memory和update_memory_index能写记忆,其他工具只能读。maxWritesPerSession设为 10,防止 Agent 在一次会话里疯狂写记忆,导致索引膨胀。readOnly确保读取工具不会意外修改文件。
这里的设计思路是「不信任但验证」:Agent 可以写记忆,但写入行为要可审计、可回滚。你可以在系统提示里加一句「信任回忆,但若与当前事实冲突,以当前对话为准」,防止错误记忆污染任务。
4. 验证请求:确认配置生效与记忆系统工作
配置写完之后,需要验证它是否真的生效。最直接的方式是发一个请求,看 Claude Code 是否按预期读写记忆。
4.1 用 curl 验证 API 通道
先用 curl 测一下 TaoToken 的 API 通道是否通。把YOUR_API_KEY替换成你在控制台创建的 Key。
curl -X POST https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 256, "messages": [ {"role": "user", "content": "回复 OK 两个字母即可"} ] }'如果返回的 JSON 里有content字段且包含OK,说明 API 通道正常。如果返回 401,检查 Key 是否复制完整;如果返回 404,检查地址是不是写成了带 UTM 的官网链接。
4.2 在 Claude Code 里触发记忆写入
启动 Claude Code,让它做一个需要记忆的操作。比如:
claude "请记住:这个项目用 pnpm 而不是 npm,测试命令是 pnpm test"执行后,检查.claude/memory/MEMORY.md是否被更新。你应该能看到类似这样的内容:
# Memory Index ## Project - [package-manager.md](project/package-manager.md): 项目使用 pnpm,测试命令为 pnpm test再打开project/package-manager.md,确认内容被正确写入。如果文件没生成,检查settings.json里的storagePath是否指向了正确目录,以及allowedTools是否包含了write_memory。
4.3 验证召回与去重
新开一个会话,问 Claude Code:「这个项目用什么包管理器?」它应该能召回刚才写入的记忆,并给出pnpm。同时观察上下文里是否只注入了一次这条记忆——如果同一会话里反复问,dedupeBySession应该阻止重复注入。
你可以用cat .claude/memory/MEMORY.md随时查看索引,用git diff .claude/memory/追踪记忆变化。这就是文件级记忆的好处:一切可见、可审计。
5. 本篇常见错排查
配置过程中有几个高频错误,我整理成对照表,方便你快速定位。
| 报错现象 | 可能原因 | 排查动作 |
|---|---|---|
| 401 Unauthorized | API Key 无效或未传 | 检查x-api-key头,确认 Key 从控制台复制完整 |
| 404 Not Found | API 地址写错 | 确认地址是https://taotoken.net/api,不带 UTM |
| 记忆文件不生成 | storagePath目录不存在 | 手动创建.claude/memory目录,或检查路径拼写 |
| 记忆重复注入 | dedupeBySession未开启 | 在settings.json里设为true |
| 压缩后模型失忆 | restoreRecentFiles为 0 | 设为 5,让压缩后恢复最近文件 |
| 写入次数超限 | maxWritesPerSession太小 | 根据任务复杂度调整,默认 10 够用 |
| 召回无关记忆 | minConfidence太低 | 设为medium或high,提高筛选门槛 |
还有一个隐蔽的坑:如果你在settings.json里同时配了用户级和项目级配置,Claude Code 的合并策略是项目级覆盖用户级。所以如果你在用户级开了记忆,项目级忘了开,记忆功能在项目里可能不生效。建议统一在项目级配置,跟着仓库走。
另外,MEMORY.md索引文件不要手动删。如果索引丢了,Agent 就找不到其他记忆文件了。你可以手动编辑索引内容,但不要删除文件本身。如果索引损坏,可以从git历史里恢复。
6. 下一步:把记忆系统接进你的工作流
配置跑通之后,你可以做几件事让它更贴合自己的习惯。第一,把.claude/memory/加入版本控制,这样团队共享记忆,新人 clone 后能快速了解项目约定。第二,定期 reviewMEMORY.md,删掉过时或错误的记忆,保持索引干净。第三,如果你同时用多个模型通道,可以在 TaoToken 控制台统一管理 Key,避免在多个配置文件里散落不同厂商的凭证。
模型对话的验证入口在https://taotoken.net,接入文档在https://taotoken.net/doc,API Keys 管理在https://taotoken.net/api-keys。如果你打算长期跑编码任务,Coding Plan 的入口在https://taotoken.net/coding-plan,适合高频调用场景。
最后留一个实用技巧:在系统提示里加一句「每次写入记忆前,先检查 MEMORY.md 是否已有同类条目,有则更新而非新建」。这能有效防止索引膨胀,也是 Claude Code 源码里write-after-filter逻辑的简化版。记忆系统的核心不是记多少,而是记准、记少、能忘。