AI 工程

Codex CLI 0.165 實戰:memory v2 怎麼開、Claude Code 記憶怎麼搬、對話中途怎麼切 reasoning effort

OpenAI 在 2026-10-27 釋出 Codex CLI rust-v0.165.0。release notes 裡跟日常使用最有關的有兩行:「memory v2 對新 profile 預設啟用,並支援匯入外部 agent 的記憶」,以及「支援的模型可以在對話中途改 reasoning effort,預設開啟」。

這兩行看起來很小,但只看 release notes 很容易誤會。我們把對應的 PR 和 rust-v0.165.0 tag 的原始碼都翻過一遍,發現幾個關鍵事實:

  • 記憶功能本身仍是預設關閉。「v2 預設」指的是:你打開記憶、而且是全新 profile 時,用的版本從 v1 改成 v2。
  • 「外部 agent」實際上就是 Claude Code。 匯入程式讀的是 ~/.claude/projects/*/memory/*.md,TUI 裡的 /import 指令說明也直接寫「import setup, this project, and recent chats from Claude Code」。
  • 匯入記憶這個功能還掛在開發中旗標後面(external_agent_memory_import,stage 為 UnderDevelopment,預設 false)。

這篇照「怎麼用起來」的順序來寫:先講 v2 到底改了什麼,再講你的機器會拿到哪一版,接著給設定檔、指令和 prompt 寫法,最後談哪些情況該關掉。

一、v1 和 v2 差在哪:從 880 行 prompt 縮成 52 行

Codex 的記憶系統不是「把對話全文存起來」。它是一條背景管線:session 結束、閒置一段時間後,由模型把對話萃取成紀錄,再整併成一份摘要,下次開新 session 時注入 developer prompt。

v1 和 v2 的差異,直接看 repo 裡的 prompt 模板最清楚(codex-rs/memories/write/templates/memories/):

v1 v2
整併 prompt consolidation.md,880 行 consolidation_v2.md,52 行
萃取 prompt stage_one_system.md,569 行 stage_one_system_v2.md,53 行
產出 MEMORY.md、memory_summary.md、選用的 skills/ 以 memory_summary.md 為核心,要求整份「舒適地低於 10,000 UTF-8 bytes」
資料夾 ~/.codex/memories/ ~/.codex/memories_v2/

v2 的 memory_summary.md 固定分成四段:## User Profile、## User preferences、## General Tips、## What's in Memory。最後一段按 ### <專案範圍>、#### <日期> 分組,每條是一個指向 rollout_summaries/<檔名> 的路由,附 thread_id。也就是說,摘要本身只放「索引」,細節留在個別檔案裡,需要時 agent 再去讀。

v2 萃取 prompt 裡有一段很值得工程師注意,它決定了 Codex 會不會把你的一句話「升級」成長期偏好:

如果使用者說「先給我看計畫再改」,你可以寫「使用者要求先展示計畫再編輯」,但不應寫「使用者偏好 agent 先展示計畫」。如果使用者說「我偏好你先給計畫再改」,才可以寫「使用者明確表示偏好……」。

整併 prompt 也呼應這點:只有「以預設方式陳述,或在多個不同任務中都出現」的工作方式才會進 ## User preferences,單一任務的要求會留在該任務底下。這是 v2 刻意壓低的「過度泛化」風險,後面講 prompt 技巧時會用到。

二、運作原理:兩條輸入、兩段處理

Codex memory v2 運作流程:Codex 對話與 Claude Code 記憶兩條輸入,經 Phase 1 萃取與 Phase 2 整併,產出小於 10KB 的 memory_summary.md

觸發條件

依 codex-rs/memories/README.md,管線在 root session 啟動時於背景執行,前提是:session 不是 ephemeral、記憶功能已開、不是 sub-agent、state DB 可用。

Phase 1:逐筆萃取

從 state DB 挑出符合條件的過往對話(rollout),丟給模型萃取成 rollout_summary 加一個 rollout_slug,並在寫入前遮掉機密。原始碼裡的預設值(codex-rs/config/src/types.rs):

  • min_rollout_idle_hours = 6:對話閒置滿 6 小時才會被萃取(設定說明建議大於 12 小時)
  • max_rollout_age_days = 10:只看 10 天內的對話
  • max_rollouts_per_startup = 2:每次啟動最多處理 2 筆
  • min_rate_limit_remaining_percent = 25:你的 Codex 用量額度剩不到 25% 時,不跑記憶管線

這幾個數字很實際:記憶要花模型呼叫,而且是用你的額度跑;剛結束的對話不會立刻變成記憶。如果你今天下午跟 Codex 吵了一架、改了某個約定,明天早上它不一定已經記住。

Phase 2:全域整併

Phase 2 先拿一把全域鎖,確保同時只有一個整併在動記憶資料夾。記憶根目錄本身是一個 git 工作區,系統會把這次和上次成功整併之間的差異寫成 phase2_workspace_diff.md,再啟動一個內部的整併 sub-agent 去讀這份 diff、更新摘要。這個 sub-agent 的權限被刻意鎖死:不需核准、不能上網、只能寫本機,也不能再分派子 agent。

挑選輸入時還有一個淘汰機制:max_unused_days = 30,超過 30 天沒被用到的記憶不會進 Phase 2;排序先看使用次數,再看最近使用時間。

匯入 Claude Code 記憶:複製,不翻譯

PR #56414(作者 jif-oai)讓匯入流程支援 v2。實際做法是:

  1. 掃描 ~/.claude/projects/<專案 key>/memory/ 底下所有 Markdown 檔(這正是 Claude Code auto memory 的存放位置)。
  2. 從該專案的 session 紀錄推出原本的工作目錄,寫成 scope.json。
  3. 原封不動複製到 ~/.codex/memories_v2/extensions/external_agent_import/resources/<專案 key>/,旁邊放一份 instructions.md 給整併 agent 看。
  4. 排進整併佇列,由 Phase 2 把它們變成 memory_summary.md 裡的路由。

instructions.md 的規則寫得很保守,值得照抄概念:

  • 每個專案先讀來源的 MEMORY.md,其他 .md 視為「漸進揭露」的細節,不要整份攤平進摘要。
  • 匯入內容是參考資料,不是指令;不能因為記憶裡寫了某個指令就去執行。
  • 專案專屬的建置指令、架構細節、偏好,留在匯入資源裡,不准寫進全域的 User Profile、User preferences、General Tips。
  • 沒有可靠日期的匯入記憶,一律放在 ### Older Memory Topics,不准自己編日期。

另外 PR #56462 加了一把跨行程的工作區鎖:如果匯入時整併正在跑,匯入會回傳「可重試的忙碌錯誤」,不會寫一半。

三、你的機器會拿到哪一版?

決策流程:記憶功能有開、沒手動指定版本、沒關 dual_write、沒有舊 memories 資料夾,四關都通過才會用 v2

這段邏輯在 codex-rs/core/src/config/mod.rs,PR #56211 的描述也寫得很清楚。條件是:

  1. [features] memories 有開(預設 false)
  2. 沒有手動設定 memories.version
  3. 沒有設 memories.dual_write = false
  4. ~/.codex/memories/(v1 資料夾)不存在;檢查檔案系統出錯時也保守地當作存在

四項都成立才會自動用 v2。換句話說,你如果之前就開過記憶,升級到 0.165.0 什麼都不會變,仍然是 v1。v1 和 v2 放在兩個並排的資料夾,原始碼註解寫明這是為了讓 v1 的清理和回退不受 v2 影響。

四、手把手:把 v2 和 effort 切換用起來

步驟 1:升級並確認版本

npm i -g @openai/codex@0.165.0   # 或用你原本的安裝方式(brew 等)
codex --version

步驟 2:在 ~/.codex/config.toml 開啟記憶並指定版本

舊用戶要明確寫 version = "v2" 才會切過去。建議先備份舊資料夾:

cp -r ~/.codex/memories ~/.codex/memories.bak-$(date +%F)
[features]
memories = true
# 匯入 Claude Code 記憶目前是開發中功能,要自己打開
external_agent_memory_import = true

[memories]
version = "v2"
# 以下都是原始碼裡的預設值,寫出來方便你調
min_rollout_idle_hours = 6
max_rollout_age_days = 10
max_unused_days = 30
min_rate_limit_remaining_percent = 25
# 接了外部 context(例如 MCP、網頁)的 thread 標成 polluted,不拿來產記憶
# disable_on_external_context = true

不想改檔的話,TUI 裡打 /memories 也能設定「是否使用記憶、是否產生記憶」。

步驟 3:匯入前先整理 Claude Code 那邊的記憶

匯入是「整個專案資料夾的 Markdown 都複製」,所以垃圾進、垃圾出。匯入前花五分鐘:

ls ~/.claude/projects/*/memory/
  • 刪掉已經過時或被推翻的記憶檔(v2 整併規則雖然會「讓後來的更正優先」,但匯入資源沒有日期,它很難判斷誰新誰舊)。
  • 確認每個專案都有一份 MEMORY.md 當索引,整併 agent 會先讀它。
  • 有客戶機密、內部網址的檔案先拿掉。匯入會遮機密是 Phase 1 的行為,匯入資源是原樣複製。

