Claude Code vs Codex CLI:AI 編程助手API調(diào)用機(jī)制的深度逆向?qū)Ρ?/h1>
發(fā)布時(shí)間:2026-07-07 11:49:33 作者:i晟
我要評論
本文逆向分析了 Claude Code與Codex CLI的二進(jìn)制文件,揭示其截然不同的Agent協(xié)議設(shè)計(jì)哲學(xué),立即點(diǎn)擊,掌握無狀態(tài)HTTP與有狀態(tài)WebSocket的核心差異,學(xué)習(xí)如何影響token成本、推理速度和對話持久性
一次對 claude.exe (225MB) 和 codex.exe (308MB) 的二進(jìn)制逆向分析,揭示了兩種截然不同的 Agent 協(xié)議設(shè)計(jì)哲學(xué)。

引言
AI 編程助手已經(jīng)成為許多開發(fā)者的日常工具。當(dāng)我們在終端里輸入"幫我修復(fù)這個(gè) bug",敲下回車——背后到底發(fā)生了什么?每一次工具調(diào)用、每一個(gè) "讓我先看看這個(gè)文件",到底對應(yīng)多少次 API 請求?每次請求都要把完整的系統(tǒng)提示詞重新發(fā)送一遍嗎?
這些問題看似是"實(shí)現(xiàn)細(xì)節(jié)",但實(shí)際上它們直接決定了推理速度、token 成本、上下文質(zhì)量,以及為什么你在一個(gè)工具里能連續(xù)對話兩小時(shí)而在另一個(gè)里半小時(shí)就開始"失憶"。
本文通過對 Claude Code(Anthropic)和 Codex CLI(OpenAI)兩個(gè)二進(jìn)制文件的逆向分析,試圖回答這些問題。
一、物理形態(tài):兩個(gè)二進(jìn)制文件
維度 Claude Code Codex CLI 文件 claude.execodex.exe路徑 npm/@anthropic-ai/claude-code/bin/npm/@openai/codex/.../bin/大小 225 MB 308 MB 類型 PE32+ Console x86-64 PE32+ Console x86-64 節(jié)數(shù) 12 10 語言 TypeScript → Bun 編譯 Rust → MSVC 編譯 JS 引擎 Bun (JavaScriptCore) V8 (嵌入) 配置語言 JSON/TOML Starlark (Bazel 方言) API 后端 api.anthropic.comchatgpt.com/backend-api/codexAPI 協(xié)議 Anthropic Messages API (HTTP) OpenAI Responses API (WebSocket)
兩者的共同點(diǎn)是都把自己編譯成了獨(dú)立可執(zhí)行文件——不是 Node.js wrapper,不是 Python 腳本,而是包含了完整運(yùn)行時(shí)環(huán)境的原生二進(jìn)制。這意味著你不需要安裝 Node、Python 或任何運(yùn)行時(shí)依賴,下載即用。
但它們的共同點(diǎn)到此為止。在 API 調(diào)用機(jī)制上,兩者做出了截然不同的選擇。
二、核心差異:有狀態(tài) vs 無狀態(tài)
2.1 Claude Code:無狀態(tài) HTTP,每次全量發(fā)送
Claude Code 的每次 API 調(diào)用都是一個(gè)獨(dú)立的 HTTP POST 請求:
POST https://api.anthropic.com/v1/messages
Authorization: x-api-key sk-ant-...
anthropic-version: 2023-06-01
Content-Type: application/json
?
{
"model": "claude-fable-5",
"system": "You are Claude... [~8000 tokens 的系統(tǒng)提示詞]",
"messages": [
? {"role": "user", "content": "幫我修復(fù)這個(gè) bug"},
? {"role": "assistant", "content": [
? ? {"type": "tool_use", "name": "Grep", ...}
? ]},
? {"role": "user", "content": [
? ? {"type": "tool_result", ...}
? ]},
? // ... 完整歷史 ...
],
"tools": [/* ~50+ 工具定義,每個(gè)包含完整 JSON Schema */],
"max_tokens": 32000,
"thinking": {"type": "enabled", "budget_tokens": 16000}
}
關(guān)鍵特征:
- 每次請求都攜帶完整上下文:系統(tǒng)提示詞、工具定義、完整對話歷史——全部重新發(fā)送
- 服務(wù)端無狀態(tài):每個(gè)請求之間沒有關(guān)聯(lián),服務(wù)端不維護(hù)任何會話狀態(tài)
- Prompt Caching 補(bǔ)償:Anthropic 的服務(wù)端緩存機(jī)制將重復(fù)的系統(tǒng)提示詞成本降低約 90%
2.2 Codex CLI:有狀態(tài) WebSocket,TurnStart/TurnSteer 分離
通過對 codex.exe 二進(jìn)制的逆向分析,我們發(fā)現(xiàn)它實(shí)現(xiàn)了一個(gè)精巧的 有狀態(tài)協(xié)議,核心是兩個(gè)消息類型:
TurnStartParams(20 個(gè)字段)——創(chuàng)建會話
TurnStart 請求 = {
? clientUserMessageId: string, ? ? ? // 客戶端消息 ID
? input: UserInput, ? ? ? ? ? ? ? ? // 用戶輸入
? responsesapiClientMetadata: {...}, // 客戶端元數(shù)據(jù) (版本/OS/終端類型)
? additionalContext: [...], ? ? ? ? // Skills, Memory, Git status...
? environments: {...}, ? ? ? ? ? ? ? // 環(huán)境變量
? runtimeWorkspaceRoots: [...], ? ? // 工作區(qū)根目錄
? approvalPolicy: string, ? ? ? ? ? // on-request | never | always
? approvalsReviewer: string, ? ? ? ? // 審核者設(shè)置
? sandboxPolicy: string, ? ? ? ? ? ? // readonly | workspace-write | ...
? serviceTier: string, ? ? ? ? ? ? ? // Free | Plus | Pro | Team | Enterprise
? effort: string, ? ? ? ? ? ? ? ? ? // low | medium | high | xhigh
? outputSchema: {...}, ? ? ? ? ? ? ? // 輸出格式約束
? collaborationMode: string, ? ? ? ? // primary | review | ...
? multiAgentMode: string, ? ? ? ? ? // disabled | proactive | ultra
? ?
? // 系統(tǒng)提示詞和工具定義也在此發(fā)送!
? system_prompt: "...",
? tools: [...]
}
TurnSteerParams(6 個(gè)字段)——增量追加
TurnSteer 請求 = {
? expectedTurnId: string, ? // 服務(wù)端狀態(tài)索引
? // 只發(fā)送工具調(diào)用的結(jié)果,不重復(fù)系統(tǒng)提示詞和工具定義!
? tool_results: [...]
}
關(guān)鍵特征:
- TurnStart 全量,TurnSteer 增量:一個(gè) turn 內(nèi)只有第一次發(fā)送完整上下文
- expectedTurnId 作為狀態(tài)索引:服務(wù)端通過它查找內(nèi)存中的會話狀態(tài)
- 服務(wù)端有狀態(tài):維護(hù) system prompt + tools + conversation history + KV cache
- 驗(yàn)證機(jī)制:如果 expectedTurnId 不匹配當(dāng)前活躍 turn → 返回 400 "no active turn to steer"
三、協(xié)議對比:一次用戶交互的全流程
假設(shè)用戶輸入"幫我修復(fù) login 模塊的空指針異常",模型需要 5 步完成(搜索 → 讀取 → 分析 → 編輯 → 總結(jié))。
Claude Code 的流程
用戶消息 #1 (Turn 開始)
│
├─ API 請求 #1: POST /v1/messages
│ ├─ system: [8,000 tokens]
│ ├─ tools: [2,000 tokens]
│ ├─ user_msg: "幫我修復(fù)..."
│ └─ 總輸入: ~11,000 tokens
│
├─ API 請求 #2: POST /v1/messages
│ ├─ system: [8,000 tokens] ← 再次發(fā)送
│ ├─ tools: [2,000 tokens] ← 再次發(fā)送
│ ├─ 完整歷史 + tool_result
│ └─ 總輸入: ~15,000 tokens
│
├─ API 請求 #3: POST /v1/messages
│ ├─ system: [8,000 tokens] ← 再次發(fā)送
│ ├─ tools: [2,000 tokens] ← 再次發(fā)送
│ ├─ 完整歷史 + tool_result
│ └─ 總輸入: ~18,000 tokens
│
├─ API 請求 #4: ... (繼續(xù)累積)
│
└─ API 請求 #5: ...
└─ 總輸入: ~25,000 tokens
?
累計(jì) input tokens:
原始 ≈ 11K + 15K + 18K + 21K + 25K = 90,000 tokens
考慮 Prompt Caching (system+tools 緩存后降價(jià) 90%):
實(shí)際 ≈ 11K + 6K + 9K + 12K + 16K = 54,000 tokens
Codex CLI 的流程
用戶消息 #1 (Turn 開始)
│
├─ TurnStart (WebSocket msg #1)
│ ├─ system_prompt: [3,000 tokens]
│ ├─ tools: [5,000 tokens]
│ ├─ context: [2,000 tokens]
│ └─ 總輸入: ~10,000 tokens (截?cái)嘞拗?
│
├─ TurnSteer (WebSocket msg #2)
│ ├─ 只發(fā)增量: tool_result + next_prompt
│ ├─ 不重復(fù) system_prompt
│ ├─ 不重復(fù) tools
│ └─ 總增量: ~2,000 tokens
│
├─ TurnSteer (WebSocket msg #3)
│ └─ 增量: ~3,000 tokens
│
├─ TurnSteer (WebSocket msg #4)
│ └─ 增量: ~3,000 tokens
│
└─ TurnSteer (WebSocket msg #5)
└─ 增量: ~2,000 tokens
?
累計(jì) input tokens: ~10K + 2K + 3K + 3K + 2K = 20,000 tokens
可視化對比
同一個(gè)任務(wù)(5 步完成),input tokens 消耗:
?
Claude Code (無緩存): ████████████████████████████████████████ 90,000
Claude Code (有緩存): ████████████████████████ 54,000
Codex CLI: ████████ 20,000
├────────────────────────────────────────┤
0 90,000 tokens
四、技術(shù)細(xì)節(jié):Codex 的 TurnSteer 是如何工作的?
4.1 協(xié)議定義(從二進(jìn)制逆向提?。?/h3>
在 codex.exe 的 .rdata 段中,找到了嵌入的 TypeScript 類型定義文件:
// TurnSteerParams.ts (嵌入在 codex.exe 中的源文件)
/**
* Required active turn id precondition.
* The request fails when it does not match the currently active turn.
*/
expectedTurnId: string
以及錯(cuò)誤處理邏輯:
"expectedTurnId must not be empty"
"no active turn to steer"
4.2 服務(wù)端狀態(tài)維護(hù)
OpenAI 的服務(wù)端維護(hù)一個(gè) Turn Session Store,結(jié)構(gòu)大致如下:
TurnSession {
turn_id: "turn_abc123",
thread_id: "thread_xyz",
// ? 以下內(nèi)容在 TurnSteer 時(shí)不再傳輸
system_prompt: { // 完整的系統(tǒng)指令
base_instructions: "...",
personality: "friendly",
skills: [...],
memory_entries: [...]
},
tool_registry: { // 完整的工具注冊表
"fs/readFile": { schema: {...} },
"fs/writeFile": { schema: {...} },
"command/exec": { schema: {...} },
// ... 50+ 工具
},
conversation: [ // 累積的完整對話
{role: "user", content: "..."},
{role: "assistant", tool_calls: [...]},
{role: "tool", content: "..."},
// ...
],
settings: { // Turn 級設(shè)置快照
approval_policy: "on-request",
sandbox_policy: "workspace-write",
service_tier: "plus",
effort: "medium"
},
model_state: { // GPT-5.5 推理狀態(tài)
kv_cache: [...], // 已計(jì)算的 KV Cache
position: 15432 // 當(dāng)前 token 位置
}
}
4.3 為什么 TurnSteer 能這么快?
關(guān)鍵是 KV Cache 復(fù)用。當(dāng) GPT-5.5 處理 TurnStart 時(shí),它對 system prompt + tools + user message 進(jìn)行了 prefill,計(jì)算結(jié)果保存在 KV cache 中。當(dāng) TurnSteer 到達(dá)時(shí):
- 服務(wù)端通過
expectedTurnId 找到對應(yīng)的 session - 將 tool_result 追加到 conversation_history
- 直接從已有的 KV cache 繼續(xù)解碼,不需要重新 prefill
這意味著 TurnSteer 的 Time-To-First-Token (TTFT) 接近零——模型不需要重新處理系統(tǒng)提示詞和工具定義,直接產(chǎn)出下一個(gè) token。
對比 Claude Code,每次 HTTP POST 都要完整地 prefill system prompt + tools + history,即使有 Prompt Caching 降低了計(jì)費(fèi)成本,prefill 的延遲是無法跳過的。
五、設(shè)計(jì)哲學(xué):兩種世界觀
5.1 為什么 Anthropic 選擇無狀態(tài) HTTP?
Claude Code 的設(shè)計(jì)哲學(xué):
"可靠性 > 效率"
"簡單 > 精巧"
優(yōu)點(diǎn):
├─ 容錯(cuò)性極強(qiáng): 任何一個(gè)請求失敗,重試就是完整的
├─ 服務(wù)端簡單: 不需要維護(hù) WebSocket 會話狀態(tài)
├─ 無狀態(tài)擴(kuò)展: 請求可以路由到任意服務(wù)器
├─ 跨 turn 復(fù)用: Prompt Caching 可以橫跨多個(gè)請求
├─ 調(diào)試友好: 每個(gè)請求都是可獨(dú)立復(fù)現(xiàn)的
└─ 1M 上下文窗口: 有空間容納重復(fù)發(fā)送的開銷
代價(jià):
├─ 每次請求都要發(fā)送完整 payload(網(wǎng)絡(luò)開銷)
├─ 每次請求都要 prefill(延遲)
└─ 依賴服務(wù)端緩存來降低成本(不是所有場景都生效)
5.2 為什么 OpenAI 選擇有狀態(tài) WebSocket?
Codex CLI 的設(shè)計(jì)哲學(xué):
"效率 > 簡單"
"精巧 > 通用"
優(yōu)點(diǎn):
├─ Token 成本極低: turn 內(nèi)不重復(fù)發(fā)送上下文
├─ TTFT 極低: KV Cache 持續(xù)復(fù)用
├─ 實(shí)時(shí)性好: WebSocket 天然支持 streaming + 通知
├─ 分層設(shè)計(jì): TurnStart/TurnSteer/TurnInterrupt 各司其職
└─ 協(xié)議級支持: turn 是一等概念,不是通過無狀態(tài)模擬
代價(jià):
├─ 服務(wù)端復(fù)雜度高: 需要維護(hù)大量并發(fā) Turn Session
├─ 容錯(cuò)性差: 斷連 = 整個(gè) turn 丟失
├─ 不可跨 turn 復(fù)用: 每個(gè)用戶消息都是新 TurnStart
├─ 硬截?cái)囡L(fēng)險(xiǎn): 10K tokens 的截?cái)嗌舷?br />└─ 調(diào)試?yán)щy: 無法獨(dú)立復(fù)現(xiàn)單個(gè) TurnSteer
5.3 上下文管理策略對比
策略 Claude Code Codex CLI 窗口大小 最高 1M tokens 272K tokens 截?cái)喾绞?/strong> Auto-compact 自動摘要 10K tokens 硬截?cái)?/td> 長對話管理 漸進(jìn)壓縮 → 摘要 激進(jìn)截?cái)?→ 丟失 跨 turn 記憶 Memory 文件系統(tǒng) Memory 系統(tǒng) (類似) 子 Agent 獨(dú)立上下文窗口 共享 session
這解釋了為什么很多用戶感覺 Claude Code 在長對話中更"持久"——不是因?yàn)樗粊G上下文,而是因?yàn)?1M 的窗口太大,在達(dá)到極限之前 Auto-compact 已經(jīng)幫你摘要了。而 Codex 的 10K 硬截?cái)嘁馕吨?,如果你的對?+ system prompt + tools 超過了這個(gè)閾值,早期內(nèi)容會被直接丟棄。
六、模型配置對比(從二進(jìn)制中提?。?/h2>
Claude Code 的模型列表(環(huán)境變量定義)
ANTHROPIC_DEFAULT_FABLE_MODEL → claude-fable-5
ANTHROPIC_DEFAULT_OPUS_MODEL → claude-opus-4-8
ANTHROPIC_DEFAULT_SONNET_MODEL → claude-sonnet-4-6
ANTHROPIC_DEFAULT_HAIKU_MODEL → claude-haiku-4-5
ANTHROPIC_SMALL_FAST_MODEL → (備選快速模型)
Opus 4.8 配置:1M context window, 支持 extended thinking Fable 5 配置:Mythos-class tier, 共享底層模型
Codex CLI 的模型列表(嵌入 JSON)
{
"slug": "gpt-5.5",
"display_name": "GPT-5.5",
"description": "Frontier model for complex coding, research, and real-world work.",
"context_window": 272000,
"max_context_window": 272000,
"auto_compact_token_limit": null,
"truncation_policy": { "mode": "tokens", "limit": 10000 },
"default_reasoning_level": "medium",
"supports_parallel_tool_calls": true
}
GPT-5.4:同樣 272K 窗口,但 max_context_window: 1,000,000(預(yù)留擴(kuò)展) GPT-5.4-Mini:小型快速模型 GPT-5.3-Codex:編程優(yōu)化模型(前代) GPT-5.2:長運(yùn)行 Agent 優(yōu)化
七、安全與認(rèn)證對比
維度 Claude Code Codex CLI 認(rèn)證方式 API Key / OAuth / AWS Bedrock / GCP Vertex / Foundry ChatGPT OAuth / API Key / AWS Bedrock 沙箱策略 readonly / workspace-write / danger-full-access / linux-seccomp readonly / workspace-write / danger-full-access / windows-sandbox 審批機(jī)制 never / on-request / always + Reviewer Agent never / on-request / always + Guardian Agent 遙測端點(diǎn) api.anthropic.comab.chatgpt.com/otlp/v1/metrics + Sentry聯(lián)邦認(rèn)證 OIDC Federation + WIF JWT Agent Identity
兩者在安全模型上高度相似——都有沙箱分層、審批門控、代碼審查 Agent,這是這個(gè)品類的基本安全基線。差異主要在于實(shí)現(xiàn)細(xì)節(jié):Claude Code 支持更多企業(yè)認(rèn)證方式(Vertex AI、Foundry),Codex 的 Windows 沙箱集成更深。
八、總結(jié)
問題 Claude Code 的答案 Codex CLI 的答案 每次 API 調(diào)用都發(fā)系統(tǒng)提示詞嗎? 是。但 Prompt Caching 將成本降到 10% 不。TurnStart 發(fā)一次,TurnSteer 不發(fā) 一個(gè)用戶消息調(diào)用多少次 API? N 次(每個(gè) tool round-trip 一次 HTTP POST) 1 次 TurnStart + (N-1) 次 TurnSteer 誰能用更少的 token 完成同樣任務(wù)? ~54,000(有緩存時(shí)) ~20,000(無緩存也低) 誰的首字延遲更低? 每次都要 prefill TurnSteer 時(shí) KV Cache 直接續(xù),接近零延遲 誰的長對話體驗(yàn)更好? 1M 窗口 + auto-compact 272K 窗口 + 10K 硬截?cái)?/td> 誰的架構(gòu)更簡單? 無狀態(tài) HTTP,水平擴(kuò)展友好 有狀態(tài) WebSocket,運(yùn)維復(fù)雜度高 誰更容易調(diào)試? 每個(gè)請求是獨(dú)立的、可復(fù)現(xiàn)的 依賴會話狀態(tài),復(fù)現(xiàn)需要模擬整個(gè)序列
后記
差異在于它們在同一個(gè)根本問題上做出了相反的選擇:上下文狀態(tài)應(yīng)該由客戶端管理還是服務(wù)端管理?
Anthropic 的回答是:"客戶端負(fù)責(zé)每次把完整上下文發(fā)給我,我用緩存幫你省錢。" OpenAI 的回答是:"你第一次發(fā)完整上下文,后面只發(fā)增量,我?guī)湍阍诜?wù)端記著。"
兩種方案經(jīng)過各自優(yōu)化后的總成本和體驗(yàn)差距并沒有看起來那么大——真正的差異在于生態(tài)位。Claude Code 靠 1M 窗口 + Prompt Caching 在"持久對話"這個(gè)場景里占優(yōu),Codex CLI 靠 KV Cache 復(fù)用在"快速迭代"的場景里更敏捷。
最終用戶感受到的差異,往往不是協(xié)議層的選擇導(dǎo)致的,而是上下文管理策略——你是愿意用大窗口容納全量歷史,還是用小窗口 做激進(jìn)截?cái)?。在這個(gè)意義上,協(xié)議設(shè)計(jì)反映的其實(shí)是產(chǎn)品理念:你要的是一個(gè)能陪你聊一下午的編程搭檔,還是一個(gè)快速高效完成當(dāng)前任務(wù)的工具。
以上就是Claude Code vs Codex CLI:AI 編程助手API調(diào)用機(jī)制的深度逆向?qū)Ρ鹊脑敿?xì)內(nèi)容,更多關(guān)于Claude Code與Codex CLI對比的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章

