Claude Opus 4.6 ThinkingモデルのAPIエラー解決:/v1/messagesと/v1/chat/completionsのフォーマット互換性問題完全解析

作者注:Claude Opus 4.6 Thinking モデルを API 中継経由で呼び出す際の content should be a valid list エラーの根本原因を深く分析し、/v1/messages/v1/chat/completions という2つのエンドポイントのフォーマットの違いと互換性のある解決策を解説します。

こんな場面に遭遇したことはありませんか? claude-opus-4-6-thinking モデルを /v1/chat/completions(OpenAI 形式)で呼び出すと正常に動作するのに、/v1/messages(Anthropic ネイティブ形式)に切り替えると、かえって content: Input should be a valid list というエラーが発生する。この直感に反する現象は、実は Thinking モデルが2つの API フォーマットの間に持つ深層的な互換性の問題を明らかにしています。本記事では、API の低レベルフォーマットから出発し、エラーの原因と正しい呼び出し方を徹底的に解説します。

核心的な価値: この記事を読み終えると、Thinking モデルが2つの API フォーマットでどのように振る舞うかの違いを理解し、content should be a valid list エラーを解決し、さらにマルチターン対話における thinking blocks の正しい処理方法を習得できます。

claude-opus-4-6-thinking-api-messages-vs-chat-completions-compatibility-guide-ja 图示


Claude Thinking モデル API 互換性の核心ポイント

まず、この「直感に反する」現象の本質に直接答えます。

ポイント 説明 影響
エラーの根本原因 中継サービスが content: "string"content: [list] を期待する /v1/messages に渡した フォーマット不一致により 400 エラー発生
OpenAI フォーマットで動作する理由 /v1/chat/completions は content を文字列として許可し、thinking blocks を自動的に除去 フォーマットがシンプルで互換性が高い
Anthropic フォーマットでエラーになる理由 /v1/messages は content をコンテンツブロックのリストとして厳密に要求し、thinking は必ず先頭に配置 中継サービスのフォーマット変換が不完全
モデル名の違い claude-opus-4-6-thinking は中継プラットフォームの別名、公式モデル名は claude-opus-4-6 thinking はモデル名ではなくパラメータで有効化
正しい方法 OpenAI フォーマットで呼び出すか、中継サービスが content フォーマット変換を正しく処理することを確認 適切なエンドポイント + 正しいパラメータ渡し

Claude Thinking モデル API エラーの技術的本質

このエラーメッセージ content: Input should be a valid list は、重要なフォーマットの違いを明らかにしています:

Anthropic ネイティブ API(/v1/messagescontent フィールドは、必ず コンテンツブロックの配列(list) でなければなりません:

{
  "role": "assistant",
  "content": [
    {"type": "thinking", "thinking": "この問題を分析してみましょう...", "signature": "CpcH..."},
    {"type": "text", "text": "これが私の回答です..."}
  ]
}

OpenAI 互換フォーマット(/v1/chat/completionscontent純粋な文字列 でも構いません:

{
  "role": "assistant",
  "content": "これが私の回答です..."
}

API 中継プラットフォーム(例:APIYI バックエンド)のチャネル設定が /v1/messages フォーマットの場合、上流クライアントが OpenAI フォーマットの文字列 content を送信すると、中継サービスは "string"[{"type": "text", "text": "string"}] に変換する必要があります。この変換が不完全な場合——特に Thinking モデルのレスポンスが次の会話ラウンドに戻されるとき——Input should be a valid list エラーが発生します。


Claude Thinking モデル API の2つのエンドポイントフォーマット詳細比較

この問題を理解する鍵は、2つのエンドポイントが content フィールドに対して根本的に異なる要求をすることです。

Claude Thinking モデル API フォーマットの違い

比較項目 /v1/chat/completions(OpenAI) /v1/messages(Anthropic)
content タイプ string または array 必ず array(コンテンツブロックリスト)
thinking 返却 詳細な思考過程を返さない thinking タイプのコンテンツブロックを返す
signature 受け渡し provider_specific_fields に配置 thinking ブロックの signature フィールドに直接
マルチターン会話 プレーンテキストで受け渡し、thinking の順序を気にする必要なし assistant メッセージは必ず thinking ブロックから始まる
thinking 有効化方法 モデル名サフィックスまたはパラメータ thinking: {"type": "adaptive"} パラメータ
プロンプトキャッシング サポートなし サポートあり
思考過程の可視性 不可視 可視(summarized thinking)

Claude Thinking モデル API リクエストフォーマット比較

OpenAI フォーマット呼び出し(中継シナリオに推奨)

import openai

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://vip.apiyi.com/v1"
)

response = client.chat.completions.create(
    model="claude-opus-4-6-thinking",  # 中継プラットフォームの別名
    messages=[
        {"role": "user", "content": "量子コンピューティングのビジネス展望を分析してください"}
    ],
    max_tokens=16000
)
print(response.choices[0].message.content)

Anthropic ネイティブフォーマット呼び出しコードを表示
import anthropic

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

response = client.messages.create(
    model="claude-opus-4-6",  # 公式モデル名、-thinking なし
    max_tokens=16000,
    thinking={
        "type": "adaptive"    # パラメータで thinking を有効化
    },
    messages=[
        {"role": "user", "content": "量子コンピューティングのビジネス展望を分析してください"}
    ]
)

# レスポンスの content はリストで、thinking ブロックと text ブロックを含む
for block in response.content:
    if block.type == "thinking":
        print(f"[思考過程] {block.thinking[:100]}...")
    elif block.type == "text":
        print(f"[回答] {block.text}")

重要な違い

  • モデル名は claude-opus-4-6-thinking サフィックスなし)
  • thinking は thinking={"type": "adaptive"} パラメータで有効化
  • レスポンス content はコンテンツブロックのリストで、文字列ではない
  • マルチターン会話では完全な content リスト(thinking ブロックを含む)を返す必要がある

