AI 工程

Codex CLI 0.157 實戰:`f` 分叉不是你想的那樣——背景 server、GPT-6 Sol/Luna 與四種分叉入口怎麼用

Codex CLI 在 2026-09-25 發布了 rust-v0.157.0。release notes 的 New Features 只有六行,很容易掃一眼就過去了:新增 GPT-6 Sol/Luna、按 f 分叉對話、背景 server 預設自動啟動。

但這三件事有個共同點:它們都在改「一段對話屬於誰、跑在哪裡」。以前一個 session 就是一個終端機裡的行程,關掉就沒了。最近幾版,Codex 把 session 慢慢搬到一個常駐的本機背景 server(daemon)上,讓終端機、Desktop app、codex agents 總覽都能看到同一批對話。0.157 則把這個 server 改成預設自動啟動。

所以這篇不把 changelog 翻譯一遍,而是回答三個實際的問題:

  1. 背景 server 預設開起來之後,我的工作流程會有什麼不同?出問題怎麼關掉?
  2. f 到底是在什麼情況下用的?(先講結論:它不是通用的分叉鍵,很多人第一眼會誤會)
  3. GPT-6 Sol 跟 Luna 怎麼分工?舊模型的遷移提示該怎麼處理?

以下所有行為都是對照 release notes、PR 描述跟 0.157.0 tag 的原始碼整理的。有些地方我沒有在自己的環境跑過,會直接標成「值得實測」。

一、先釐清:f 不是「隨時分叉」

release notes 的原文是:

