Skip to main content
Claude のネイティブ形式/v1/messages)を呼び出すと、レスポンスは OpenAI 互換モードとは完全に異なります。返答は型付きの content ブロック配列であり、ストリーミングでは Anthropic の名前付きイベント SSE プロトコルを使用します。このページでは、両方のモードをどのようにパースするかを説明します。
リクエスト側(エンドポイント、anthropic-version ヘッダー、x-api-key 認証、effort / thinking パラメータ)については、Claude API の基本Claude Effort & Thinking ガイド を参照してください。このページはレスポンス側のみを扱います。例では軽量モデル claude-haiku-4-5-20251001 を使用します。

非ストリーミング応答

最上位は message オブジェクトで、答えは content 配列にありますtype によってブロックに分割されます:
答えを取得するには、content 配列を反復処理する 必要があります。OpenAI のように単一の文字列フィールドを読むことはできません:
stop_reason の値: end_turn(通常)、max_tokensmax_tokens によって切り捨てられた場合 — テキストが空かもしれません。制限を引き上げてください)、stop_sequencetool_use(ツールを呼び出したい場合)。thinking を有効にすると、content 配列に type: "thinking" ブロックが text ブロックの前に追加されます。

ストリーミング応答(named-event SSE)

Claude のストリーミングでは Anthropic のイベントプロトコルを使います。各メッセージには event: 名と data: ペイロードがあり、OpenAI のように各チャンクを同じように扱うのではなく、イベントタイプでディスパッチします。
固定のイベント順序と、それぞれが持つ内容は次のとおりです。 要点は、text_deltacontent_block_delta の中で蓄積することです。
イベントタイプは event: 行と data: ペイロードの "type" フィールドの両方にあります。どちらを使ってもディスパッチできます。公式 anthropic SDK では、base_url を https://api.apiyi.com に向ければ SDK がイベントストリームを処理してくれるため、手書きのループは不要です。
thinking(adaptive thinking)を有効にすると、最初に type: "thinking" ブロックが表示されます。増分は thinking_delta で、ブロックが閉じる前に signature_delta(thinking ブロックのシグネチャー)が表示されます。thinking を表示するには、thinking_deltatext_delta を別々にレンダリングします。Claude Effort & Thinking Guide を参照してください。

OpenAI互換モードとの主な違い

移行時に特に陥りやすい落とし穴は 2 つあります: (1) 応答は文字列ではなく 配列 です — content を反復し、type=="text" ブロックごとに処理します; (2) ストリーミングには [DONE] がありません — 終了は message_stop イベントで検出します。

利用と課金

  • 非ストリーミング: usage は結果とともに返ってきて、input_tokensoutput_tokenscache_creation_input_tokenscache_read_input_tokens が含まれます。
  • ストリーミング: input_tokensmessage_start にあり、最終的な output_tokensmessage_delta にあります — 両方をマージしてください。
  • キャッシュヒットフィールド(cache_read_input_tokens)の割引と使用量については、Claude Cache Billing を参照してください。

関連リンク