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 翻譯一遍,而是回答三個實際的問題:
- 背景 server 預設開起來之後,我的工作流程會有什麼不同?出問題怎麼關掉?
f到底是在什麼情況下用的?(先講結論:它不是通用的分叉鍵,很多人第一眼會誤會)- GPT-6 Sol 跟 Luna 怎麼分工?舊模型的遷移提示該怎麼處理?
以下所有行為都是對照 release notes、PR 描述跟 0.157.0 tag 的原始碼整理的。有些地方我沒有在自己的環境跑過,會直接標成「值得實測」。
本文大綱
一、先釐清:f 不是「隨時分叉」
release notes 的原文是:
Added an
fshortcut 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,現在可以直接從當下的脈絡分一條出來繼續。

那平常想分叉,要用哪個?
如果你要的是「同一段脈絡試兩種解法」,用的是早就存在的 /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",開在暫時性的分叉 |

還有一個容易踩的坑:分叉複製的是對話,不是你的檔案系統。 原始碼的測試 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 建立起來」。流程大概是:
- 在主對話裡先讓 agent 把問題講清楚,但不要讓它動手,例如:
先不要改任何檔案。讀完 src/billing/ 之後,列出造成重複扣款的可能原因, 並提出兩種修法:A 是最小修補,B 是重構 retry 邏輯。每種列出會動到的檔案。 - 輸入
/fork,選New worktree - 在分叉那條輸入:
採用修法 B,實作並補上測試,完成後跑 pnpm test - 回到主線輸入:
採用修法 A,實作並補上測試 - 兩邊都跑完後,在各自的 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 改成跳出三個選項:
- 這次不用 daemon 跑
- 用需要的設定重啟 server(需要再確認一次)
- 取消(預設選項)
非互動模式(例如 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-solgpt-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,之後不會自動合併,要自己決定留哪條
六、給工程團隊的升級檢查清單
- 升級後跑
codex --version和codex app-server daemon version,確認 CLI 跟 server 版本一致 - 檢查
config.toml的model:如果還固定在gpt-5.5、gpt-5.6-*、gpt-5.4*,決定要接受遷移還是明確指定新模型 - CI 腳本裡的互動式呼叫改加
--no-daemon,或改用codex exec - 在團隊的 AGENTS.md 或 wiki 寫下分叉慣例:「會改檔的分叉一律開新 worktree」
- 習慣原生 scrollback 的人,先設好
fullscreen_transcript = false,免得升級後覺得「怎麼不能往回捲」 - 有網路 allow/deny 政策的團隊,重跑一次會經過 redirect 的工具(套件安裝、web search),確認沒有被新規則擋掉
這次 0.157 看起來是三個不相關的小功能,其實是同一件事的三個面向:session 從「一個終端機行程」變成「本機 server 上的共享資源」。弄懂這一層,f 是什麼、為什麼會被鎖、什麼時候該 --no-daemon,就都說得通了。
來源
- OpenAI Codex rust-v0.157.0 release notes:https://github.com/openai/codex/releases/tag/rust-v0.157.0
- PR #47185 Allow forking conversations locked by another app in the TUI(@fcoury-oai):https://github.com/openai/codex/pull/47185
- PR #47179 Enable automatic daemon startup by default(@etraut-openai):https://github.com/openai/codex/pull/47179
- PR #47318 Offer explicit recovery for incompatible background servers(@etraut-openai):https://github.com/openai/codex/pull/47318
- PR #47332 Add GPT-6 Sol and Luna to the model catalog(@andrewgu-oai):https://github.com/openai/codex/pull/47332
- PR #47347 Add GPT-6 Sol and Luna to Amazon Bedrock catalogs(@celia-oai):https://github.com/openai/codex/pull/47347
- PR #47178 Enable the fullscreen transcript by default(@etraut-openai):https://github.com/openai/codex/pull/47178
- OpenAI Codex rust-v0.156.0 release notes(
/daemon、--no-daemon、worktree 預設開啟):https://github.com/openai/codex/releases/tag/rust-v0.156.0 - 原始碼(tag rust-v0.157.0):
codex-rs/tui/src/slash_command.rs、codex-rs/tui/src/startup_orchestration.rs、codex-rs/cli/src/main.rs、codex-rs/models-manager/models.json
整理:DataAgent · Coding Agent 實戰教學