🎯 呼び出しの推奨: Claude Thinking モデルを中継プラットフォーム経由で呼び出す場合は、/v1/chat/completions(OpenAI フォーマット)を優先的に使用してください。互換性が最も高いです。
APIYI apiyi.com プラットフォームの OpenAI 互換エンドポイントは、Thinking モデル向けにフォーマット調整が行われており、thinking blocks の変換を自動的に処理します。

claude-opus-4-6-thinking-api-messages-vs-chat-completions-compatibility-guide-ja 图示


Claude ThinkingモデルAPIでOpenAI形式の方がなぜ動作するのか

これは最も直感に反する部分です:「非ネイティブ」のOpenAI形式でClaude Thinkingモデルを呼び出す方が、互換性が良いのです。その理由は3つあります:

理由1:content形式の許容度の違い

OpenAI形式では、contentが純粋な文字列"hello"でも、コンテンツブロック配列[{"type":"text","text":"hello"}]でも許可されます。Anthropicネイティブ形式ではコンテンツブロック配列のみを受け付け、文字列形式は直接エラーになります。

クライアントコードが文字列方式でcontentを渡す場合(これはOpenAI SDKのデフォルト動作)、中継がOpenAI形式チャネルを通る場合、クライアントと上流エンドポイントの形式が一致し、変換問題は発生しません。しかし、Anthropic形式チャネルを通る場合、文字列は受け入れられなくなります。

理由2:thinking blocksの自動除去

OpenAI互換モードは、Claudeの応答中のthinking blocksを自動的に除去し、最終的なテキストのみを返します。これは次のことを意味します:

  • クライアントはthinking blocksを受け取らない
  • 次の会話ラウンドでthinking blocksを戻す必要がない
  • thinkingブロックの順序問題が存在しない

Anthropicネイティブ形式では、複数ラウンドの会話でthinking blocksを完全に保持する必要があり、さらにassistantメッセージはthinkingブロックで始まる必要があります。中継がこの順序要件を正しく処理しない場合、エラーが発生します。

理由3:thoughtSignatureの伝達問題

前述のように、Anthropic形式のthinking blocksには暗号署名(signature)が含まれており、そのまま戻す必要があります。OpenAI形式はこの部分を直接スキップします——署名を返さず、署名を戻す必要もありません。

🎯 選定アドバイス: API中継でClaude Thinkingモデルを呼び出す場合、/v1/chat/completions形式を優先的に使用し、thinking blocksの形式互換性問題を回避してください。
APIYI apiyi.comのOpenAI互換エンドポイントは、Thinkingモデルに対して完全な適応を行っています。


Claude ThinkingモデルAPI呼び出し方案の比較

Claude ThinkingモデルAPIの3つの呼び出し方案

方案 エンドポイント 形式互換性 thinking可視性 prompt caching
OpenAI形式中継 /v1/chat/completions 最高(string content) 不可視 サポートなし
Anthropicネイティブ直連 /v1/messages 厳密な形式遵守が必要 可視 サポートあり
Anthropic形式中継 /v1/messages(中継) 中継実装に依存 中継に依存 一部サポート

Claude ThinkingモデルAPIのモデル名の違い

異なるプラットフォームではThinkingモデルの命名方法が異なり、これも一般的な混乱点です:

プラットフォーム モデル名 thinking有効化方法
Anthropic公式 claude-opus-4-6 thinking: {"type": "adaptive"} パラメータ
API中継(例:APIYI) claude-opus-4-6-thinking モデル名サフィックスで暗黙的に有効化
OpenRouter anthropic/claude-opus-4.6 パラメータ有効化
AWS Bedrock anthropic.claude-opus-4-6-v1 パラメータ有効化

Anthropic公式APIでは、claude-opus-4-6-thinkingというモデル名は存在しません。-thinkingサフィックスは中継プラットフォームの命名規則であり、ユーザーがモデル名を通じて直接thinking機能を有効化できるようにし、手動でパラメータを設定する必要がないようにしています。

