OpenAI互換API:開発者向け移行チェックリスト
執筆:Nicho
OpenAI互換のAPIを使うと、既存のクライアントライブラリーをそのままに、その背後にあるサービスだけを変更できます。これはモデルの評価、コストの管理、プロバイダーの統合に役立ちます。ただし、すべてのendpoint、パラメーター、アプリケーション機能が同じように動作することを保証するものではありません。
安全な移行は、アプリケーションが実際に送信するリクエストから始めます。互換性は、プラットフォーム全体に貼るラベルではなく、特定のモデルとルートに対するチェックリストとして扱ってください。
このガイドでは、cheapaimodelの設定を具体例として使用します。例は2026年10月26日に確認した公開ドキュメントに基づくものであり、認証済みのAPIテスト結果ではありません。
1. 4種類の互換性を分けて考える
| レイヤー | 答えるべき問い | 収集すべき根拠 |
|---|---|---|
| クライアント | SDKはこのサービスにリクエストを送信できるか? | カスタムBase URLと認証方法のドキュメント |
| プロトコル | サーバーはリクエストの形式を理解するか? | endpointとパラメーターのドキュメント |
| モデル | 選択したモデルはその機能を実装しているか? | モデル固有の機能一覧と対象を絞ったテスト |
| アプリケーション | 結果はワークフローの要件を満たすか? | リグレッションケース、検証済みの出力、運用指標 |
テキスト補完が成功しても、このチェックリストのごく一部に答えたにすぎません。画像入力、ツール呼び出し、構造化出力、会話の状態が動作することを証明するものではありません。
代替サービスを選ぶ前に、アプリケーションに必要な機能を書き出してください。必須機能と便利な機能を分けます。そうしないと、安価なテキスト専用のスモークテストが、高くつく連携の不足を隠してしまいます。
2. APIキー、Base URL、モデルをまとめて設定する
cheapaimodelは、OpenAI SDKのBase URLとしてhttps://api.cheapaimodel.ai/v1をドキュメントに記載しています。無関係なプロバイダーのキーではなく、ゲートウェイのAPIキーを指定してください。SDKがリソースパスを追加するため、Base URLに/chat/completionsを含めないでください。ウェブサイトのドメインはAPIのホストではありません。Base URLガイドをご覧ください。
最小構成は次のとおりです。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
base_url="https://api.cheapaimodel.ai/v1",
)
result = client.chat.completions.create(
model="deepseek-v4-1-flash",
messages=[{"role": "user", "content": "Reply with one short greeting."}],
)
print(result.choices[0].message.content)
モデル識別子はゲートウェイSDKガイドに従います。各モデルのページに識別子と料金が記載されています。たとえばDeepSeek V4.1 Flashです。別のプロバイダーが同じモデルファミリーに同じ識別子を使うと想定しないでください。これら3つの設定値はデプロイ設定の同じ場所にまとめてください。一部だけを変更すると、新しいAPIキーが古いendpointに誤って送信される可能性があります。
APIキーはフロントエンドのバンドル、コミットされたファイル、デバッグログに含めないでください。移行環境には別のAPIキーを使い、個別に無効化できるようにします。
3. Chat CompletionsとResponsesを区別する
アプリケーションが呼び出すSDKメソッドを確認してください。client.chat.completions.create(...)とclient.responses.create(...)は異なるインターフェースです。アプリケーションで「OpenAI互換」と説明されている設定が、どちらを使う場合もあります。
cheapaimodelは両方のルートを記載していますが、対応するendpointはモデルによって異なるとドキュメントにあります。一方が利用可能であれば他方も利用可能だと想定せず、ルートとモデルの組み合わせを確認してください。APIリファレンスとFAQをご覧ください。
各ルートについて、次を記録します。
- アプリケーションが送信するリクエストのフィールド。
- アプリケーションが読み取るレスポンスのフィールド。
- 会話履歴や状態をどのように渡すか。
- どのツールやフォーマットオプションが必要か。
- streamingパーサーが完了をどのように認識するか。
endpointとレスポンスパーサーを別々に変更しないでください。生成は成功しても、アプリケーションが誤ったフィールドを読み取って空の回答を表示する場合、移行は完了していません。
4. すべてを転送するのではなく、パラメーターを監査する
認証情報と個人情報を削除した代表的なリクエストから、小さな一覧を作成します。自分のコードに見えるフィールドだけでなく、フレームワークが追加する任意のフィールドも含めます。
tokenの上限、推論の制御、サンプリングオプション、ツール、出力フォーマットを個別にテストします。受け入れられたパラメーターが、有効なパラメーターであるとは限りません。DeepSeekの現在のChat Completionsリファレンスには、思考モードによって動作が変わる設定と、効果がなくなった非推奨のフィールドが記載されています。
構造化出力は個別にテストする価値があります。OpenAIはJSONモードと、スキーマで制約するStructured Outputsを区別しています。OpenAI形式のリクエストが、すべての互換サーバーにこれらの保証を引き継ぐわけではありません。選択したプロバイダーがドキュメントで対応を明記しているフォーマットを確認し、そのうえでアプリケーションで結果を検証してください。OpenAIの構造化出力ガイドを参照してください。
5. 失敗経路とstreamingの動作をテストする
1つの立派なpromptではなく、コンパクトな回帰テストスイートを使用します。
| ケース | 必要な確認事項 |
|---|---|
| 短いテキストのリクエスト | 使用可能なコンテンツがアプリケーションに届く |
| マルチターンの会話 | 関連する以前のコンテキストが保持される |
| streamedレスポンス | 差分が正しく組み立てられ、中断が可視化される |
| ツールのワークフロー(必要な場合) | 実行前に引数が検証される |
| 構造化レスポンス(必要な場合) | 無効または不完全な出力が拒否される |
| 無効なmodelまたはkey | 読み取り可能なエラーが運用担当者に届く |
| 遅い、または中断されたリクエスト | タイムアウトと再試行の動作が範囲内に収まる |
これらは、明示的な利用上限を設定した非本番環境で実行します。可能な場合はリクエストID、HTTPステータス、レイテンシー、終了状態、検証結果を記録します。認証情報は決してログに記録しないでください。ログポリシーで明示的に許可されていない限り、顧客のコンテンツはマスクします。
6. 他のプロトコルとサービスは分けておく
Anthropic Messagesの互換性は、別の連携契約です。OpenAIの互換性から推測することはできません。cheapaimodelは、Anthropic SDK向けに異なるBase URLの規則をドキュメント化しています。SDKは独自の/v1/messagesパスを追加します。URLを盲目的に再利用するのではなく、ドキュメントの設定に従ってください。
また、埋め込み、ストレージ、バッチ処理、およびホスト型のツールも個別に監査してください。グローバルなBase URLの上書きは、意図したよりも多くのクライアントをリダイレクトする可能性があります。アプリケーションが複数のサービスを使用する場合は、クライアントごとの明示的な設定を優先してください。
7. 元に戻せる判断でロールアウトする
まずは社内トラフィックや限定的なワークロードから始めます。tokenの価格だけでなく、タスクの成功率と採用された結果あたりのコストを比較します。当社のLLM API料金比較は料金面の出発点として利用できます。品質の根拠は、回帰テストスイートが提供します。
以前の設定を利用可能なまま保持し、ロールバックのしきい値を定義します。重複実行を制御できるまでは、副作用のあるワークフローでプロバイダーの自動切り替えを避けます。
必要な機能が合格し、失敗が理解可能なままで、アプリケーションが以前の設定に安全に戻せるようになれば、移行は完了です。SDKの再利用はそのプロセスの始まりであり、合格基準ではありません。