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

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

一次對 claude.exe (225MB) 和 codex.exe (308MB) 的二進制逆向分析,揭示了兩種截然不同的 Agent 協(xié)議設(shè)計哲學(xué)。

引言

AI 編程助手已經(jīng)成為許多開發(fā)者的日常工具。當(dāng)我們在終端里輸入"幫我修復(fù)這個 bug",敲下回車——背后到底發(fā)生了什么?每一次工具調(diào)用、每一個 "讓我先看看這個文件",到底對應(yīng)多少次 API 請求?每次請求都要把完整的系統(tǒng)提示詞重新發(fā)送一遍嗎?

這些問題看似是"實現(xiàn)細節(jié)",但實際上它們直接決定了推理速度、token 成本、上下文質(zhì)量,以及為什么你在一個工具里能連續(xù)對話兩小時而在另一個里半小時就開始"失憶"。

本文通過對 Claude Code(Anthropic)和 Codex CLI(OpenAI)兩個二進制文件的逆向分析,試圖回答這些問題。

一、物理形態(tài):兩個二進制文件

維度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)

兩者的共同點是都把自己編譯成了獨立可執(zhí)行文件——不是 Node.js wrapper,不是 Python 腳本,而是包含了完整運行時環(huán)境的原生二進制。這意味著你不需要安裝 Node、Python 或任何運行時依賴,下載即用。

但它們的共同點到此為止。在 API 調(diào)用機制上,兩者做出了截然不同的選擇。

二、核心差異:有狀態(tài) vs 無狀態(tài)

2.1 Claude Code:無狀態(tài) HTTP,每次全量發(fā)送

Claude Code 的每次 API 調(diào)用都是一個獨立的 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ù)這個 bug"},
 ?  {"role": "assistant", "content": [
 ? ?  {"type": "tool_use", "name": "Grep", ...}
 ?  ]},
 ?  {"role": "user", "content": [
 ? ?  {"type": "tool_result", ...}
 ?  ]},
 ?  // ... 完整歷史 ...
  ],
  "tools": [/* ~50+ 工具定義,每個包含完整 JSON Schema */],
  "max_tokens": 32000,
  "thinking": {"type": "enabled", "budget_tokens": 16000}
}

關(guān)鍵特征

  • 每次請求都攜帶完整上下文:系統(tǒng)提示詞、工具定義、完整對話歷史——全部重新發(fā)送
  • 服務(wù)端無狀態(tài):每個請求之間沒有關(guān)聯(lián),服務(wù)端不維護任何會話狀態(tài)
  • Prompt Caching 補償:Anthropic 的服務(wù)端緩存機制將重復(fù)的系統(tǒng)提示詞成本降低約 90%

2.2 Codex CLI:有狀態(tài) WebSocket,TurnStart/TurnSteer 分離

通過對 codex.exe 二進制的逆向分析,我們發(fā)現(xiàn)它實現(xiàn)了一個精巧的 有狀態(tài)協(xié)議,核心是兩個消息類型:

TurnStartParams(20 個字段)——創(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 個字段)——增量追加

TurnSteer 請求 = {
 ?  expectedTurnId: string, ? //  服務(wù)端狀態(tài)索引
 ?  // 只發(fā)送工具調(diào)用的結(jié)果,不重復(fù)系統(tǒng)提示詞和工具定義!
 ?  tool_results: [...]
}

關(guān)鍵特征

  • TurnStart 全量,TurnSteer 增量:一個 turn 內(nèi)只有第一次發(fā)送完整上下文
  • expectedTurnId 作為狀態(tài)索引:服務(wù)端通過它查找內(nèi)存中的會話狀態(tài)
  • 服務(wù)端有狀態(tài):維護 system prompt + tools + conversation history + KV cache
  • 驗證機制:如果 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
?
   累計 input tokens: 
   原始 ≈ 11K + 15K + 18K + 21K + 25K = 90,000 tokens
   考慮 Prompt Caching (system+tools 緩存后降價 90%):
   實際 ≈ 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 (截斷限制)

├─ 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
?
 累計 input tokens: ~10K + 2K + 3K + 3K + 2K = 20,000 tokens

可視化對比

