本記事では、Claude API(Anthropic)とOpenAI APIを、実際にプロダクトへ組み込む実装者の視点で比較します。両者ともに高性能なLLM APIですが、Function Callingの仕様、ストリーミングレスポンスの扱い、そしてコスト構造には無視できない差異があります。API選定やマイグレーションを検討している開発者向けに、具体的なコード例を交えながら違いを整理します。

Function Callingの仕様差

両APIとも「モデルに外部関数を呼び出させる」機能を提供していますが、呼び方と設計思想が異なります。

OpenAI APIの場合

OpenAIはtoolsパラメータに関数定義(JSON Schema)を渡し、モデルがtool_callsとして応答します。並列関数呼び出し(parallel tool calls)に対応しており、1回のレスポンスで複数の関数呼び出しをまとめて受け取れる点が特徴です。

response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=[{
        "type": "function",
        "function": {
            "name": "get_weather",
            "parameters": {...}
        }
    }],
    tool_choice="auto"
)

Claude APIの場合

Claudeも同様にtoolsで関数を定義しますが、応答はcontentブロック内にtool_useタイプとして返却されます。会話履歴に関数実行結果を戻す際はtool_resultブロックとして明示的に紐付ける必要があり、OpenAIよりもメッセージ構造がやや厳密です。

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    tools=[{
        "name": "get_weather",
        "input_schema": {...}
    }],
    messages=messages
)

実装上の注意点として、Claudeはツール定義のスキーマ検証がやや厳格で、必須フィールドの欠落や型不一致に敏感です。逆にOpenAIは柔軟に解釈する傾向があるため、Claude移行時はスキーマの見直しが必要になるケースが多く見られます。

ストリーミング処理の違い

チャットUIなどでトークンを逐次表示する場合、両APIともServer-Sent Events(SSE)ベースのストリーミングに対応しています。

実装者視点では、Claudeのイベント駆動型ストリーミングの方が型安全なパーサーを組みやすい一方、OpenAIはエコシステム(LangChainなど)のサポートが充実しており、ラッパー経由であればどちらも大差なく扱えます。

コスト構造の比較

料金はモデルグレードによって変動しますが、代表的なフラッグシップモデル同士(GPT-4o系とClaude 3.5 Sonnet系)を比較すると、入力・出力トークン単価の設計思想に違いがあります。

実装者が押さえるべき選定ポイント

まとめ

Claude APIとOpenAI APIは、機能面では近づきつつあるものの、Function Callingのメッセージ構造やストリーミングのイベント設計、コスト最適化の勘所に細かな差があります。プロダクトの要件(並列処理の有無、スキーマの厳密さ、コスト構造)に応じて使い分ける、あるいは抽象化レイヤーを設けて両対応にすることが、実装者にとって現実的な選択肢と言えるでしょう。