最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 CodeCodex CLI
文件claude.execodex.exe
路徑npm/@anthropic-ai/claude-code/bin/npm/@openai/codex/.../bin/
大小225 MB308 MB
類型PE32+ Console x86-64PE32+ Console x86-64
節(jié)數(shù)1210
語言TypeScript → Bun 編譯Rust → MSVC 編譯
JS 引擎Bun (JavaScriptCore)V8 (嵌入)
配置語言JSON/TOMLStarlark (Bazel 方言)
API 后端api.anthropic.comchatgpt.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í):

  1. 服務(wù)端通過 expectedTurnId 找到對應(yīng)的 session
  2. 將 tool_result 追加到 conversation_history
  3. 直接從已有的 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 CodeCodex CLI
窗口大小最高 1M tokens272K 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 CodeCodex CLI
認(rèn)證方式API Key / OAuth / AWS Bedrock / GCP Vertex / FoundryChatGPT OAuth / API Key / AWS Bedrock
沙箱策略readonly / workspace-write / danger-full-access / linux-seccompreadonly / workspace-write / danger-full-access / windows-sandbox
審批機(jī)制never / on-request / always + Reviewer Agentnever / on-request / always + Guardian Agent
遙測端點(diǎn)api.anthropic.comab.chatgpt.com/otlp/v1/metrics + Sentry
聯(lián)邦認(rèn)證OIDC Federation + WIFJWT 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(無緩存也低)
誰的首字延遲更低?每次都要 prefillTurnSteer 時(shí) KV Cache 直接續(xù),接近零延遲
誰的長對話體驗(yàn)更好?1M 窗口 + auto-compact272K 窗口 + 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)文章

最新評論

宁阳县| 姜堰市| 龙门县| 石首市| 乌兰浩特市| 巫溪县| 米易县| 安龙县| 临桂县| 抚州市| 丹东市| 教育| 堆龙德庆县| 新晃| 江门市| 枣庄市| 格尔木市| 德钦县| 敖汉旗| 平远县| 台江县| 定州市| 宜川县| 哈巴河县| 南溪县| 防城港市| 乌鲁木齐县| 乐陵市| 习水县| 内江市| 东明县| 贵定县| 云阳县| 宁海县| 定兴县| 黄龙县| 溆浦县| 江陵县| 兰坪| 曲靖市| 五河县|