OpenAI Python SDK(PyPI 上の openai)は、OpenAI の API 向け公式 Python クライアントです。認証、リクエストフォーマット、レスポンス解析、ストリーミング、リトライを処理します。このガイドでは、インストール、コアとなる OpenAI クラス、チャット補完、ストリーミング、関数呼び出し、非同期使用法、JavaScript SDK 相当品、Azure OpenAI 統合、そして Novita AI 互換性について説明します。
OpenAI Python パッケージのインストール
Python 3.10 以降が必要です:
pip install openai
レガシーな 0.x API から移行する場合は、openai.ChatCompletion.create() を client.chat.completions.create() に置き換えてください。
API キーを環境変数として設定します。ソースコードには記述しないでください:
export OPENAI_API_KEY="sk-..."
OpenAI クライアントクラス
OpenAI クラスがメインのエントリポイントです。デフォルトでは OPENAI_API_KEY 環境変数から API キーを読み取りますが、明示的に渡すこともできます:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
)
このクライアントはコネクションプール、リトライ、タイムアウトを管理します。インスタンスは 1 つ作成し、アプリケーション全体で再利用するべきです。リクエストごとにインスタンス化しないでください。
初期化時に設定可能なオプション:
| パラメータ | デフォルト | 説明 |
|---|---|---|
api_key |
OPENAI_API_KEY 環境変数 |
認証情報 |
base_url |
https://api.openai.com/v1 |
プロキシや互換 API 用に上書き |
timeout |
600 秒 | リクエストごとのタイムアウト |
max_retries |
2 | レート制限エラー時の自動リトライ |
http_client |
None | プロキシや証明書設定用のカスタム httpx クライアント |
チャット補完:基本リクエスト
チャット補完は最も一般的なユースケースです。messages リストは API と同じ形式で、会話を表す role/content ディクショナリのリストです:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "あなたは親切なコーディングアシスタントです。"},
{"role": "user", "content": "Python のリストとタプルの違いは何ですか?"},
],
temperature=0.3,
max_tokens=512,
)
print(response.choices[0].message.content)
レスポンスは ChatCompletion オブジェクトです。主なフィールド:
response.choices[0].message.content— テキスト応答response.usage.prompt_tokens— 入力で消費されたトークン数response.usage.completion_tokens— 出力で消費されたトークン数response.model— リクエストを処理したモデルバージョン
本番環境では、生成コストの暴走を防ぐために max_tokens を渡し、決定論的な出力が必要な場合は temperature=0 または低い値を使用してください。
ストリーミング応答
ユーザーがトークンが到着するのを確認できるインタラクティブなインターフェースには、stream=True を使用します:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
with client.chat.completions.stream(
model="gpt-4o",
messages=[
{"role": "user", "content": "Python のジェネレータをわかりやすく説明してください。"},
],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
コンテキストマネージャ(with 文)を使用すると、イテレーション後に接続が適切に閉じられます。.text_stream 属性はプレーンな文字列を生成します。.stream はチャンクごとの使用統計などのメタデータが必要な場合に、生のイベントオブジェクトを生成します。
コンテキストマネージャなしでストリーミングが必要な場合:
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Python のベストプラクティスを 5 つ挙げてください。"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
関数呼び出し
関数呼び出しにより、モデルが関数を呼び出すタイミングを判断し、JSON 引数オブジェクトを返すことができます。アプリケーションが関数を実行し、結果をモデルに送り返して応答に組み込ませます:
import os
import json
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "指定された都市の現在の天気を返します。",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "都市名(例:'東京')",
}
},
"required": ["city"],
},
},
}
]
messages = [{"role": "user", "content": "東京の天気は?"}]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
)
choice = response.choices[0]
if choice.finish_reason == "tool_calls":
tool_call = choice.message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
# ここで実際の関数を実行
result = {"city": args["city"], "temperature": "18°C", "condition": "曇り"}
messages.append(choice.message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result),
})
final = client.chat.completions.create(
model="gpt-4o",
messages=messages,
)
print(final.choices[0].message.content)
モデルは関数を呼び出したい場合に finish_reason="tool_calls" を返します。関数を実行し、結果をメッセージリストに追加して、2 回目のリクエストを行います。この 2 ステップのループが標準的なパターンです。
AsyncOpenAI を使った非同期使用法
FastAPI、asyncio ベースのサービス、またはノンブロッキング I/O が有利なコードでは、AsyncOpenAI を使用します:
import os
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(api_key=os.environ["OPENAI_API_KEY"])
async def get_response(prompt: str) -> str:
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
max_tokens=256,
)
return response.choices[0].message.content
async def main():
result = await get_response("Python の asyncio とは何ですか?")
print(result)
asyncio.run(main())
AsyncOpenAI は同期版の差し替え可能な非同期対応版です。すべてのメソッドが awaitable です。これは同期クライアントをラップするために asyncio.to_thread を使用するよりも推奨されます。
OpenAI JavaScript SDK
OpenAI JavaScript SDK(npm 上の openai)は Python インターフェースとよく似ています。インストール:
npm install openai
Node.js での基本的なチャット補完:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
const response = await client.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: "あなたは親切なアシスタントです。" },
{ role: "user", content: "JavaScript の Promise と async/await の違いを説明してください。" },
],
max_tokens: 512,
});
console.log(response.choices[0].message.content);
JavaScript でのストリーミング:
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const stream = await client.chat.completions.stream({
model: "gpt-4o",
messages: [{ role: "user", content: "fetch API を 3 文で要約してください。" }],
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content ?? "";
process.stdout.write(text);
}
JavaScript SDK は Node.js 18+、Deno、ブラウザ環境をサポートしますが、ブラウザで API キーを公開するのは安全ではありません。代わりにサーバーサイドのプロキシを使用してください。互換 API 用の base_url オプションは Python と同じように動作します。
Azure OpenAI Python 統合
直接の OpenAI API ではなく Azure OpenAI サービスを使用する場合は、同じパッケージの AzureOpenAI クライアントを使用します:
import os
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-02-01",
)
response = client.chat.completions.create(
model="gpt-4o", # Azure 上のデプロイ名
messages=[
{"role": "user", "content": "Python で Azure OpenAI を使用するにはどうすればよいですか?"},
],
)
print(response.choices[0].message.content)
Azure に必要な環境変数:
AZURE_OPENAI_API_KEY:Azure リソースの API キーAZURE_OPENAI_ENDPOINT:エンドポイント URL(例:https://your-resource.openai.azure.com/)
Azure OpenAI の model パラメータは、基盤となるモデル名ではなく、デプロイ名 を指します。api_version はデプロイが使用する Azure API バージョンに合わせて設定してください(サポートされているバージョンについては Azure OpenAI ドキュメント を参照)。
API キーの代わりに Microsoft Entra ID(旧 Azure AD)による認証を使用する場合:
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
token_provider = get_bearer_token_provider(
DefaultAzureCredential(),
"https://cognitiveservices.azure.com/.default",
)
client = AzureOpenAI(
azure_ad_token_provider=token_provider,
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-02-01",
)
同じ SDK で Novita AI を使用する
Novita AI は https://api.novita.ai/openai で OpenAI 互換のエンドポイントを公開しています。同じ openai Python または JavaScript SDK を使用し、base_url と api_key のみを変更できます:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["NOVITA_API_KEY"],
base_url="https://api.novita.ai/openai",
)
response = client.chat.completions.create(
model="deepseek/deepseek-v3.1",
messages=[
{"role": "system", "content": "あなたは親切なコーディングアシスタントです。"},
{"role": "user", "content": "Python の GIL がマルチスレッドにどのような影響を与えるか説明してください。"},
],
temperature=0.3,
max_tokens=512,
)
print(response.choices[0].message.content)
Novita AI の API キーは novita.ai/settings/key-management から取得できます。同じキーが OpenAI 互換エンドポイントを含む Novita AI のすべての API で機能します。
JavaScript で Novita AI を使用する場合:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.NOVITA_API_KEY,
baseURL: "https://api.novita.ai/openai",
});
const response = await client.chat.completions.create({
model: "qwen/qwen3-coder-480b-a35b-instruct",
messages: [{ role: "user", content: "Python の型アノテーションのチートシートを書いてください。" }],
max_tokens: 600,
});
console.log(response.choices[0].message.content);
ストリーミング、関数呼び出し、非同期使用法、response_format、temperature、max_tokens など、下流のすべてが同じように動作します。
Novita Agent Sandbox を使用するタイミング
モデル呼び出しには OpenAI SDK を使用し、コード実行、ブラウザ操作、ファイル操作を隔離された環境で行う必要があるワークフローには Novita Agent Sandbox を使用してください。これにより、SDK レイヤーは推論に集中し、Sandbox がエージェントループの危険な部分を処理します。
Novita AI 経由のオープンソースモデル
base_url を変更するだけで、クライアントコードを変更せずに Novita AI 上のオープンウェイトモデルにアクセスできます。これは、コーディング、ツール使用、長文コンテキスト作業に適したモデルを必要とするが、同じ SDK ワークフローを維持したい場合に便利です。
Novita AI でのモデル ID の形式は provider/model-name で、そのまま model パラメータに渡します。
オープンモデルとクローズドモデルを混在させたいチーム向けのシンプルなルーティングパターン:
def get_client(use_novita: bool = False) -> OpenAI:
if use_novita:
return OpenAI(
api_key=os.environ["NOVITA_API_KEY"],
base_url="https://api.novita.ai/openai",
)
return OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# コスト重視で高頻度のコーディングタスクにはオープンウェイトを使用
coding_client = get_client(use_novita=True)
# クローズドモデルが真に優れているタスクには OpenAI を使用
openai_client = get_client(use_novita=False)
これにより、出力品質の A/B テストが可能になり、適切な場合に Novita AI にルーティングし、プロバイダー間で 1 つの SDK パスを維持できます。
FAQ
OpenAI Python パッケージ名は何ですか?
PyPI 上のパッケージ名は openai です。pip install openai でインストールします。
OpenAI クライアントの Python クラス名は何ですか?
同期使用法のメインクラスは OpenAI、非同期使用法は AsyncOpenAI です。どちらも openai モジュールにあります:from openai import OpenAI, AsyncOpenAI。
OpenAI Python SDK はストリーミングをサポートしていますか?
はい。client.chat.completions.stream() をコンテキストマネージャとして使用するか、client.chat.completions.create() に stream=True を渡してチャンクを反復処理します。
OpenAI JavaScript SDK のパッケージ名は何ですか?
npm パッケージは openai です。npm install openai でインストールします。クラスとメソッドのシグネチャは Python SDK とほぼ同一です。
Python で Azure OpenAI を使用するにはどうすればよいですか?
openai パッケージの AzureOpenAI クラスを使用します。azure_endpoint、api_key、api_version を渡します。model パラメータは基盤となるモデルではなく、Azure のデプロイ名を指します。
OpenAI Python SDK を他のプロバイダーで使用できますか?
はい。OpenAI チャット補完 API 形式を実装しているプロバイダーであれば、クライアントの base_url を設定することで使用できます。Novita AI のエンドポイント https://api.novita.ai/openai がその一例です。SDK の全機能(ストリーミング、関数呼び出し、非同期)が変更なしで動作します。
OpenAI API キーを安全に保つにはどうすればよいですか?
キーを環境変数(OPENAI_API_KEY)に保存し、os.environ["OPENAI_API_KEY"] で読み取ってください。ソースコード、公開リポジトリ、ビルドログ、クライアントサイド JavaScript に決して入れないでください。
おすすめ記事
- Novita AI が OpenAI Agents SDK をサポート開始! — Novita AI モデルを OpenAI Agents SDK に接続し、マルチエージェントオーケストレーション、ガードレール、トレーシングを実現します。
- Qwen3 Coder 30B A3B Instruct クイックスタート — Novita AI 上のこのコスト効率の良いコーディングモデルのモデル ID、料金、コンテキストウィンドウ、API 例。
- Vercel AI SDK:AI アプリケーション構築のための完全開発者ガイド — Novita AI の OpenAI 互換エンドポイントと共に Vercel AI SDK を使用して、TypeScript でストリーミング、ツール呼び出し、エージェントループを実現します。
