マルチモデルSDKの移行は、アプリ内のすべてのクライアントライブラリを置き換えることから始めるべきではありません。本番コードですでにOpenAI PythonまたはNode SDKをチャット補完に使用している場合、より安全な最初のステップは、そのクライアントサーフェスを安定させ、プロバイダーの選択を構成に移動し、トラフィックを拡大する前に互換性のあるルートの背後でClaude、Gemini、DeepSeekの動作を証明することです。
Flatkeyは、1つのキー、OpenAI互換のルーティングレイヤー、プロバイダー間のモデルアクセス、および使用状況と請求のレビューを1か所で必要とするチーム向けに構築されています。これはマルチモデルSDKの移行に役立ちますが、エンドポイントファミリー、モデルエイリアス、ストリーミング、ツールコール、および使用状況レコードをテストする必要がなくなるわけではありません。ここに記載されているすべてのコードサンプルは、ご自身のFlatkeyキーと現在のモデルカタログで検証するまで、テンプレートとして扱ってください。
実践的な目標はシンプルです。アプリがすでに知っているリクエストオブジェクトを維持し、変更が必要ないくつかの値を分離し、切り替え前に証明パケットを構築することです。
マルチモデルSDK移行の意思決定マトリックス
コードを変更する前に、このマトリックスを使用してください。これにより、安定させることができるものと、構成可能にする必要があるものを分離できます。
| レイヤー | 安定させるもの | 構成可能にするもの | 保存する証明 |
|---|---|---|---|
| SDKクライアント | 既存のOpenAI SDKのインポートとチャット補完の呼び出しパス | APIキー、ベースURL、タイムアウト、リトライポリシー | SDKバージョンと編集済みの起動構成 |
| リクエストの形式 | サポートされている場合のmessages、model、stream、基本的なtools | プロバイダー固有の追加機能とサポートされていないパラメーター | 最小限のリクエストと生のレスポンス |
| モデル選択 | support_chatやanalysis_fastなどのアプリレベルのエイリアス | ゲートウェイモデルのエイリアスとエンドポイントファミリー | モデルカタログのスクリーンショットまたはエクスポート |
| 運用 | 既存のログ、リクエストID、エラー処理 | プロバイダー、ルート、使用状況、クォータ、ロールバックのメタデータ | ダッシュボード/読み戻しの証拠 |
| リリース | 現在のアプリのデプロイパス | パーセンテージでのロールアウトとロールバックの環境変数 | ロールバックの所有者と以前の構成 |
これがマルチモデルSDK移行の中核となる規律です。ライブラリの置き換え、プロンプトの移行、プロバイダーの評価、請求の検証、本番環境へのロールアウトを1つのデプロイに混ぜないでください。
互換性に関する公式ドキュメントの見解
OpenAIのSDKは、必要なパターンをすでにサポートしています。現在のOpenAI Python READMEにはOpenAIクライアントとbase_urlオプションが記載されており、Node READMEには標準のOpenAIクライアントとチャット補完が記載されています。OpenAIのAPIリファレンスによると、Chat Completionsは会話に対するモデルの応答を作成し、ストリーミングをサポートし、チャット補完オブジェクトまたはストリームチャンクを返します。
ランタイムごとにロールアウトを分割する場合は、このチェックリストをOpenAI Python SDKカスタムベースURLガイドおよびOpenAI Node SDKベースURLガイドと組み合わせてください。最初の決定がクライアントのセットアップではなくプロバイダーのルーティングである場合は、テストワークロードを選択する前にClaude対GPT APIルーティングガイドを使用してください。
プロバイダーの互換性は異なります。
| プロバイダー | 公式の互換性シグナル | 移行への影響 |
|---|---|---|
| OpenAI SDK | Pythonはbase_urlをサポートし、NodeはbaseURLを使用します。Chat Completionsにはmessages、model、stream、ツール、および使用状況フィールドがあります。 | 最初の移行スライスではOpenAIクライアントラッパーを維持します。 |
| Anthropic / Claude | AnthropicはOpenAI SDK互換レイヤーを公開していますが、これは主にテストと比較のためであり、ほとんどのユースケースで長期的な本番パスではないと述べています。ネイティブのMessages APIは/v1/messages、max_tokens、messages、およびトップレベルのsystemパラメーターを使用します。 | 迅速な評価には互換性を使用しますが、プロバイダー固有の機能に依存する前に、ネイティブのClaudeの要件をテストしてください。 |
| Google Gemini | Googleによると、GeminiモデルはAPIキー、ベースURL、モデルを変更することでOpenAI Python、TypeScript/JavaScriptライブラリ、およびRESTを介してアクセスできます。 | GeminiはOpenAI形式のスモークテストに適した候補であり、推論とモデル固有の動作は別途検証されます。 |
| DeepSeek | DeepSeekはそのAPI形式がOpenAIおよびAnthropicと互換性があると述べています。その最初の呼び出しに関するドキュメントには、OpenAIおよびAnthropicのベースURLとOpenAI形式の例が記載されています。 | DeepSeekはOpenAIクライアントパスに適合できますが、モデル名の非推奨化や思考設定については明示的なチェックが必要です。 |
| Flatkey | Flatkeyの公開モデルページでは、openai、anthropic、geminiなどのエンドポイントタイプが公開されています。ホームページにはOpenAI互換のチャット補完ルートが表示されています。 | モデルはプロバイダー名だけでなく、エンドポイントファミリーで選択してください。 |
重要な教訓は、「OpenAI互換」とは通常、クライアントがOpenAI形式のリクエストを送信できることを意味するということです。これは、すべてのパラメーター、ツールスキーマ、推論制御、メディア入力、または使用状況フィールドがプロバイダー間で同一に動作することを意味するわけではありません。
ステップ1:クライアントの境界を固定する
マルチモデルSDKへの移行は、OpenAIクライアントを1つのローカルファクトリの背後に置くことから始めます。このファクトリは、キー、ベースURL、タイムアウト、モデルエイリアスを把握する唯一の場所であるべきです。
import os
from openai import OpenAI
def make_llm_client() -> OpenAI:
return OpenAI(
api_key=os.environ["FLATKEY_API_KEY"],
base_url=os.getenv("FLATKEY_BASE_URL", "https://router.flatkey.ai/v1"),
timeout=float(os.getenv("LLM_TIMEOUT_SECONDS", "60")),
max_retries=int(os.getenv("LLM_MAX_RETRIES", "2")),
)
client = make_llm_client()
completion = client.chat.completions.create(
model=os.environ["FLATKEY_MODEL"],
messages=[
{"role": "system", "content": "短い実装メモで回答してください。"},
{"role": "user", "content": "Reply with exactly: migration probe ok"},
],
)
print(completion.choices[0].message.content)
Nodeの場合:
import OpenAI from "openai";
export function makeLlmClient() {
return new OpenAI({
apiKey: process.env.FLATKEY_API_KEY,
baseURL: process.env.FLATKEY_BASE_URL ?? "https://router.flatkey.ai/v1",
timeout: Number(process.env.LLM_TIMEOUT_MS ?? 60000),
maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 2),
});
}
const client = makeLlmClient();
const completion = await client.chat.completions.create({
model: process.env.FLATKEY_MODEL,
messages: [
{ role: "system", content: "短い実装メモで回答してください。" },
{ role: "user", content: "Reply with exactly: migration probe ok" },
],
});
console.log(completion.choices[0].message.content);
アプリは、コントローラー、ワーカー、スクリプト全体でクライアントを構築するのではなく、make_llm_client() または makeLlmClient() を呼び出す必要があります。この単一の境界こそが、マルチモデルSDKへの移行を可逆的に保つことを可能にします。
ステップ2:モデルとエンドポイントのマップを構築する
すべてのワークロードを1つの新しいモデル名に向けるべきではありません。ワークロード、エンドポイントファミリー、現在のプロバイダー、ターゲットプロバイダー、ロールバック値を指定するマップから始めましょう。
| ワークロード | エンドポイントファミリー | 現在のパス | ターゲットパス | ロールバック |
|---|---|---|---|---|
| サポートチャット | OpenAI形式のチャット補完 | 現在のOpenAIモデル | GPT、Claude、Gemini、またはDeepSeek用のFlatkeyチャットエイリアス | 以前のキー、ベースURL、モデル |
| 内部分析 | OpenAI形式のチャット補完 | 現在のOpenAIモデル | 推論とコストのために選択されたFlatkeyモデルエイリアス | 以前のモデルエイリアス |
| ツールワークフロー | ツールを使用したチャット補完 | 現在のツール互換モデル | ツール動作が検証済みの候補モデル | プロバイダールートを無効化 |
| ストリーミングUI | チャット補完ストリーム | 現在のストリームパーサー | 生ストリームの証明がある候補プロバイダー | ストリームトラフィックを元に戻す |
| ネイティブClaude機能 | Anthropic Messages API | ネイティブClaudeクライアント | 互換性により必須機能が失われる場合はネイティブを維持 | このパスは移行しない |
Flatkeyのモデルページは、エンドポイントタイプを公開しているため、ここで役立ちます。モデルがネイティブエンドポイントファミリーの下にリストされている場合、アカウントカタログとスモークテストで証明されるまで、OpenAIチャットパスを通じて利用できると想定しないでください。
ステップ3:4つのプロバイダーでのスモークテストを実行する
有用な最小限のマルチモデルSDK移行スモークテストは、4つのプロバイダー行と同一のプロンプトで構成されます。応答スタイルによってトランスポートの失敗が隠されないように、プロンプトは単純なものにしてください。
| テスト | リクエスト | 合格条件 | トリアージ対象の失敗 |
|---|---|---|---|
| GPTまたは現在のOpenAIモデル | Flatkey経由の既存のOpenAI形式のリクエスト | 応答が返り、使用状況が可視化され、ログが期待されるエイリアスにリンクしている | 不正なキー、不正なベースURL、/v1の重複、モデルの欠落 |
| Claude | 選択したFlatkeyエイリアス経由の同じOpenAI形式のリクエスト | 平易な応答が返る。リクエストにサポートされていない機能が含まれていない | システムメッセージのマッピング、ツールスキーマ、ネイティブClaude専用機能 |
| Gemini | 選択したFlatkeyエイリアス経由の同じOpenAI形式のリクエスト | 平易な応答が返る。推論のデフォルト設定が許容範囲内である | モデルエイリアス、推論設定、マルチモーダルの前提 |
| DeepSeek | 選択したFlatkeyエイリアス経由の同じOpenAI形式のリクエスト | 平易な応答が返る。非推奨に影響されやすいエイリアスが最新である | モデル名の変更、思考設定、ストリームパーサー |
生の要求本文、編集済みのヘッダー、応答本文、HTTPステータス、モデルエイリアス、返された場合はリクエストID、ダッシュボードの使用状況エントリを保存します。プロバイダーが異なるパラメーターを必要とする場合は、アプリ全体に if provider == 分岐を散在させるのではなく、そのパラメーターをプロバイダープロファイルに移動してください。
ステップ4:ストリーミングとツール呼び出しを個別にテストする
単純な補完は、最もリスクの低いパスを証明するにすぎません。ストリーミングとツール呼び出しは、別個の契約です。
ストリーミングについては、以下を保存します:
| エビデンス | 重要である理由 |
|---|---|
| レスポンスヘッダー | ルートがイベントストリームデータを返すかどうかを確認します。 |
| 最初のイベント | バッファリングやプロキシパーサーの問題を検出します。 |
| 最後のイベント | ストリーム終了の処理と使用状況の動作を確認します。 |
| UIパーサーの出力 | フロントエンドが特定のプロバイダーのチャンク形状を前提としていないことを証明します。 |
ツールについては、まず小さなスキーマをテストします。
{
"type": "function",
"function": {
"name": "lookup_order_status",
"description": "Return a test order status.",
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string" }
},
"required": ["order_id"]
}
}
}
最初の証明として、本番環境で最大のツールスキーマを使用しないでください。例えば、Anthropicの互換性ドキュメントでは、OpenAIとの互換性に関する制限が指摘されており、Claudeの全機能セットを利用するためにはネイティブのClaude APIの使用が推奨されています。これはまさに、マルチモデルSDK移行チェックリストが展開前に把握すべき詳細です。
ステップ5:プロバイダープロファイルを小さく保つ
プロバイダープロファイルは、ビジネスロジックを所有するのではなく、差異を記述するべきです。
{
"support_chat": {
"base_url_env": "FLATKEY_BASE_URL",
"model_env": "FLATKEY_SUPPORT_CHAT_MODEL",
"endpoint_family": "openai_chat_completions",
"stream": true,
"tools": "basic",
"fallback_alias": "support_chat_previous"
},
"analysis_fast": {
"base_url_env": "FLATKEY_BASE_URL",
"model_env": "FLATKEY_ANALYSIS_FAST_MODEL",
"endpoint_family": "openai_chat_completions",
"stream": false,
"tools": "none",
"fallback_alias": "analysis_fast_previous"
}
}
すべてのターゲットプロバイダーに対するテストがない限り、ネイティブのプロバイダー機能を共有のOpenAIクライアントパスから除外してください。Claudeの引用、Gemini固有のメディア動作、DeepSeekの思考制御、またはプロバイダーネイティブのバッチエンドポイントが必要な場合は、名前付きのネイティブアダプターを作成し、真に適合するワークロードのためにOpenAI互換パスを維持します。
ステップ6:課金とロールバックを証明する
テキストは返すが課金の証拠を失う移行は完了していません。トラフィックを増やす前に、以下を保存します。
| 運用チェック | 合格条件 |
|---|---|
| 使用状況の可視性 | リクエストが、期待されるルート/モデルのコンテキストとともにFlatkeyの使用状況またはログに表示されます。 |
| コストレビュー | 価格設定または使用状況の記録が、財務または運用部門が照合するのに十分なほど可視化されています。 |
| クォータの動作 | 低いテストクォータまたは予算のしきい値が、非本番キーで期待どおりに動作します。 |
| エラー分類 | 401、403、404、429、5xx、およびプロバイダーエラーが、明確な所有者のアクションにマッピングされています。 |
| ロールバック | 1つの環境変更で、トラフィックが以前のキー/ベースURL/モデルに戻ります。 |
ここでFlatkeyの統合された課金と使用状況レビューが重要になります。目標は、より多くのモデルにアクセスすることだけではありません。マルチモデルSDK移行の目標は、トラフィックが移動した後に、製品、運用、財務部門が検査できるアクセスを確保することです。
マルチモデルSDK移行のためのカットオーバーワークフロー
最初の本番スライスには、この順序を使用します。
- 既存のOpenAI SDKクライアントを持つ低リスクのワークロードを1つ選択します。
- 現在のプロバイダーを変更せずに、クライアントファクトリと環境変数を追加します。
- 新しいファクトリを通じて現在のモデルを証明します。
- プレーンな補完で、Claude、Gemini、またはDeepSeekのターゲットを1つ証明します。
- そのワークロードがストリーミングとツールを使用している場合にのみ、それらを証明します。
- 使用状況、課金、エラー処理、およびロールバックを検証します。
- トラフィックのわずかな割合を新しいモデルエイリアスにルーティングします。
- 次のワークロードを追加する前に、プロバイダーとエンドポイントファミリーごとに障害を確認します。
最初のワークロードがネイティブのプロバイダー機能を必要とする場合は、最初のマルチモデルSDK移行には別のワークロードを選択してください。最初のスライスは、すべてのモデルの能力ではなく、移行パターンを証明するべきです。
よくある質問
1つのOpenAI SDKクライアントをClaude、Gemini、DeepSeekに使用できますか?
OpenAI互換ルートにはOpenAI SDKクライアントを維持できることが多いですが、それでもプロバイダー固有のテストが必要です。GoogleとDeepSeekはOpenAI互換アクセスを文書化しています。AnthropicはOpenAI SDK互換性レイヤーを文書化していますが、それは主にテストと比較のためであり、ほとんどのユースケースにおける長期的な本番環境の選択肢ではないと述べています。
Responses APIのトラフィックも同じ方法で移行すべきですか?
ターゲットゲートウェイとターゲットモデルが使用しているエンドポイントファミリーを明示的にサポートしている場合に限ります。Chat CompletionsとResponsesは同じ契約ではありません。アプリがすでに使用しているエンドポイントファミリーから始め、次にResponses用に別のテスト計画を作成してください。
マルチモデルSDK移行で最もよくある間違いは何ですか?
最もよくある間違いは、ベースURLの変更を移行全体として扱うことです。実際のマルチモデルSDK移行では、モデル名、エンドポイントファミリー、ストリーミング、ツール、使用状況、クォータ、エラー処理、およびロールバックも検証します。
いつネイティブのプロバイダーSDKを維持すべきですか?
ワークロードが互換性レイヤーでカバーされていないプロバイダー固有の機能に依存している場合は、ネイティブのプロバイダーSDKを維持してください。ネイティブのClaude機能、Gemini固有のメディアパス、またはDeepSeek固有の推論制御は、別のアダプターを正当化する可能性があります。
最終チェックリスト
移行が完了したと見なす前に、以下を確認してください。
| 項目 | 完了条件 |
|---|---|
| クライアントファクトリ | すべてのアプリパスが1つのOpenAI SDKラッパーまたは名前付きネイティブアダプターを使用する。 |
| 設定の分割 | APIキー、ベースURL、モデルエイリアス、タイムアウト、リトライ、ルートオーナーが環境によって決定される。 |
| プロバイダーの証明 | GPT、Claude、Gemini、DeepSeekの候補が、保存された生のエビデンスでテストされた。 |
| 機能の証明 | ストリーミングとツールが、通常のチャットとは別にテストされた。 |
| 運用の証明 | 使用状況、請求、クォータ、ログ、エラーが適切なオーナーに表示される。 |
| ロールバックの証明 | 1つの文書化された変更で、ワークロードが以前のルートに戻る。 |
マルチモデルSDKの移行は、1つの小さなワークロード、1つのクライアント境界、1つのモデルマップ、そして追加するすべてのプロバイダーに対するエビデンスといったように、地道に進めるのが最も効果的です。統合ルートでこれらのテストを実行する準備ができたら、Flatkeyキーを取得し、低リスクのOpenAI互換チャットパスから始めてください。