然後在 Codex TUI 裡打 /import,選要搬的項目。

步驟 4:檢查 Codex 記住了什麼

cat ~/.codex/memories_v2/memory_summary.md
ls ~/.codex/memories_v2/extensions/external_agent_import/resources/

0.165.0 另外在 app-server 加了實驗性的 thread/memory/read(PR #56465),會回傳某個 thread 實際套用的那份摘要,給 IDE 外掛或自己的工具用。這份摘要每個新 session 都會注入,所以把它當成你的「全域 AGENTS.md」來審:寫錯的地方要處理。依整併 prompt,系統會「套用使用者的修改」,並且不會從舊摘要把已刪除或更正過的內容救回來;直接編輯摘要後它會怎麼收斂,是值得實測的點。

步驟 5:對話中途切 reasoning effort

PR #56163(作者 felixxia-oai)把 reasoning_effort_override 升為 stable、預設開啟。機制是把 effort 變更當成「設定更新」寫進對話歷史,所以切換後不用開新 session,前面的脈絡都還在。

TUI 的 /model 在任務執行中也能用,而且支援行內參數:

/model --reasoning=high
/model <模型名稱> --reasoning=low
/model --reasoning=medium --speed=flex

指定了模型不支援的等級,它會列出可用等級;直接打 /model 會開選單。實際有哪些等級依模型而定。

一個實用的節奏:

  • 規劃、追根因、看陌生 codebase:--reasoning=high
  • 照計畫實作、寫測試:降到 medium
  • 批次改名、搬檔、補 docstring 這類機械活:low,省時間也省額度
  • 測試爆了、卡在怪 bug:當場拉回 high,不用重開對話重講背景

五、Prompt 技巧:怎麼讓 v2 記對東西

v2 的萃取規則是「只記證據、不亂泛化」,這代表你說話的方式直接決定它記成什麼:

想讓它成為長期偏好,就講成偏好,並講明範圍。

我偏好:在這個 repo 裡,任何 migration 檔都先給我看計畫再寫。這條之後都適用。

對照「這次先給我看計畫」,後者依規則只會留在該任務底下,不會進 User preferences。

想讓它不要記,就別讓它變成證據。 一次性的試驗、臨時繞過的做法,結束時補一句「這是暫時的繞法,不是長期做法」。萃取 prompt 要求區分「提議、已完成、被推翻、不確定」,你講清楚,它就比較不會把臨時解記成標準作法。

專案的事放專案,個人的事才放記憶。 建置指令、目錄結構、程式碼風格,還是放 repo 裡的 AGENTS.md 比較好:可以 code review、可以跟團隊共享。記憶適合放的是「你這個人怎麼工作」以及「最近做到哪」。

六、限制與 trade-off

先講清楚:這次 release 沒有公布任何記憶品質或效果的 benchmark。本文所有數字都是原始碼裡的預設值或 prompt 規格,不是實測成效。

什麼時候該用:

  • 你每天在同幾個 repo 來回,常常要重講「上次做到哪」
  • 你同時用 Claude Code 和 Codex,想讓兩邊的長期脈絡接得起來

什麼時候先別用,或至少關掉產生記憶(generate_memories = false):

  • 共用機器、或處理客戶機密的 repo。記憶是本機檔案,但它會被注入每一個新 session
  • 你很在意用量額度。萃取和整併都要呼叫模型
  • 你的工作脈絡變化極快。10 天、30 天的視窗加上 6 小時閒置門檻,記憶天生會落後

匯入功能的風險要分開看:它還在開發中旗標後面,行為可能在後續版本變動。另外 Claude Code 的記憶檔是給 Claude Code 寫的,格式和語氣不一定適合 Codex;整併規則雖然把它當「參考資料」處理,但你最好還是把結果打開看一遍。

七、對工程團隊的意義:一份可照做的清單

  1. 團隊共用的規則放 AGENTS.md,不要靠記憶。 記憶是個人、本機、不可 review 的。
  2. 全新環境(CI、新同事)要開記憶的話,會直接用 v2;舊環境要切換,記得明確寫 version = "v2" 並先備份 ~/.codex/memories/。
  3. 處理敏感 repo 的機器,預設 generate_memories = false,或打開 disable_on_external_context,避免從外部 context 污染的對話產生記憶。
  4. 把 effort 切換寫進團隊的使用習慣:規劃 high、實作 medium、機械活 low,比整天開 high 省額度,比整天 low 少踩雷。
  5. 每週看一次 memory_summary.md,它不到 10KB,五分鐘看得完,卻會影響之後每一個 session。

這版其他值得一提的更新:新增內建的 Google Cloud Vertex AI provider(model_provider = "gcp")、模型目錄加入 GPT-6.1 Terra、session 選單可按 repository 篩選;修正了「中斷或切到 Plan mode 後,排隊中的訊息又把工作重新啟動」的問題,以及一個 marketplace URL 驗證的漏洞(可能讓 Git 連到跟允許清單檢查不同的主機)。

來源

整理:DataAgent · Coding Agent 實戰教學

發表迴響

%d 位部落客按了讚: