OpenAI 互換 API でモデルを呼び出す方法
2026-11-11
要約
OpenAI 互換 API は、接続先の API キー、ベース URL、モデル ID を設定すれば、OpenAI SDK から呼び出せます。Python と cURL で Chat Completions のリクエストを送り、ストリーミング表示やエラーの切り分けまで実装する手順を紹介します。画像・動画・音声生成には、それぞれ対応するエンドポイントを使います。
OpenAI 互換 API の使い方は、OpenAI SDK のクライアントに接続先の API キーとベース URL を設定し、正確なモデル ID を指定して Chat Completions のリクエストを送るのが基本です。cURL を使う場合も、Bearer 認証、JSON 形式のメッセージ配列、モデル ID を指定すれば、同じリクエストを直接送信できます。
まず、短いテキストリクエストを1件送信します。回答が返ってきたら、ストリーミングやアプリケーション固有のオプションを追加します。最初からツール、画像、長い会話を一度に組み込むよりも、この順序のほうが設定ミスを切り分けやすくなります。
1. 接続に必要な3つの設定を確認する
OpenAI 互換 API は、提供事業者自身のサービスを通じて、使い慣れたリクエストとレスポンスの構造を提供します。OpenAI SDK を使っても、リクエストの送信先が OpenAI になるとは限りません。送信先は設定したベース URL で決まります。AIAdapter では、対応するチャットモデル間で同じクライアントとアカウントの API キーを使えるため、接続設定とモデルの選択を分けて管理できます。
AIAdapter の API ドキュメントでは、次の設定を指定しています。
| 設定項目 | 指定する値 |
|---|---|
| API キー | AIAdapter アカウントのキー |
| ベース URL | https://api.aiadapter.com/v1 |
| モデル ID | ベンダーの接頭辞を含む、マーケットプレイスの完全な識別子 |
SDK はベース URL に /chat/completions を追加します。/v1 を残し、base_url にエンドポイント全体を指定しないでください。
モデルマーケットプレイスからチャットモデルを選びます。以下の例では、掲載されている Qwen3.5-Plus モデルを使います。識別子は aliyun-bailian/qwen3.5-plus です。Qwen のようなモデルファミリー名だけではなく、識別子をそのままコピーしてください。
Console → API Keys でキーを作成します。キーはサーバー側の環境変数やシークレット管理サービスに保存し、フロントエンドの JavaScript に埋め込まないでください。AIAdapter のキーは AIAdapter への認証に使います。OpenAI アカウントのキーでは代用できません。
2. Python と環境変数を準備する
現在の OpenAI Python SDK には Python 3.10 以降が必要です。スクリプトを実行するインタープリターでインストールします。
python -m pip install --upgrade openaiターミナルで次の環境変数を設定し、キーのプレースホルダーをアカウントのキーに置き換えます。
macOS、Linux、Bash の場合:
export AIADAPTER_API_KEY="your-aiadapter-api-key"
export AIADAPTER_MODEL_ID="aliyun-bailian/qwen3.5-plus"Windows PowerShell の場合:
$env:AIADAPTER_API_KEY = "your-aiadapter-api-key"
$env:AIADAPTER_MODEL_ID = "aliyun-bailian/qwen3.5-plus"これらの設定は、そのターミナルセッションに適用されます。同じターミナルから Python を起動して、環境変数を引き継がせてください。デプロイ済みのアプリケーションでは、ホスティング環境のシークレット設定で変数を管理します。共有端末では、シェル履歴からキーが漏れる可能性があるため、キーの入力を避けてください。
3. 最初のチャットリクエストを送信する
次の例を call_model.py として保存します。
import os
from openai import OpenAI
with OpenAI(
api_key=os.environ["AIADAPTER_API_KEY"],
base_url="https://api.aiadapter.com/v1",
timeout=60.0,
max_retries=0,
) as client:
completion = client.chat.completions.create(
model=os.environ["AIADAPTER_MODEL_ID"],
messages=[
{"role": "user", "content": "Explain an API in two sentences."}
],
)
print(completion.choices[0].message.content)python call_model.py で実行します。
SDK が認証ヘッダーを生成し、リクエストを送信できる形式に変換します。messages に会話内容を渡し、model で使用するモデルを指定します。通常のテキスト応答では、回答を choices[0].message.content から取得し、画面に表示できます。
最初のリクエストには、サンプリング、推論、出力長制限のオプションを含めていません。基本的な呼び出しが動作したら、選択したモデルのドキュメントに従って追加します。max_tokens を使うモデルもあれば、max_completion_tokens や別の制御項目を使うモデルもあります。
max_retries=0 は、最初の呼び出しを調べる間、SDK の再試行を無効にします。timeout=60.0 はネットワーク操作のタイムアウトを60秒に設定するもので、スクリプト全体の実行時間を60秒に制限するものではありません。本番環境では、アプリケーションに合うタイムアウトと、回数を制限した再試行ポリシーを設定してください。
4. cURL で同じリクエストを送信する
次の Bash コマンドを使うと、Python SDK を介さずに HTTP リクエストをテストできます。
curl https://api.aiadapter.com/v1/chat/completions \
-H "Authorization: Bearer $AIADAPTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "aliyun-bailian/qwen3.5-plus",
"messages": [
{"role": "user", "content": "Explain an API in two sentences."}
]
}'cURL は SDK のようにルートを追加しないため、ここではエンドポイント全体を指定します。-d オプションは POST リクエストを送信します。返された JSON を読み、失敗した場合はエラーメッセージも確認してください。
cURL が成功し、Python が失敗する場合は、環境変数、インストール済み SDK、実際のクライアント設定を比較します。両方とも失敗する場合は、プロンプトを変える前に、キー、エンドポイント、モデル ID、アカウント残高を確認してください。
5. 生成された回答を順次表示する
ストリーミングに対応するチャットモデルでは、stream=True を指定し、各チャンクの delta.content からテキストを読み取ります。次の例を別のスクリプトとして保存し、同じ環境変数を使います。
import os
from openai import OpenAI
with OpenAI(
api_key=os.environ["AIADAPTER_API_KEY"],
base_url="https://api.aiadapter.com/v1",
timeout=60.0,
max_retries=0,
) as client:
with client.chat.completions.create(
model=os.environ["AIADAPTER_MODEL_ID"],
messages=[{"role": "user", "content": "Explain an API in two sentences."}],
stream=True,
) as stream:
for chunk in stream:
if chunk.choices:
text = chunk.choices[0].delta.content
if text:
print(text, end="", flush=True)
print()AIAdapter のドキュメントでは、チャットのストリーミング応答に Server-Sent Events を使用しています。コード内の条件判定で、制御用チャンクや使用量のみのチャンクなど、テキストを含まないチャンクを読み飛ばします。これにより、生成されたテキストを順次表示できます。ストリーミングでも、モデルに渡す入力の要件は同じです。
6. 機能を追加する前にエラーを切り分ける
HTTP ステータスと、返されたエラーメッセージを組み合わせて確認します。
| 症状 | 最初に行う確認・対処 |
|---|---|
401 認証エラー | キーがこの提供事業者のもので、プロセスまたは Bearer ヘッダーに渡されているか確認します。 |
404 またはモデルが見つからないエラー | /v1 のパス、エンドポイント、ベンダー接頭辞を含む正確なモデル ID を確認します。 |
400 または 422 のリクエストエラー | リクエストを model と messages だけに絞り、オプションを1つずつ確認します。 |
429 レート制限エラー | 同時リクエスト数を減らし、上限を設けたバックオフで再試行します。 |
| 残高またはクォータ不足 | コンソールを確認し、課金やクォータの問題を解決してから再試行します。 |
| 接続失敗またはタイムアウト | DNS、ネットワークアクセス、クライアントのタイムアウトを確認し、再送前にサーバー側の処理状況を調べます。 |
Python では、openai.APIStatusError を捕捉して status_code と response を確認します。接続失敗には openai.APIConnectionError を使います。ストリーム内のエラーによって openai.APIError が発生することもあるため、リクエストの作成時だけでなく、チャンクを読み取るループ内の例外にも対処してください。診断ログにキーや機密性の高いプロンプトを記録しないでください。
よくある質問
OpenAI 互換なら、すべての OpenAI エンドポイントを使えますか?
いいえ。使えるのは、API の提供事業者が実装しているエンドポイントです。この記事では、AIAdapter のドキュメントに記載されている Chat Completions を使っています。SDK に Responses、ファイルアップロード、アシスタントなどの機能があっても、接続先が対応しているとは限りません。利用する API に対応した SDK のメソッドを選んでください。高度なチャット機能を追加する際は、ツール呼び出し、推論、構造化出力に関するパラメーターを、選択したモデルが受け付けるか確認します。
この Python クライアントを変更せずにモデルを切り替えられますか?
切り替え先のモデルが同じ Chat Completions エンドポイントと認証方式に対応していれば、クライアントを変更せず、モデル ID を差し替えられます。このスクリプトでは、環境変数 AIADAPTER_MODEL_ID で使用するモデルを指定します。切り替え先が対応するパラメーター、コンテキスト長の上限、レスポンスの処理方法も確認してください。まず同じ短いメッセージで動作を確かめ、その後にツール、出力形式の指定、長い会話履歴を戻します。
このチャットの例で画像や動画を生成できますか?
必要な出力に対応する操作を使ってください。AIAdapter は、画像生成に /v1/images/generations、動画ジョブに /v1/video/generations、音声合成に /v1/audio/speech を指定しています。動画生成はジョブの送信後、/v1/video/generations/{id} でポーリングします。画像を理解する視覚言語モデルと、画像を生成するモデルは別です。チャットの例に動画モデルの ID を入れるのではなく、各操作で該当モデルのリクエスト項目と出力処理を使ってください。
リクエストが失敗したりタイムアウトしたりした場合、再試行しても大丈夫ですか?
OpenAI Python SDK は、特定の接続エラーと HTTP エラーに対して、デフォルトで2回再試行します。この記事では、失敗を追跡しやすくするため、最初のテストで再試行を無効にしています。タイムアウトしても、サーバーが処理していないとは限らず、生成リクエストの再送で処理が重複する可能性があります。再試行回数に上限を設け、確認できるリクエストやジョブの状態を調べ、追加試行も考慮してください。テキストの一部を受信した後にストリームが切れた場合は、部分出力を明示的に処理します。
最初のリクエストの費用はどう確認しますか?
呼び出す前に、モデル別の料金一覧と各モデルの詳細ページで、現在の料金と課金単位を確認してください。トークン課金のチャットでは、入力と出力の両方の使用量が影響します。オプションや長い回答によって消費量も変わります。レスポンスに使用量が含まれる場合は、コンソールの課金記録と照合してください。画像、動画、音声は異なる課金単位を使う場合があるため、チャットのトークン単価から費用を推定しないでください。
短いリクエストで回答が返ることを確かめたら、その設定を使ってアプリケーションへの組み込みを進めましょう。API キーをまだお持ちでなければ、アカウントを作成し、サーバー側からの呼び出しを始められます。
FAQ
OpenAI 互換 API でモデルを呼び出す方法
OpenAI 互換 API は、接続先の API キー、ベース URL、モデル ID を設定すれば、OpenAI SDK から呼び出せます。Python と cURL で Chat Completions のリクエストを送り、ストリーミング表示やエラーの切り分けまで実装する手順を紹介します。画像・動画・音声生成には、それぞれ対応するエンドポイントを使います。