Claude · API · 解體新書
卷一畫已裝好的代理人(Claude Code),卷二畫裝代理人的工廠(Agent SDK)。卷三這次往最深的地基走 —— Claude Messages API。這是一切之下那個 HTTP 端點:Claude Code 走它、SDK 走它、世界上任何用 Claude 的應用最終都走它。拆到這一層,就等於拆到骨頭。
API 的表面只有一個動詞與一個路徑:POST /v1/messages。但這個扁平的介面背後藏著豐富的結構 — 多模 content blocks、tool 協議、SSE 串流、extended thinking、prompt caching、批次非同步處理。每一項都是可以單獨拆解的小宇宙。
本卷同樣分十回,從最簡單的 curl 一次呼叫開始,到進階的 prompt caching 與批次 API。程式碼同時呈現原始 HTTP / curl、Python SDK、與 TypeScript SDK — 你知道原始協定長什麼樣,就不會被任何一層抽象蒙蔽。
信之所至
POST /v1/messages · the only endpoint that matters
Claude API 表面上是一個 REST API,但實際上你幾乎只需要記住一條 URL:POST https://api.anthropic.com/v1/messages。一切與模型的對話都走這一條。本章拆解它的最小必要請求 — 哪些 header 非附不可、哪些欄位必填、以及三種呼叫方式(curl / Python / TypeScript)怎麼寫。
sk-ant-api03-...。請視同密碼 — 環境變數 ANTHROPIC_API_KEY 是 SDK 自動讀取的名字。2023-06-01,新功能需要這個版本以上。SDK 會自動帶。claude-opus-4-6(最強)、claude-sonnet-4-6(平衡)、claude-haiku-4-5(便宜快)。{"role": "user", "content": "..."} 物件。複雜情況見下一章。對話之骨
messages array & content blocks · the skeleton of conversation
messages 是一個陣列,依時間順序排列使用者與模型的交替輪次。每個 message 有 role("user" 或 "assistant")與 content。content 可以是一個字串(最簡)— 也可以是一個 content block 陣列(多模態、工具、思考)。本章列出所有 content block 型別與它們出現的場合。
"user" 與 "assistant"。系統指示走另一個頂層參數 system(見第肆回),不放在 messages 裡。回音之型
response envelope · what comes back & why it stopped
API 回你的不是一堆字 — 是一個結構化的 JSON envelope。裡面有九個欄位,其中 stop_reason 告訴你為什麼模型停下來、usage 告訴你花了多少 token。讀懂這兩個欄位,你的應用層就知道該繼續、該重試、還是該結算。
tool_use 迴圈 · 主要 agentic 路徑
stop_reason == "tool_use" 是 agent 框架背後最重要的分歧。看到它就表示:把 content 裡的 ToolUseBlock 取出、執行工具、把結果作為 tool_result 放進下一個 user message、再呼叫一次 API。Claude Code 與 Agent SDK 都在幫你跑這個迴圈 — API 層你要自己跑。
quota math · 計費算術
帳單上的輸入 token = input_tokens + cache_creation_input_tokens + cache_read_input_tokens。其中 cache_read 部分單價只要 10%(5m)或 8%(1h),cache_creation 則貴 25%。詳見第捌回。
諭令微調
system prompt & sampling parameters · the knobs
在 messages 之外,request body 還有一堆旋鈕可轉 — system 定義模型身分、temperature / top_p / top_k 控制隨機性、stop_sequences 設早停條件、metadata 帶請求辨識資訊。本章把這些全部列出來並給出合理預設。
/v1/messages/batches 端點,不是在 header 切換。見第拾回。器械交響
tool use protocol · request tools · parse tool_use · return tool_result
Tool use 是 API 層最精巧的協議。你宣告工具、模型決定用哪個、你執行它、把結果回傳 — 這個循環在 API 層全都要你親手跑。三個步驟:宣告(tools 欄位)、接收(ToolUseBlock)、回注(ToolResultBlock 放進下一個 user message)。
tool_choice · 強制模式
"auto"(預設)讓模型決定要不要用工具;"any" 強制它必須用某個工具(任意哪個都可以);{"type":"tool","name":"..."} 強制用特定工具。最後一種搭配單一工具可以做「強制結構化輸出」— 把 input_schema 當作你想要的 JSON 形狀。
parallel tool use · 同時多個
一個 assistant message 裡可以有多個 ToolUseBlock — 模型打算「同時呼叫這幾個」。你應該全部執行完,把全部的 ToolResultBlock 一次塞進下一則 user message 的 content 陣列,順序與 id 對應即可。
流之八事
SSE Streaming · eight event types & delta assembly
把 request body 加上 "stream": true,API 就改用 Server-Sent Events 格式回你 — 不再是一個大 JSON,而是一連串小事件。總共八種事件型別,按序出現。本章畫出它們的時間序與組裝邏輯:客戶端如何從一堆 delta 重建完整訊息。
message_start 必為第一則、message_stop 必為最後一則;中間 content_block_* 依 block index 分群串列。同一 block 的 delta 順序保持、index 不會交錯。ping 事件維持連線。你的 parser 直接忽略它。error 事件含 error.type 與 error.message。這時應該中止串流並顯示錯誤。input 是結構化的 JSON,流式傳輸時會被切成「partial JSON 字串」片段。需要累加字串後再一次 parse 成 object。messages.stream() 幫你把這八種事件組裝成增量物件並提供高階 iterator。直接用 SDK 通常不需要知道這層細節 — 但知道它幫你解決除錯問題。靜思一界
Extended Thinking · budget_tokens & thinking blocks
Extended thinking 讓模型在「回答前」先做一段結構化思考 — 這些思考以 ThinkingBlock 的形式出現在 content 陣列裡。你可以在 request 設定 thinking.budget_tokens 控制允許的思考量。這一層是透明的:你看得見思考過程,但在多輪對話中把 ThinkingBlock 原封保留回傳,模型可以「繼續原本的思考線索」。
cost · 計費方式
thinking tokens 計入 output_tokens(以輸出費率計費)。budget_tokens 是上限,不是預算消耗總量 — 模型可能用得比上限少。但若撞上限,就直接結束思考強制輸出,效果可能不如給它更多空間。
when to use · 使用時機
複雜推理、多步驟計畫、數學證明、代碼複雜 refactoring —— 給它思考空間會顯著提升品質。但一般對話、簡單問答、已經結構化好的任務 —— 開 thinking 只是增加成本與延遲。
憶之快徑
Prompt Caching · cache_control & the fast path to cheap tokens有些 prompt 的前段很長且很固定 — 例如放了 50K tokens 的 API 文件當 system prompt。每次都重送是浪費。Prompt caching 讓你標記「這段請快取」— 下次請求若開頭一致,就按 10% 的折扣價從快取讀(cache_read)而不是重新處理。本章拆解它的協議、TTL 選項、與計費模型。
cache 命中條件 · 完全一致
命中邏輯是逐 byte 比對 — 即使多一個空格、system prompt 改一個字,都會讓整段 cache 失效重建。設計 cacheable prefix 時要確保「變動部分一律放在 breakpoint 之後」,不要混在穩定內容裡。
cost math · 一個實例
50K tokens 的 system prompt,用 5m cache:第一次 50000 × 1.25 = 62500 tokens 計費;之後每次 50000 × 0.10 = 5000 tokens。若 30 分鐘內被命中 10 次 — 省下 (500000 × 0.9 − 12500) ≈ 437500 tokens 的費用。context 越大越划算。
多模之眼
Vision & Documents · image and document content blocks
Claude 可以看圖、讀 PDF、分析文件 — 都透過 content block 系統實現。ImageBlock 接受 base64 或 URL 來源、DocumentBlock 吃 PDF、SearchResultBlock 用於 RAG 管線。本章列出所有 source 型別與尺寸限制,並附實際 request 範例。
media_type。若格式不符會拒絕(HTTP 400)。批次與檔案
Message Batches & Files API · async at 50% discount若你能接受「幾分鐘到 24 小時內完成」而不是即時,可以走 Message Batches API — 價格打五折。一次提交最多 100,000 筆請求,API 會排進低優先佇列慢慢跑,跑完後把結果以 JSONL 提供下載。搭配 Files API 可讓你把大型附件(PDF、長文件)預先上傳、反覆引用而不必每次重傳。本章拆解這兩個端點的生命週期。
custom_id — 這是你自己給的識別字,用於把結果對應回原始請求。它會出現在結果檔的每一行。file_id 當作 document source 引用,效果與直接內嵌 base64 相同 — 差別在於省頻寬與方便重用。