OpenAI ⇄ Anthropic コンバーター
メッセージ配列を OpenAI Chat Completions と Anthropic Messages API のあいだで相互変換。system メッセージ・ツール呼び出し・画像ブロック・マルチターンに対応。ブラウザ完結、API キー不要。
これは何のため?
OpenAI の Chat Completions API と Anthropic の Messages API はどちらもマルチターン会話を扱えますが、JSON 構造が微妙に違うため、プロバイダを切り替えるとプロンプトやツール呼び出しのトレースがそのままでは通りません。差分は小さい(system メッセージの位置、tool-call と tool-use、画像ブロックの形、role: 'tool' と content 内の tool_result)ですが、締切に追われているときには 1 つ 1 つが 10 分の落とし穴になります。このコンバーターはその翻訳を担当し、OpenAI 形式の会話を貼れば Anthropic 形式が返ってきます(逆方向も同じ)。
翻訳される内容
- system メッセージ。 OpenAI は
role: "system"の通常メッセージ。Anthropic はリクエストのトップレベルsystemフィールド。移動し、複数あれば連結します。 - ツール呼び出し(assistant 側)。 OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]。Anthropic:content配列内のtool_useブロック{id, name, input}(パース済みオブジェクト、文字列ではない)。OpenAI のエスケープされた arguments を Anthropic の構造化inputにパースします。逆方向は再シリアライズします。 - ツール結果。 OpenAI:
role: "tool"、tool_call_id、contentを持つ別メッセージ。Anthropic: 次の user メッセージの content 配列内のtool_resultブロックでtool_use_idを持つ。OpenAI で連続するtoolメッセージは、複数のtool_resultを含む 1 つの Anthropic user メッセージに統合されます。 - 画像。 OpenAI:
{type:'image_url', image_url:{url}}。Anthropic:{type:'image', source:{type:'base64',media_type,data}}または URL-source。data:URL を検知して変換、それ以外の URL は URL-source として通します。 - プレーンテキスト。 OpenAI は文字列、Anthropic は文字列または 1 要素の
[{type:'text', text}]配列のどちらも受け付けます。シンプルな方を使います。
翻訳されない内容
- ストリーミングイベント。 リクエスト/レスポンスの JSON が対象で、SSE イベントストリームは扱いません。ストリームのダンプがある場合は、まず最終メッセージを再構築してください。
- プロバイダ固有のフィールド。 OpenAI の
logprobs、Anthropic のstop_sequences、サンプリングパラメータなどは、リクエストのトップレベルにあり messages の中ではないため、この変換の対象外です。 - キャッシュ制御のヒント。 Anthropic の
cache_control: {type:'ephemeral'}に対応する OpenAI の構造はありません。OpenAI → Anthropic では生き残ります(付与する元情報がないため)が、Anthropic → OpenAI では落とされます。 - ツール定義。 ツールの スキーマ(リクエストの
toolsフィールド)は messages 配列の外にあります。プロバイダごとに形が違うので別途変換してください。
よくある落とし穴
- OpenAI の引数エスケープ。 OpenAI の
argumentsは JSON エンコードされた文字列で、パース済みオブジェクトではありません。壊れている場合(稀ですが小さなモデルで起こります)、例外を投げず Anthropic のinputに_rawとして格納します。 - Anthropic のトップレベル system。 OpenAI → Anthropic の結果は
{system, messages}です。messages 配列だけ欲しい場合は.messagesを使い、API リクエストにはsystemを別途付ける点に注意してください。 - 厳格な交互順。 Anthropic は(任意の system のあと)user / assistant の厳格な交互順を要求します。コンバーターは概ね保ちますが、OpenAI ソースに user が連続している場合は Anthropic 出力でも連続するため、API は拒否します。事前にマージしてください。
- OpenAI のマルチモーダル。 画像を含む OpenAI user メッセージは文字列ではなく content 配列 を使います。これも処理しますが、入力が JSON としてパースできることを確認してください(Python の
Noneやシングルクォートは不可)。 - プライバシー。 何もページ外に出ません。変換は純粋な JS、API キーもネットワーク呼び出しもありません。