同一個任務(wù)(5 步完成),input tokens 消耗:
?
Claude Code (無緩存):  ████████████████████████████████████████  90,000
Claude Code (有緩存):  ████████████████████████                  54,000
Codex CLI:             ████████                                 20,000
                       ├────────────────────────────────────────┤
                       0                                    90,000 tokens

四、技術(shù)細節(jié):Codex 的 TurnSteer 是如何工作的?

4.1 協(xié)議定義(從二進制逆向提取)

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

以及錯誤處理邏輯:

"expectedTurnId must not be empty"
"no active turn to steer"

4.2 服務(wù)端狀態(tài)維護

OpenAI 的服務(wù)端維護一個 Turn Session Store,結(jié)構(gòu)大致如下:

TurnSession {
    turn_id: "turn_abc123",
    thread_id: "thread_xyz",
    // ? 以下內(nèi)容在 TurnSteer 時不再傳輸
    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: [...],                // 已計算的 KV Cache
        position: 15432                 // 當(dāng)前 token 位置
    }
}

4.3 為什么 TurnSteer 能這么快?

關(guān)鍵是 KV Cache 復(fù)用。當(dāng) GPT-5.5 處理 TurnStart 時,它對 system prompt + tools + user message 進行了 prefill,計算結(jié)果保存在 KV cache 中。當(dāng) TurnSteer 到達時:

  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)出下一個 token。

對比 Claude Code,每次 HTTP POST 都要完整地 prefill system prompt + tools + history,即使有 Prompt Caching 降低了計費成本,prefill 的延遲是無法跳過的。

五、設(shè)計哲學(xué):兩種世界觀

5.1 為什么 Anthropic 選擇無狀態(tài) HTTP?

Claude Code 的設(shè)計哲學(xué):
  "可靠性 > 效率"
  "簡單 > 精巧"

優(yōu)點:
├─ 容錯性極強: 任何一個請求失敗,重試就是完整的
├─ 服務(wù)端簡單: 不需要維護 WebSocket 會話狀態(tài)
├─ 無狀態(tài)擴展: 請求可以路由到任意服務(wù)器
├─ 跨 turn 復(fù)用: Prompt Caching 可以橫跨多個請求
├─ 調(diào)試友好: 每個請求都是可獨立復(fù)現(xiàn)的
└─ 1M 上下文窗口: 有空間容納重復(fù)發(fā)送的開銷

代價:
├─ 每次請求都要發(fā)送完整 payload(網(wǎng)絡(luò)開銷)
├─ 每次請求都要 prefill(延遲)
└─ 依賴服務(wù)端緩存來降低成本(不是所有場景都生效)

5.2 為什么 OpenAI 選擇有狀態(tài) WebSocket?

Codex CLI 的設(shè)計哲學(xué):
  "效率 > 簡單"
  "精巧 > 通用"

優(yōu)點:
├─ Token 成本極低: turn 內(nèi)不重復(fù)發(fā)送上下文
├─ TTFT 極低: KV Cache 持續(xù)復(fù)用
├─ 實時性好: WebSocket 天然支持 streaming + 通知
├─ 分層設(shè)計: TurnStart/TurnSteer/TurnInterrupt 各司其職
└─ 協(xié)議級支持: turn 是一等概念,不是通過無狀態(tài)模擬

代價:
├─ 服務(wù)端復(fù)雜度高: 需要維護大量并發(fā) Turn Session
├─ 容錯性差: 斷連 = 整個 turn 丟失
├─ 不可跨 turn 復(fù)用: 每個用戶消息都是新 TurnStart
├─ 硬截斷風(fēng)險: 10K tokens 的截斷上限
└─ 調(diào)試困難: 無法獨立復(fù)現(xiàn)單個 TurnSteer

5.3 上下文管理策略對比

策略Claude CodeCodex CLI
窗口大小最高 1M tokens272K tokens
截斷方式Auto-compact 自動摘要10K tokens 硬截斷
長對話管理漸進壓縮 → 摘要激進截斷 → 丟失
跨 turn 記憶Memory 文件系統(tǒng)Memory 系統(tǒng) (類似)
子 Agent獨立上下文窗口共享 session

這解釋了為什么很多用戶感覺 Claude Code 在長對話中更"持久"——不是因為它不丟上下文,而是因為 1M 的窗口太大,在達到極限之前 Auto-compact 已經(jīng)幫你摘要了。而 Codex 的 10K 硬截斷意味著,如果你的對話 + system prompt + tools 超過了這個閾值,早期內(nèi)容會被直接丟棄。