Codex 與 Claude Code 安裝配置實(shí)戰(zhàn)指南
本教程詳細(xì)介紹 Codex 與 Claude Code 在 Windows、Mac、Linux 三大主流操作系統(tǒng)上的安裝與配置方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧 2026-06-02 
Claude Code 與 Codex Harness 設(shè)計(jì)對比分析:一種加法,一種減法
文章對比了ClaudeCode和CodexCLI的設(shè)計(jì)哲學(xué),從技術(shù)棧、主循環(huán)、工具系統(tǒng)、壓縮、權(quán)限、子agent、擴(kuò)展機(jī)制、跨端、成本與可觀測性等8個(gè)維度進(jìn)行了深入分析,感興趣的朋友跟隨 2026-05-20 
Cursor vs Claude Code vs Codex三款A(yù)I編程工具深度對比及實(shí)戰(zhàn)建議
在AI編程工具快速發(fā)展的2025年,Claude Code和Codex展現(xiàn)出差異化優(yōu)勢,下面這篇文章主要介紹了Cursor vs Claude Code vs Codex三款A(yù)I編程工具深度對比及實(shí)戰(zhàn)建議的相關(guān)資料, 2026-04-20
最新評論
一次對 claude.exe (225MB) 和 codex.exe (308MB) 的二進(jìn)制逆向分析,揭示了兩種截然不同的 Agent 協(xié)議設(shè)計(jì)哲學(xué)。

