你在 Codex CLI 里连续写了好几轮代码,重构、调试、生成……干劲正酣,突然发现模型竟然遗忘了上一轮刚刚确认的接口签名,函数命名约定也被丢到了九霄云外,甚至把两个不同项目的文件路径搅在了一起。先别急着责怪模型记忆力差——极有可能是记忆功能没有开启,或者虽然开启了但没有配置好。
先确认记忆功能有没有真正开启
第一步并不复杂,在终端执行命令 codex config get memories.enabled,如果返回结果是 true,说明记忆功能已经处于开启状态;如果返回 false 或者直接提示 key not found 报错,那么记忆系统实际上并未被激活。
第二步:执行 codex config set memories.enabled true。这一步至关重要,否则后续所有记忆相关的操作都不会产生实际效果——memories.enabled 必须设置为 true,memory pipeline 才会正常运作。
第三步是很多人都容易忽略的环节:重启 Codex CLI 进程。关闭当前终端窗口,再重新打开一个新的终端。因为这项配置不会热生效。如果不重启,即使已经设为 true,memory_summary.md 也不会被模型读取到。
手动触发记忆生成与更新
方法一:等待自动合并不太靠谱
Codex 默认每隔 6 小时空闲后才会触发 Phase 1 提取,而且还要求 rollout 已完成、没有 pending turn 等隐性条件。在实际开发过程中,几乎很难指望这个自动机制。
方法二:强制立即生成记忆
在项目根目录下直接运行 codex memories generate。这条命令会立刻扫描最近 3 个已完成的 rollout,启动提取流程,然后排队进入合并阶段。效果立竿见影,非常实用。
方法三:跳过提取步骤,手动刷新摘要
如果你只是希望当前会话能够立即读取到最新的记忆内容,可以手动编辑 ~/.codex/memories/memory_summary.md。删除旧内容,粘贴一段你自己编写的关键上下文摘要,比如:“当前正在实现 user-auth 模块,JWT 签名算法固定为 HS256,token 过期时间为 24h”。Codex 启动时只读取这个文件,并且严格截断到 5000 token——因此写得越精炼,越容易被完整加载到上下文中。
修复历史会话不可见的问题
第一步:先判断是否由 Provider 切换引起
执行命令 codex config get provider,检查这个值是否和你上次能够看到历史会话时一致(例如之前是 openai,现在变成了 anthropic)。如果不一致,那么问题的根源就是命名空间隔离,这种情况处理起来相对简单。
第二步:使用会话克隆工具迁移数据
下载 codex-session-cloner,先执行 ./aik codex export --provider=openai --output=backup.zip,再执行 ./aik codex import --provider=anthropic --input=backup.zip。导入完成后,运行 codex resume 就可以列出之前的会话记录了。
第三步:验证记忆关联是否已经重建
导出会话只是恢复了 thread 记录,并不会自动重建 memory 引用。你需要手动再执行一次 codex memories generate,确保新 provider 环境下的 rollout_summaries/ 目录中每个 .md 文件都被纳入了合并流程。否则 memory_summary.md 里依然不会包含这段历史记录。
清理无效记忆,防止语义漂移
执行 codex memories reset 会清空 ~/.codex/memories/ 目录下的全部文件(包括 MEMORY.md、memory_summary.md、skills/ 和 rollout_summaries/),但不会删除 threads 数据库或已有的会话文件。这意味着你仍然可以通过 codex resume 列出历史对话记录,只是这些对话不会再向新会话注入记忆内容。
需要特别留意:reset 之后第一次运行 codex memories generate,记忆会从零开始重建,旧的 rollout 不会被自动扫描——你必须确保目标 rollout 文件仍然存在于 ~/.codex/sessions/ 目录中,并且状态为 completed。
如果只是希望删除某次特定会话的记忆痕迹,更直接的方法是:直接删除 ~/.codex/memories/rollout_summaries/xxx.md 文件。Codex 在合并过程中遇到缺失的文件会直接跳过,不会产生报错。