六、模型配置對比(從二進制中提?。?/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ù)留擴展) GPT-5.4-Mini:小型快速模型 GPT-5.3-Codex:編程優(yōu)化模型(前代) GPT-5.2:長運行 Agent 優(yōu)化

七、安全與認證對比

維度Claude CodeCodex CLI
認證方式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
審批機制never / on-request / always + Reviewer Agentnever / on-request / always + Guardian Agent
遙測端點api.anthropic.comab.chatgpt.com/otlp/v1/metrics + Sentry
聯(lián)邦認證OIDC Federation + WIFJWT Agent Identity

兩者在安全模型上高度相似——都有沙箱分層、審批門控、代碼審查 Agent,這是這個品類的基本安全基線。差異主要在于實現(xiàn)細節(jié):Claude Code 支持更多企業(yè)認證方式(Vertex AI、Foundry),Codex 的 Windows 沙箱集成更深。

八、總結(jié)

問題Claude Code 的答案Codex CLI 的答案
每次 API 調(diào)用都發(fā)系統(tǒng)提示詞嗎?是。但 Prompt Caching 將成本降到 10%不。TurnStart 發(fā)一次,TurnSteer 不發(fā)
一個用戶消息調(diào)用多少次 API?N 次(每個 tool round-trip 一次 HTTP POST)1 次 TurnStart + (N-1) 次 TurnSteer
誰能用更少的 token 完成同樣任務(wù)?~54,000(有緩存時)~20,000(無緩存也低)
誰的首字延遲更低?每次都要 prefillTurnSteer 時 KV Cache 直接續(xù),接近零延遲
誰的長對話體驗更好?1M 窗口 + auto-compact272K 窗口 + 10K 硬截斷
誰的架構(gòu)更簡單?無狀態(tài) HTTP,水平擴展友好有狀態(tài) WebSocket,運維復(fù)雜度高
誰更容易調(diào)試?每個請求是獨立的、可復(fù)現(xiàn)的依賴會話狀態(tài),復(fù)現(xiàn)需要模擬整個序列

后記

差異在于它們在同一個根本問題上做出了相反的選擇:上下文狀態(tài)應(yīng)該由客戶端管理還是服務(wù)端管理?

Anthropic 的回答是:"客戶端負責(zé)每次把完整上下文發(fā)給我,我用緩存幫你省錢。" OpenAI 的回答是:"你第一次發(fā)完整上下文,后面只發(fā)增量,我?guī)湍阍诜?wù)端記著。"

兩種方案經(jīng)過各自優(yōu)化后的總成本和體驗差距并沒有看起來那么大——真正的差異在于生態(tài)位。Claude Code 靠 1M 窗口 + Prompt Caching 在"持久對話"這個場景里占優(yōu),Codex CLI 靠 KV Cache 復(fù)用在"快速迭代"的場景里更敏捷。

最終用戶感受到的差異,往往不是協(xié)議層的選擇導(dǎo)致的,而是上下文管理策略——你是愿意用大窗口容納全量歷史,還是用小窗口 做激進截斷。在這個意義上,協(xié)議設(shè)計反映的其實是產(chǎn)品理念:你要的是一個能陪你聊一下午的編程搭檔,還是一個快速高效完成當(dāng)前任務(wù)的工具。

以上就是Claude Code vs Codex CLI:AI 編程助手API調(diào)用機制的深度逆向?qū)Ρ鹊脑敿殐?nèi)容,更多關(guān)于Claude Code與Codex CLI對比的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

海宁市| 遂昌县| 宁安市| 苍山县| 鸡东县| 翼城县| 梁平县| 区。| 铜梁县| 长沙县| 登封市| 富平县| 涿鹿县| 阳新县| 九龙县| 德兴市| 永年县| 淮阳县| 革吉县| 海城市| 静宁县| 马关县| 济阳县| 峨边| 内丘县| 三台县| 万宁市| 伊宁县| 双峰县| 丹巴县| 沂水县| 新化县| 泰安市| 盐津县| 宁晋县| 宁武县| 牡丹江市| 四平市| 龙南县| 田东县| 林西县|