OpenAI Python SDK: インストール、セットアップ、実践的な統合

OpenAI Python SDK: インストール、セットアップ、実践的な統合

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_urlapi_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_formattemperaturemax_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_endpointapi_keyapi_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 に決して入れないでください。

おすすめ記事