客戶規定所有 AI 工具都要走公司自己的 AWS 帳號計費,於是她把 Codex CLI 接到公司的 AWS Bedrock 帳號,跑了一整週的 agentic coding 重構任務
如果你用過 Codex CLI 這種「Agentic coding(代理式編碼)讓 AI 自己連續執行多個步驟、呼叫工具、修改檔案來完成任務,而不是一問一答」的工具,你會發現每一次呼叫,AI 其實都要重新讀一遍很長的「系統指令」和「工具說明書」——這些內容通常一整個工作階段都不會變。為了不要每次都重算這一大段,模型服務商設計了「提示詞快取 (prompt caching)讓 AI 模型記住一段先前處理過的內容,之後遇到一模一樣的內容,不用重新計算,改用比較便宜的價錢重複使用」機制:第一次要把這段內容存起來,這叫「快取寫入 (cache write)第一次把某段內容存進快取要付的費用,通常比一般輸入貴一些」;之後同一段內容再出現,就能改用便宜很多的「快取命中 (cache read)之後同樣內容再出現時,用便宜很多的價錢直接讀取已經存好的結果,不用重新計算」。
問題出在「怎麼告訴系統要存快取」這件事。模型代理層需要一個明確的訊號,叫「快取斷點 (cache breakpoint)在提示詞裡標記「這裡是穩定不變的內容結尾」,告訴代理層這一段可以存起來重複使用」,插在「系統指令、工具說明書」結尾的地方。這篇文章的 issue 指出,Codex CLI 在直接呼叫 OpenAI 或 Anthropic 官方 API 時,這個機制運作正常;但當它改走 AWS Bedrock 這個「API 代理層 (provider layer)夾在你的程式和模型公司伺服器中間,負責轉送、驗證、計費的服務,例如 AWS Bedrock」時,程式碼裡卻少了塞進快取斷點標記的那段邏輯——等於每次都在跟代理層說「這是全新的內容」,快取機制形同虛設。
結果反映在帳單上:8/5 到 8/8 這 4 天,3,656 次呼叫裡,光是「快取寫入」就燒掉了約 1,182 美元,佔了整體估算費用的 85%。正常情況下,快取寫入應該只發生一次,接下來大量重複呼叫都應該走便宜的「快取命中」;但這裡幾乎每次都在付最貴的「寫入」價,代表快取從頭到尾沒有真的發揮省錢效果——而使用者從 Codex CLI 的操作介面上完全看不出任何錯誤訊息,直到月底看帳單才會發現不對勁。
| 成本類別 | 金額(美元) | 佔總費用比例 |
|---|---|---|
| 快取寫入(cache write) | $1,182.09 | 約 85% |
| 其他(一般輸入、少量快取命中等) | $204.37 | 約 15% |
| 總計 | $1,386.46 | 100% |
這段是 Codex 組請求(request body)送給 Bedrock 時的簡化示意,重點在對照「官方文件建議要加的兩個欄位」跟「Codex 實際上少加的部分」。
request_body = { "model": "openai.gpt-5.6-sol", "input": build_input_blocks(system_prompt, tool_defs, user_turns), "prompt_cache_key": session_id, # Codex 已經有帶這個 # 下面兩個欄位才是真正「叫代理層存快取」的開關—— # "prompt_cache_options": {"type": "explicit"}, # "prompt_cache_breakpoint": True, # 標記在穩定前綴的結尾}response = bedrock_client.invoke(request_body)