メインコンテンツへスキップ
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_tokens (max_tokens により中断 — テキストが空の場合があります。制限を引き上げてください)、stop_sequence、tool_use (ツール呼び出しを要求)、refusal (セーフティポリシーにより拒否。content は空の配列です — Claude の拒否で空の content が返される理由 を参照)。thinking を有効にすると、content 配列に type: "thinking" ブロックが追加され、text ブロックの前に配置されます。

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

Claude のストリーミングでは Anthropic のイベントプロトコルを使います。各メッセージには event: 名と data: ペイロードがあり、OpenAI のように各チャンクを同じように扱うのではなく、イベントタイプでディスパッチします。
固定のイベント順序と、それぞれが持つ内容は次のとおりです。 要点は、text_delta を content_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_delta と text_delta を別々にレンダリングします。Claude Effort & Thinking Guide を参照してください。

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

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

利用と課金

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

関連リンク