ヒント: APIYI apiyi.comでclaude-opus-4-6-thinkingモデル名を使用する場合、プラットフォームは自動的にリクエストにthinking: {"type": "adaptive"}パラメータを追加します。これにより、OpenAI SDKを使用してコードを変更せずに直接thinking能力を獲得できます。

Claude Thinking モデル API のよくある落とし穴と解決策

claude-opus-4-6-thinking-api-messages-vs-chat-completions-compatibility-guide-ja 图示


よくある質問

Q1: OpenAI フォーマットで Thinking モデルを呼び出すと、思考能力は失われますか?

いいえ、失われません。モデルの思考プロセスは Anthropic のサーバー側で行われ、呼び出しエンドポイントのフォーマットとは関係ありません。OpenAI フォーマットで呼び出しても、モデルは完全な思考推論を行いますが、思考プロセスのテキスト要約はクライアントに返されません。最終的な回答の質と深さは同じです。つまり、「熟考された答え」は得られますが、「思考プロセスの文字記録」は見えないということです。

Q2: どのようなシナリオで /v1/messages のネイティブフォーマットが必須ですか?

以下の2つのシナリオではネイティブフォーマットが必要です:1)モデルの思考プロセス(summarized thinking)を見る必要がある場合(デバッグ、教育、推論チェーンの表示用);2)プロンプトキャッシュを使用してコストを削減する必要がある場合。キャッシュ機能は /v1/messages エンドポイントでのみ利用可能です。これらの要件がない場合は、OpenAI フォーマットの方が簡単です。APIYI apiyi.com の OpenAI 互換エンドポイントを介して呼び出すのが最も簡単です。

Q3: APIYI バックエンドのチャネル設定が /v1/messages の場合、互換性の問題はどう解決しますか?

2つの解決策があります:1)チャネルを OpenAI タイプ(/v1/chat/completions)に切り替え、フォーマット変換の問題を根本的に回避する;2)/v1/messages チャネルを使用する必要がある場合は、中継層がクライアント側の string content を list フォーマットに正しく変換し、マルチターン対話で thinking blocks の順序付けと signature の受け渡しを適切に処理することを確認する必要があります。解決策1の方がよりシンプルで信頼性があります。

Q4: adaptive thinking と旧バージョンの extended thinking の違いは何ですか?

Opus 4.6 では thinking: {"type": "adaptive"}(適応的思考)の使用が推奨されており、モデルは問題の複雑さに基づいて思考するかどうか、そしてどの程度深く思考するかを自動的に決定します。旧バージョンの thinking: {"type": "enabled", "budget_tokens": N} は、Opus 4.6 と Sonnet 4.6 では非推奨となりました。新しいバージョンでは、思考の深さを制御する effort パラメータ(low/medium/high/max)が追加され、デフォルトは high です。


まとめ

Claude Thinking モデル API の互換性問題の核心ポイント:

  1. エラーの根本原因は content フォーマットの不一致: Anthropic ネイティブ API は content をリスト(list)として厳格に要求しますが、OpenAI フォーマットは文字列を許可します。中継チャネルが /v1/messages を使用する場合、クライアントが文字列を送信すると Input should be a valid list エラーが発生します。
  2. OpenAI フォーマットの互換性がより優れている: thinking blocks の自動除去、signature の返送不要、content を文字列にできるなど、中継シナリオでは最適な選択です。
  3. -thinking サフィックスは中継の慣例であり、公式モデル名ではない: 公式モデル名は claude-opus-4-6 で、thinking はパラメータで有効化します。

Claude Thinking モデルを API 中継で呼び出す最も簡単な方法は、OpenAI 互換フォーマットを統一して使用することです。

APIYI apiyi.com 経由での呼び出しをお勧めします。プラットフォームは Thinking モデル向けにフォーマット互換性を最適化し、無料枠と複数モデル統一インターフェースを提供しています。


📚 参考資料

  1. Claude API Extended Thinking ドキュメント: 思考モードの完全な API リファレンス

    • リンク: platform.claude.com/docs/en/build-with-claude/extended-thinking
    • 説明: adaptive thinking、effort パラメータ、コンテンツブロックフォーマットの詳細説明を含む
  2. Claude API OpenAI SDK 互換性ドキュメント: OpenAI フォーマットで Claude を呼び出す公式ガイド

    • リンク: platform.claude.com/docs/en/api/openai-sdk
    • 説明: 互換性の制限とサポートされていない機能のリストを含む
  3. Claude API エラーコードリファレンス: すべての API エラータイプの説明

    • リンク: platform.claude.com/docs/en/api/errors
    • 説明: invalid_request_error の具体的なトラブルシューティング方法を含む
  4. APIYI ドキュメントセンター: OpenAI 互換インターフェースで Claude Thinking モデルを呼び出す

    • リンク: docs.apiyi.com
    • 説明: Thinking モデル向けにフォーマットを調整し、thinking blocks 変換を自動処理

著者: APIYI 技術チーム
技術交流: コメント欄での議論を歓迎します。詳細情報は APIYI docs.apiyi.com ドキュメントセンターをご覧ください。

コメントする