Added an f shortcut to fork conversations open in another app, preserving drafts and queued prompts. (#47185)

重點是 "conversations open in another app"。這個功能是 GitHub 帳號 @fcoury-oai 在 PR #47185 實作的,標題寫得更清楚:Allow forking conversations locked by another app in the TUI。

情境是這樣:同一段對話如果已經在另一個 app(例如 Codex Desktop app)開著,終端機 TUI 就不能再寫入。這時畫面不會顯示輸入框,而是出現一個鎖定提示。從 0.157 的 snapshot 測試可以看到它長這樣:

🔒   This conversation is open in another app  r to retry
    Close it there and press R to continue here.

 r retry   f fork   esc/ctrl+c/q exit   ctrl+t transcript

0.157 之前,你只有兩個選擇:去另一個 app 把它關掉再按 r,或者離開。現在多了 f(大寫 F 也行)。PR 描述列出了它的行為:

  • 按下後畫面顯示 Forking conversation…,這段期間其他按鍵會被擋掉
  • 你在鎖定畫面打到一半的草稿,以及排隊中的 prompt,都會一起帶到新的分叉
  • 分叉不會搶走原對話的占用權(lease),原對話仍然歸那個 app
  • 成功後顯示 Fork created. You can continue here.
  • 萬一分叉失敗,你會留在鎖定畫面,草稿不會丟

所以 f 解決的是一個很具體的痛點:你在 Desktop app 讓 agent 跑一段,回到終端機想接著做,卻被鎖在門外。 以前只能去關掉 app,現在可以直接從當下的脈絡分一條出來繼續。

Codex 0.157 背景 server 架構與 f 分叉流程

那平常想分叉,要用哪個?

如果你要的是「同一段脈絡試兩種解法」,用的是早就存在的 /fork。對照 0.157 原始碼 tui/src/slash_command.rs,跟分叉有關的入口共有四個:

入口 什麼時候用 備註
f(鎖定畫面) 對話被別的 app 占住,你想在終端機繼續 0.157 新增,帶走草稿與排隊 prompt
/fork 對話進行中,想從目前這一刻分出去 描述是 "fork the current chat"
codex fork 從過去的 session 另開一條 預設跳出挑選器;--last 直接挑最近一條;--all 顯示所有目錄的 session
/side(別名 /btw) 主任務跑著,想問一個旁支問題 "start a side conversation in an ephemeral fork",開在暫時性的分叉

Codex CLI 四個分叉入口對照

還有一個容易踩的坑:分叉複製的是對話,不是你的檔案系統。 原始碼的測試 snapshot 裡有一個分叉時的選單:

Where should the forked conversation run?
› 1. Current checkout  Keep using the current working directory
  2. New worktree      Create an isolated managed checkout

如果兩條線都會改檔案,請選 New worktree。0.156 的 release notes 提到 worktree 支援已經預設開啟,正好可以搭配使用。如果你是從別的目錄 codex fork 一個舊 session,它還會問你要用 session 當時記錄的 cwd,還是你現在所在的目錄。自動化腳本裡要記得處理這一步。

實戰招式:同一題,兩條線比較

分叉最好用的時機,是「方向還不確定,但前面的脈絡已經花了很多 token 建立起來」。流程大概是:

  1. 在主對話裡先讓 agent 把問題講清楚,但不要讓它動手,例如:
    先不要改任何檔案。讀完 src/billing/ 之後,列出造成重複扣款的可能原因,
    並提出兩種修法:A 是最小修補,B 是重構 retry 邏輯。每種列出會動到的檔案。
    
  2. 輸入 /fork,選 New worktree
  3. 在分叉那條輸入:採用修法 B,實作並補上測試,完成後跑 pnpm test
  4. 回到主線輸入:採用修法 A,實作並補上測試
  5. 兩邊都跑完後,在各自的 worktree 用 /diff 看改動,決定留哪一條

關鍵在第 1 步:讓分叉點落在「分析完、還沒動手」的那一刻。這樣兩條線共享同一份理解,差別只在做法。

二、背景 server 預設自動啟動:你的 session 現在住在哪

這是 0.157 影響最大、但最不顯眼的改動。PR #47179(Eric Traut,@etraut-openai)把 daemon_auto_start 從實驗功能升為 stable,並且對符合條件的互動式啟動預設開啟,同時把它從 /experimental 選單移除。

什麼叫「符合條件」

對照 tui/src/startup_orchestration.rs,自動啟動需要同時滿足:

  • features.daemon_auto_start 是開啟的(現在預設就是開)
  • 你沒有加 --no-daemon
  • 目前不是在連遠端 workspace
  • 如果你用的是 Amazon Bedrock、而且還沒登入,第一次設定精靈會先走內嵌模式

條件都滿足時,codex 啟動時會先確認本機背景 server 有沒有在跑,沒有就拉起來,然後把 TUI 接上去。

這對你代表什麼

  • 跨介面看得到同一批對話:codex agents 的說明是 "Browse all agent sessions on the shared local app-server daemon",前提就是這個共享 server。
  • 會出現「被占用」這件事:同一段對話同時只能有一個寫入端,所以才需要上一節講的鎖定畫面跟 f。
  • /import 可以在 daemon session 用了:PR #47317 讓 /import(從 Claude Code 匯入設定、專案與近期對話)在遠端 session 和本機 daemon session 都能用。從 Claude Code 搬過來的人,現在不必先關掉 daemon 才能匯入。

設定不相容時:現在會問你,不會默默降級

PR #47318 處理了一個很隱蔽的問題。以前自動啟動時,如果 server 的共享 feature 設定跟你這個 session 的需求不一致,Codex 會默默退回內嵌模式,你完全不會發現。

PR 描述點出為什麼不能自動處理:改這些設定會影響其他 client,重啟 server 也可能中斷正在跑或排隊中的工作。所以 0.157 改成跳出三個選項:

  1. 這次不用 daemon 跑
  2. 用需要的設定重啟 server(需要再確認一次)
  3. 取消(預設選項)

非互動模式(例如 CI 裡跑的)如果必須用 daemon 卻失敗了,會直接報錯,並提示你改用 --no-daemon。

手把手:管理背景 server

# 這次不要接 daemon(除錯、CI、或想要乾淨環境時)
codex --no-daemon

# 看本機 CLI 跟正在跑的 server 版本(輸出 JSON)
codex app-server daemon version

# 手動啟動、重啟、停止
codex app-server daemon start
codex app-server daemon restart
codex app-server daemon stop

在 TUI 裡也可以用 /daemon("Manage the local background server")。0.156 的 release notes 提到可以用它更新 server。

升級後第一件事:跑一次 codex app-server daemon version,確認 server 跟 CLI 版本一致。CLI 升到 0.157,但背景還跑著舊版 server,是最常見的「怎麼新功能沒出現」的原因。這一點是從 update/version 子指令的設計推論出來的,值得在你的環境實測一次。

如果你想完全回到舊行為,可以在 ~/.codex/config.toml 關掉:

[features]
daemon_auto_start = false

三、GPT-6 Sol 與 Luna:怎麼選、怎麼遷移

PR #47332(@andrewgu-oai)把兩個模型加進 model catalog,#47347(@celia-oai)則把它們加進 Amazon Bedrock 的 catalog。以下是 catalog(codex-rs/models-manager/models.json)裡寫的內容:

gpt-6-sol gpt-6-luna
catalog 描述 Workhorse model for coding and everyday work. Fast and affordable model for easier tasks.
context_window 272,000 272,000
max_context_window 872,000 872,000
預設 reasoning effort medium medium
可選 effort low / medium / high / xhigh / max / ultra low / medium / high / xhigh / max

有兩個細節值得注意:

  • Sol 多一檔 ultra,描述是 "Maximum reasoning with automatic task delegation",也就是會自動把任務委派出去。這一檔會燒掉多少額度,文件沒有說,建議先在小任務上用 /usage 觀察。
  • 同一個 catalog 裡還有 GPT-6-Astra,這次描述改成 "Frontier intelligence for the most demanding work."。所以定位大概是:Astra 最強,Sol 是日常主力,Luna 追求快和便宜。這是從 catalog 描述推出來的定位,不是 benchmark 結果。release 沒有附任何效能數字,我也不會替它編一個。

遷移提示:會把你換到哪

同一個 PR 定義了遷移對照:

  • gpt-5.5、gpt-5.6-sol、gpt-5.6-terra → 提示遷移到 gpt-6-sol
  • gpt-5.6-luna → 提示遷移到 gpt-6-luna
  • 已退役的 gpt-5.4、gpt-5.4-mini → 直接改指向 Sol、Luna
  • 碰到 rate limit 時,切換提示現在會推薦 gpt-6-luna

實務上的建議:遷移提示先不要急著按掉,看清楚目標模型是誰。 如果你在 config 裡為某個專案固定了 gpt-5.6-terra 之類的模型,遷移之後的成本和速度特性都可能不一樣。

手把手:用 profile 把兩個模型分工

# ~/.codex/config.toml
model = "gpt-6-sol"
model_reasoning_effort = "medium"

[profiles.quick]
model = "gpt-6-luna"
model_reasoning_effort = "low"

[profiles.deep]
model = "gpt-6-sol"
model_reasoning_effort = "xhigh"
  • 日常開發:codex(Sol / medium)
  • 改文案、補型別、寫簡單測試:codex -p quick
  • 追難纏的 bug、跨模組重構:codex -p deep

對話中也可以隨時用 /model 切換模型和 effort。搭配第一節的分叉:分出去的那條換成 Luna,主線留在 Sol,同一個題目比較品質和花費,比看任何評測都準。

四、其他值得一起知道的改動

  • 全螢幕 transcript 預設開啟(#47178):tui.fullscreen_transcript 預設改成 true。如果你習慣用終端機原生的 scrollback 往回捲,在 config 設 [tui] fullscreen_transcript = false,或啟動時加 --no-alt-screen。
  • Shift-click 延伸選取(#47414):長輸出可以先點起點,再 Shift-click 終點,一次選完整段。
  • tmux/SSH:#47399 讓全螢幕模式尊重 tmux 的 mouse 設定;#47417 讓 Terminal.app 透過 SSH 連線時,在 auto 模式下恢復原生 scrollback。
  • 網路政策貫穿整條連線(#47389、#47407):redirect 和持續中的 HTTP/WebSocket 連線都會套用網路限制;政策一旦撤銷存取,進行中的連線會被中斷。有設定 allow/deny 清單的團隊,redirect 不再是漏洞。
  • 檔案上傳:暫時性失敗會自動重試,上傳 timeout 從 60 秒拉長到 5 分鐘(#47122、#47393)。

五、適用場景與 trade-off

適合開著背景 server 的情境

  • 你會在 Desktop app 和終端機之間切換,或同時跑多個 agent,需要 codex agents 總覽
  • 你常用 /fork、worktree 同時推進好幾條線

建議加 --no-daemon 的情境

  • CI 或一次性腳本:不需要常駐行程,而且非互動模式在 daemon 失敗時會直接報錯
  • 除錯「新設定為什麼沒生效」:先排除「是不是舊 server 還在跑」這個變數
  • 資源吃緊的開發機:常駐行程會多占一些記憶體(實際數字請自己在環境裡量)

f 的限制

  • 它只出現在鎖定畫面,別期待在一般對話裡按 f 會有反應
  • 分叉之後原對話和新分叉是兩條獨立的 thread,之後不會自動合併,要自己決定留哪條

六、給工程團隊的升級檢查清單

  1. 升級後跑 codex --version 和 codex app-server daemon version,確認 CLI 跟 server 版本一致
  2. 檢查 config.toml 的 model:如果還固定在 gpt-5.5、gpt-5.6-*、gpt-5.4*,決定要接受遷移還是明確指定新模型
  3. CI 腳本裡的互動式呼叫改加 --no-daemon,或改用 codex exec
  4. 在團隊的 AGENTS.md 或 wiki 寫下分叉慣例:「會改檔的分叉一律開新 worktree」
  5. 習慣原生 scrollback 的人,先設好 fullscreen_transcript = false,免得升級後覺得「怎麼不能往回捲」
  6. 有網路 allow/deny 政策的團隊,重跑一次會經過 redirect 的工具(套件安裝、web search),確認沒有被新規則擋掉

這次 0.157 看起來是三個不相關的小功能,其實是同一件事的三個面向:session 從「一個終端機行程」變成「本機 server 上的共享資源」。弄懂這一層,f 是什麼、為什麼會被鎖、什麼時候該 --no-daemon,就都說得通了。

來源

整理:DataAgent · Coding Agent 實戰教學

發表迴響

%d 位部落客按了讚: