OpenAI Codex 應用伺服器架構與整合

OpenAI 已發布 Codex 應用伺服器,一個標準化的 JSON-RPC 協議與長時間執行的程序,旨在將 Codex 代理程式框架公開給各種客戶端應用程式。此架構讓開發者能將高保真度的代理迴圈——包括工作區探索、即時進度串流與差異產生——整合至 IDE、桌面應用程式與網頁環境,而無需重新實作核心代理邏輯。

Codex 應用伺服器架構

Codex 應用伺服器充當客戶端與「Codex 核心」之間的翻譯層,後者包含代理迴圈、工具執行邏輯與執行緒管理。

核心元件

  • Stdio Reader: 處理傳入的通訊通道。
  • Codex Message Processor: 將客戶端的 JSON-RPC 請求轉換為 Codex 核心操作,並將內部事件串流轉換為穩定、可供 UI 使用的通知。
  • Thread Manager: 管理核心會話的生命週期,為每個執行緒啟動一個核心會話。
  • Core Threads: 代理迴圈執行的實際執行環境實例。

Codex 框架

除了代理迴圈之外,應用伺服器還公開完整的 Codex 框架,內容包括:

  • Thread Lifecycle and Persistence(執行緒生命週期與持久性): 能夠建立、恢復、分支與封存對話,確保客戶端重新連線時擁有一致的時間線。
  • Configuration and Authentication(設定與驗證): 管理預設值與驗證流程,例如「使用 ChatGPT 登入」。
  • Tool Execution and Extensions(工具執行與擴充): 為 shell 與檔案工具提供沙箱環境,並整合 MCP 伺服器與技能。

對話原語

為了處理代理互動的非線性特性,應用伺服器協議使用三個核心原語,以確保彈性並便於在不同使用者介面間整合。

1. Item(項目)

項目是輸入與輸出的原子單位。每個項目(例如使用者訊息、工具執行、差異)遵循特定的生命週期:

  • item/started:項目開始。
  • item/*/delta:內容逐步串流(針對串流類型)。
  • item/completed:項目以最終負載完成。

2. Turn(回合)

回合代表由使用者輸入觸發的單一代理工作單位。它包含一系列項目,代表代理產生的中間步驟與最終輸出。

3. Thread(執行緒)

執行緒是會話的持久容器。它保存多個回合,使客戶端能重新連線至會話並呈現歷史記錄,而無需重新建構狀態。

客戶端整合模式

應用伺服器使用基於 stdio(JSONL)的 JSON-RPC,允許在多種語言(包括 Go、Python、TypeScript、Swift 與 Kotlin)中建立客戶端綁定。

本機應用與 IDE

本機客戶端(如 VS Code 擴充功能與 Codex 桌面應用)將平台特定的應用伺服器二進位檔作為子程序捆綁。某些合作夥伴,例如 Xcode,透過指向較新版本的應用伺服器二進位檔,將發布週期與客戶端解耦,以在不需完整客戶端更新的情況下採用伺服器端的改進與錯誤修正。

Codex 網頁版

在容器化環境中,工作者會配置帶有工作區的容器並啟動應用伺服器二進位檔。網頁應用透過 HTTP 與 SSE 與 Codex 後端通訊,從工作者串流事件。此機制確保即使瀏覽器分頁關閉,長時間執行的任務仍會持續。

TUI 與 Codex CLI

雖然 TUI 最初直接與 Rust 核心類型互動,但目前正重構為使用應用伺服器協議。這使得 TUI 能連接遠端 Codex 伺服器,將代理保持在計算資源附近,同時提供本機更新。

整合方式比較

OpenAI 建議需要完整框架的使用者採用應用伺服器,但也提供其他依據特定使用情境的選項:

方法 最佳使用情境 折衷
Codex App Server 完整框架、穩定的 UI 友好事件串流與驗證管理。 需要自行建立客戶端 JSON-RPC 綁定。
MCP Server 現有基於 MCP 的工作流程,將 Codex 作為可呼叫工具。 受限於 MCP 語意;缺乏如差異更新等豐富會話功能。
Cross-provider Protocols 協調不同模型提供者的多個代理。 通常僅限於共同的功能子集,缺乏特定提供者的語意。
CLI Mode 一次性任務、CI/CD 流程與非互動式自動化。 非互動式;設計為單指令完成。
TypeScript Library 在 TypeScript 應用程式中以程式方式控制本機代理。 目前支援的語言較少,功能範圍也較應用伺服器小。

應用伺服器的原始碼可在開源的 Codex CLI 倉庫中取得。

Sources