引言
AI 編程助手已經(jīng)成為許多開發(fā)者的日常工具。當(dāng)我們在終端里輸入"幫我修復(fù)這個(gè) bug",敲下回車——背后到底發(fā)生了什么?每一次工具調(diào)用、每一個(gè) "讓我先看看這個(gè)文件",到底對應(yīng)多少次 API 請求?每次請求都要把完整的系統(tǒng)提示詞重新發(fā)送一遍嗎?
這些問題看似是"實(shí)現(xiàn)細(xì)節(jié)",但實(shí)際上它們直接決定了推理速度、token 成本、上下文質(zhì)量,以及為什么你在一個(gè)工具里能連續(xù)對話兩小時(shí)而在另一個(gè)里半小時(shí)就開始"失憶"。
本文通過對 Claude Code(Anthropic)和 Codex CLI(OpenAI)兩個(gè)二進(jìn)制文件的逆向分析,試圖回答這些問題。
一、物理形態(tài):兩個(gè)二進(jìn)制文件
| 維度 | Claude Code | Codex CLI |
|---|---|---|
| 文件 | claude.exe | codex.exe |
| 路徑 | npm/@anthropic-ai/claude-code/bin/ | npm/@openai/codex/.../bin/ |
| 大小 | 225 MB | 308 MB |
| 類型 | PE32+ Console x86-64 | PE32+ Console x86-64 |
| 節(jié)數(shù) | 12 | 10 |
| 語言 | TypeScript → Bun 編譯 | Rust → MSVC 編譯 |
| JS 引擎 | Bun (JavaScriptCore) | V8 (嵌入) |
| 配置語言 | JSON/TOML | Starlark (Bazel 方言) |
| API 后端 | api.anthropic.com | chatgpt.com/backend-api/codex |
| API 協(xié)議 | Anthropic Messages API (HTTP) | OpenAI Responses API (WebSocket) |
兩者的共同點(diǎn)是都把自己編譯成了獨(dú)立可執(zhí)行文件——不是 Node.js wrapper,不是 Python 腳本,而是包含了完整運(yùn)行時(shí)環(huán)境的原生二進(jìn)制。這意味著你不需要安裝 Node、Python 或任何運(yùn)行時(shí)依賴,下載即用。
但它們的共同點(diǎn)到此為止。在 API 調(diào)用機(jī)制上,兩者做出了截然不同的選擇。
二、核心差異:有狀態(tài) vs 無狀態(tài)
2.1 Claude Code:無狀態(tài) HTTP,每次全量發(fā)送
Claude Code 的每次 API 調(diào)用都是一個(gè)獨(dú)立的 HTTP POST 請求:
POST https://api.anthropic.com/v1/messages
Authorization: x-api-key sk-ant-...
anthropic-version: 2023-06-01
Content-Type: application/json
?
{
"model": "claude-fable-5",
"system": "You are Claude... [~8000 tokens 的系統(tǒng)提示詞]",
"messages": [
? {"role": "user", "content": "幫我修復(fù)這個(gè) bug"},
? {"role": "assistant", "content": [
? ? {"type": "tool_use", "name": "Grep", ...}
? ]},
? {"role": "user", "content": [
? ? {"type": "tool_result", ...}
? ]},
? // ... 完整歷史 ...
],
"tools": [/* ~50+ 工具定義,每個(gè)包含完整 JSON Schema */],
"max_tokens": 32000,
"thinking": {"type": "enabled", "budget_tokens": 16000}
}關(guān)鍵特征:
- 每次請求都攜帶完整上下文:系統(tǒng)提示詞、工具定義、完整對話歷史——全部重新發(fā)送
- 服務(wù)端無狀態(tài):每個(gè)請求之間沒有關(guān)聯(lián),服務(wù)端不維護(hù)任何會話狀態(tài)
- Prompt Caching 補(bǔ)償:Anthropic 的服務(wù)端緩存機(jī)制將重復(fù)的系統(tǒng)提示詞成本降低約 90%
2.2 Codex CLI:有狀態(tài) WebSocket,TurnStart/TurnSteer 分離
通過對 codex.exe 二進(jìn)制的逆向分析,我們發(fā)現(xiàn)它實(shí)現(xiàn)了一個(gè)精巧的 有狀態(tài)協(xié)議,核心是兩個(gè)消息類型:
TurnStartParams(20 個(gè)字段)——創(chuàng)建會話
TurnStart 請求 = {
? clientUserMessageId: string, ? ? ? // 客戶端消息 ID
? input: UserInput, ? ? ? ? ? ? ? ? // 用戶輸入
? responsesapiClientMetadata: {...}, // 客戶端元數(shù)據(jù) (版本/OS/終端類型)
? additionalContext: [...], ? ? ? ? // Skills, Memory, Git status...
? environments: {...}, ? ? ? ? ? ? ? // 環(huán)境變量
? runtimeWorkspaceRoots: [...], ? ? // 工作區(qū)根目錄
? approvalPolicy: string, ? ? ? ? ? // on-request | never | always
? approvalsReviewer: string, ? ? ? ? // 審核者設(shè)置
? sandboxPolicy: string, ? ? ? ? ? ? // readonly | workspace-write | ...
? serviceTier: string, ? ? ? ? ? ? ? // Free | Plus | Pro | Team | Enterprise
? effort: string, ? ? ? ? ? ? ? ? ? // low | medium | high | xhigh
? outputSchema: {...}, ? ? ? ? ? ? ? // 輸出格式約束
? collaborationMode: string, ? ? ? ? // primary | review | ...
? multiAgentMode: string, ? ? ? ? ? // disabled | proactive | ultra
? ?
? // 系統(tǒng)提示詞和工具定義也在此發(fā)送!
? system_prompt: "...",
? tools: [...]
}
TurnSteerParams(6 個(gè)字段)——增量追加
TurnSteer 請求 = {
? expectedTurnId: string, ? // 服務(wù)端狀態(tài)索引
? // 只發(fā)送工具調(diào)用的結(jié)果,不重復(fù)系統(tǒng)提示詞和工具定義!
? tool_results: [...]
}
關(guān)鍵特征:
- TurnStart 全量,TurnSteer 增量:一個(gè) turn 內(nèi)只有第一次發(fā)送完整上下文
- expectedTurnId 作為狀態(tài)索引:服務(wù)端通過它查找內(nèi)存中的會話狀態(tài)
- 服務(wù)端有狀態(tài):維護(hù) system prompt + tools + conversation history + KV cache
- 驗(yàn)證機(jī)制:如果 expectedTurnId 不匹配當(dāng)前活躍 turn → 返回 400 "no active turn to steer"
三、協(xié)議對比:一次用戶交互的全流程
假設(shè)用戶輸入"幫我修復(fù) login 模塊的空指針異常",模型需要 5 步完成(搜索 → 讀取 → 分析 → 編輯 → 總結(jié))。
Claude Code 的流程
用戶消息 #1 (Turn 開始)
│
├─ API 請求 #1: POST /v1/messages
│ ├─ system: [8,000 tokens]
│ ├─ tools: [2,000 tokens]
│ ├─ user_msg: "幫我修復(fù)..."
│ └─ 總輸入: ~11,000 tokens
│
├─ API 請求 #2: POST /v1/messages
│ ├─ system: [8,000 tokens] ← 再次發(fā)送
│ ├─ tools: [2,000 tokens] ← 再次發(fā)送
│ ├─ 完整歷史 + tool_result
│ └─ 總輸入: ~15,000 tokens
│
├─ API 請求 #3: POST /v1/messages
│ ├─ system: [8,000 tokens] ← 再次發(fā)送
│ ├─ tools: [2,000 tokens] ← 再次發(fā)送
│ ├─ 完整歷史 + tool_result
│ └─ 總輸入: ~18,000 tokens
│
├─ API 請求 #4: ... (繼續(xù)累積)
│
└─ API 請求 #5: ...
└─ 總輸入: ~25,000 tokens
?
累計(jì) input tokens:
原始 ≈ 11K + 15K + 18K + 21K + 25K = 90,000 tokens
考慮 Prompt Caching (system+tools 緩存后降價(jià) 90%):
實(shí)際 ≈ 11K + 6K + 9K + 12K + 16K = 54,000 tokens
Codex CLI 的流程
用戶消息 #1 (Turn 開始)
│
├─ TurnStart (WebSocket msg #1)
│ ├─ system_prompt: [3,000 tokens]
│ ├─ tools: [5,000 tokens]
│ ├─ context: [2,000 tokens]
│ └─ 總輸入: ~10,000 tokens (截?cái)嘞拗?
│
├─ TurnSteer (WebSocket msg #2)
│ ├─ 只發(fā)增量: tool_result + next_prompt
│ ├─ 不重復(fù) system_prompt
│ ├─ 不重復(fù) tools
│ └─ 總增量: ~2,000 tokens
│
├─ TurnSteer (WebSocket msg #3)
│ └─ 增量: ~3,000 tokens
│
├─ TurnSteer (WebSocket msg #4)
│ └─ 增量: ~3,000 tokens
│
└─ TurnSteer (WebSocket msg #5)
└─ 增量: ~2,000 tokens
?
累計(jì) input tokens: ~10K + 2K + 3K + 3K + 2K = 20,000 tokens
可視化對比
同一個(gè)任務(wù)(5 步完成),input tokens 消耗:
?
Claude Code (無緩存): ████████████████████████████████████████ 90,000
Claude Code (有緩存): ████████████████████████ 54,000
Codex CLI: ████████ 20,000
├────────────────────────────────────────┤
0 90,000 tokens
四、技術(shù)細(xì)節(jié):Codex 的 TurnSteer 是如何工作的?
4.1 協(xié)議定義(從二進(jìn)制逆向提?。?/h3>
在 codex.exe 的 .rdata 段中,找到了嵌入的 TypeScript 類型定義文件:
// TurnSteerParams.ts (嵌入在 codex.exe 中的源文件) /** * Required active turn id precondition. * The request fails when it does not match the currently active turn. */ expectedTurnId: string
以及錯(cuò)誤處理邏輯:
"expectedTurnId must not be empty" "no active turn to steer"
4.2 服務(wù)端狀態(tài)維護(hù)
OpenAI 的服務(wù)端維護(hù)一個(gè) Turn Session Store,結(jié)構(gòu)大致如下:
TurnSession {
turn_id: "turn_abc123",
thread_id: "thread_xyz",
// ? 以下內(nèi)容在 TurnSteer 時(shí)不再傳輸
system_prompt: { // 完整的系統(tǒng)指令
base_instructions: "...",
personality: "friendly",
skills: [...],
memory_entries: [...]
},
tool_registry: { // 完整的工具注冊表
"fs/readFile": { schema: {...} },
"fs/writeFile": { schema: {...} },
"command/exec": { schema: {...} },
// ... 50+ 工具
},
conversation: [ // 累積的完整對話
{role: "user", content: "..."},
{role: "assistant", tool_calls: [...]},
{role: "tool", content: "..."},
// ...
],
settings: { // Turn 級設(shè)置快照
approval_policy: "on-request",
sandbox_policy: "workspace-write",
service_tier: "plus",
effort: "medium"
},
model_state: { // GPT-5.5 推理狀態(tài)
kv_cache: [...], // 已計(jì)算的 KV Cache
position: 15432 // 當(dāng)前 token 位置
}
}4.3 為什么 TurnSteer 能這么快?
關(guān)鍵是 KV Cache 復(fù)用。當(dāng) GPT-5.5 處理 TurnStart 時(shí),它對 system prompt + tools + user message 進(jìn)行了 prefill,計(jì)算結(jié)果保存在 KV cache 中。當(dāng) TurnSteer 到達(dá)時(shí):
- 服務(wù)端通過
expectedTurnId找到對應(yīng)的 session - 將 tool_result 追加到 conversation_history
- 直接從已有的 KV cache 繼續(xù)解碼,不需要重新 prefill
這意味著 TurnSteer 的 Time-To-First-Token (TTFT) 接近零——模型不需要重新處理系統(tǒng)提示詞和工具定義,直接產(chǎn)出下一個(gè) token。
對比 Claude Code,每次 HTTP POST 都要完整地 prefill system prompt + tools + history,即使有 Prompt Caching 降低了計(jì)費(fèi)成本,prefill 的延遲是無法跳過的。
五、設(shè)計(jì)哲學(xué):兩種世界觀
5.1 為什么 Anthropic 選擇無狀態(tài) HTTP?
Claude Code 的設(shè)計(jì)哲學(xué):
"可靠性 > 效率"
"簡單 > 精巧"
優(yōu)點(diǎn):
├─ 容錯(cuò)性極強(qiáng): 任何一個(gè)請求失敗,重試就是完整的
├─ 服務(wù)端簡單: 不需要維護(hù) WebSocket 會話狀態(tài)
├─ 無狀態(tài)擴(kuò)展: 請求可以路由到任意服務(wù)器
├─ 跨 turn 復(fù)用: Prompt Caching 可以橫跨多個(gè)請求
├─ 調(diào)試友好: 每個(gè)請求都是可獨(dú)立復(fù)現(xiàn)的
└─ 1M 上下文窗口: 有空間容納重復(fù)發(fā)送的開銷
代價(jià):
├─ 每次請求都要發(fā)送完整 payload(網(wǎng)絡(luò)開銷)
├─ 每次請求都要 prefill(延遲)
└─ 依賴服務(wù)端緩存來降低成本(不是所有場景都生效)
5.2 為什么 OpenAI 選擇有狀態(tài) WebSocket?
Codex CLI 的設(shè)計(jì)哲學(xué):
"效率 > 簡單"
"精巧 > 通用"
優(yōu)點(diǎn):
├─ Token 成本極低: turn 內(nèi)不重復(fù)發(fā)送上下文
├─ TTFT 極低: KV Cache 持續(xù)復(fù)用
├─ 實(shí)時(shí)性好: WebSocket 天然支持 streaming + 通知
├─ 分層設(shè)計(jì): TurnStart/TurnSteer/TurnInterrupt 各司其職
└─ 協(xié)議級支持: turn 是一等概念,不是通過無狀態(tài)模擬
代價(jià):
├─ 服務(wù)端復(fù)雜度高: 需要維護(hù)大量并發(fā) Turn Session
├─ 容錯(cuò)性差: 斷連 = 整個(gè) turn 丟失
├─ 不可跨 turn 復(fù)用: 每個(gè)用戶消息都是新 TurnStart
├─ 硬截?cái)囡L(fēng)險(xiǎn): 10K tokens 的截?cái)嗌舷?br />└─ 調(diào)試?yán)щy: 無法獨(dú)立復(fù)現(xiàn)單個(gè) TurnSteer
5.3 上下文管理策略對比
| 策略 | Claude Code | Codex CLI |
|---|---|---|
| 窗口大小 | 最高 1M tokens | 272K tokens |
| 截?cái)喾绞?/strong> | Auto-compact 自動摘要 | 10K tokens 硬截?cái)?/td> |
| 長對話管理 | 漸進(jìn)壓縮 → 摘要 | 激進(jìn)截?cái)?→ 丟失 |
| 跨 turn 記憶 | Memory 文件系統(tǒng) | Memory 系統(tǒng) (類似) |
| 子 Agent | 獨(dú)立上下文窗口 | 共享 session |
這解釋了為什么很多用戶感覺 Claude Code 在長對話中更"持久"——不是因?yàn)樗粊G上下文,而是因?yàn)?1M 的窗口太大,在達(dá)到極限之前 Auto-compact 已經(jīng)幫你摘要了。而 Codex 的 10K 硬截?cái)嘁馕吨?,如果你的對?+ system prompt + tools 超過了這個(gè)閾值,早期內(nèi)容會被直接丟棄。
六、模型配置對比(從二進(jìn)制中提?。?/h2>
Claude Code 的模型列表(環(huán)境變量定義)
ANTHROPIC_DEFAULT_FABLE_MODEL → claude-fable-5 ANTHROPIC_DEFAULT_OPUS_MODEL → claude-opus-4-8 ANTHROPIC_DEFAULT_SONNET_MODEL → claude-sonnet-4-6 ANTHROPIC_DEFAULT_HAIKU_MODEL → claude-haiku-4-5 ANTHROPIC_SMALL_FAST_MODEL → (備選快速模型)
Opus 4.8 配置:1M context window, 支持 extended thinking Fable 5 配置:Mythos-class tier, 共享底層模型
Codex CLI 的模型列表(嵌入 JSON)
{
"slug": "gpt-5.5",
"display_name": "GPT-5.5",
"description": "Frontier model for complex coding, research, and real-world work.",
"context_window": 272000,
"max_context_window": 272000,
"auto_compact_token_limit": null,
"truncation_policy": { "mode": "tokens", "limit": 10000 },
"default_reasoning_level": "medium",
"supports_parallel_tool_calls": true
}
GPT-5.4:同樣 272K 窗口,但 max_context_window: 1,000,000(預(yù)留擴(kuò)展) GPT-5.4-Mini:小型快速模型 GPT-5.3-Codex:編程優(yōu)化模型(前代) GPT-5.2:長運(yùn)行 Agent 優(yōu)化
七、安全與認(rèn)證對比
| 維度 | Claude Code | Codex CLI |
|---|---|---|
| 認(rèn)證方式 | API Key / OAuth / AWS Bedrock / GCP Vertex / Foundry | ChatGPT OAuth / API Key / AWS Bedrock |
| 沙箱策略 | readonly / workspace-write / danger-full-access / linux-seccomp | readonly / workspace-write / danger-full-access / windows-sandbox |
| 審批機(jī)制 | never / on-request / always + Reviewer Agent | never / on-request / always + Guardian Agent |
| 遙測端點(diǎn) | api.anthropic.com | ab.chatgpt.com/otlp/v1/metrics + Sentry |
| 聯(lián)邦認(rèn)證 | OIDC Federation + WIF | JWT Agent Identity |
兩者在安全模型上高度相似——都有沙箱分層、審批門控、代碼審查 Agent,這是這個(gè)品類的基本安全基線。差異主要在于實(shí)現(xiàn)細(xì)節(jié):Claude Code 支持更多企業(yè)認(rèn)證方式(Vertex AI、Foundry),Codex 的 Windows 沙箱集成更深。
八、總結(jié)
| 問題 | Claude Code 的答案 | Codex CLI 的答案 |
|---|---|---|
| 每次 API 調(diào)用都發(fā)系統(tǒng)提示詞嗎? | 是。但 Prompt Caching 將成本降到 10% | 不。TurnStart 發(fā)一次,TurnSteer 不發(fā) |
| 一個(gè)用戶消息調(diào)用多少次 API? | N 次(每個(gè) tool round-trip 一次 HTTP POST) | 1 次 TurnStart + (N-1) 次 TurnSteer |
| 誰能用更少的 token 完成同樣任務(wù)? | ~54,000(有緩存時(shí)) | ~20,000(無緩存也低) |
| 誰的首字延遲更低? | 每次都要 prefill | TurnSteer 時(shí) KV Cache 直接續(xù),接近零延遲 |
| 誰的長對話體驗(yàn)更好? | 1M 窗口 + auto-compact | 272K 窗口 + 10K 硬截?cái)?/td> |
| 誰的架構(gòu)更簡單? | 無狀態(tài) HTTP,水平擴(kuò)展友好 | 有狀態(tài) WebSocket,運(yùn)維復(fù)雜度高 |
| 誰更容易調(diào)試? | 每個(gè)請求是獨(dú)立的、可復(fù)現(xiàn)的 | 依賴會話狀態(tài),復(fù)現(xiàn)需要模擬整個(gè)序列 |
后記
差異在于它們在同一個(gè)根本問題上做出了相反的選擇:上下文狀態(tài)應(yīng)該由客戶端管理還是服務(wù)端管理?
Anthropic 的回答是:"客戶端負(fù)責(zé)每次把完整上下文發(fā)給我,我用緩存幫你省錢。" OpenAI 的回答是:"你第一次發(fā)完整上下文,后面只發(fā)增量,我?guī)湍阍诜?wù)端記著。"
兩種方案經(jīng)過各自優(yōu)化后的總成本和體驗(yàn)差距并沒有看起來那么大——真正的差異在于生態(tài)位。Claude Code 靠 1M 窗口 + Prompt Caching 在"持久對話"這個(gè)場景里占優(yōu),Codex CLI 靠 KV Cache 復(fù)用在"快速迭代"的場景里更敏捷。
最終用戶感受到的差異,往往不是協(xié)議層的選擇導(dǎo)致的,而是上下文管理策略——你是愿意用大窗口容納全量歷史,還是用小窗口 做激進(jìn)截?cái)?。在這個(gè)意義上,協(xié)議設(shè)計(jì)反映的其實(shí)是產(chǎn)品理念:你要的是一個(gè)能陪你聊一下午的編程搭檔,還是一個(gè)快速高效完成當(dāng)前任務(wù)的工具。
以上就是Claude Code vs Codex CLI:AI 編程助手API調(diào)用機(jī)制的深度逆向?qū)Ρ鹊脑敿?xì)內(nèi)容,更多關(guān)于Claude Code與Codex CLI對比的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章

Codex 與 Claude Code 安裝配置實(shí)戰(zhàn)指南
本教程詳細(xì)介紹 Codex 與 Claude Code 在 Windows、Mac、Linux 三大主流操作系統(tǒng)上的安裝與配置方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2026-06-02
Claude Code 與 Codex Harness 設(shè)計(jì)對比分析:一種加法,一種減法
文章對比了ClaudeCode和CodexCLI的設(shè)計(jì)哲學(xué),從技術(shù)棧、主循環(huán)、工具系統(tǒng)、壓縮、權(quán)限、子agent、擴(kuò)展機(jī)制、跨端、成本與可觀測性等8個(gè)維度進(jìn)行了深入分析,感興趣的朋友跟隨2026-05-20
Cursor vs Claude Code vs Codex三款A(yù)I編程工具深度對比及實(shí)戰(zhàn)建議
在AI編程工具快速發(fā)展的2025年,Claude Code和Codex展現(xiàn)出差異化優(yōu)勢,下面這篇文章主要介紹了Cursor vs Claude Code vs Codex三款A(yù)I編程工具深度對比及實(shí)戰(zhàn)建議的相關(guān)資料,2026-04-20




