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

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

OpenAI Python SDK(PyPI の openai)は、OpenAI の API 向けの公式 Python クライアントです。認証、リクエストのフォーマット、レスポンスのパース、ストリーミング、リトライ処理を自動で行うため、それらを自分で実装する必要はありません。このガイドでは、インストール、コアとなる OpenAI クラス、チャット補完、ストリーミング、関数呼び出し、非同期の使い方、JavaScript SDK 相当、Azure OpenAI 統合、さらに同じ SDK を Novita AI の OpenAI 互換エンドポイントに向けてコードを変更せずにオープンウェイトモデルを使用する方法をカバーします。

OpenAI Python パッケージのインストール

Python 3.8 以降が必要です:

pip install openai

開発用に、requirements.txt または pyproject.toml に追加します:

pip install openai>=1.0.0

1.x リリース(2023 年後半にリリース)では、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 600s リクエストごとのタイムアウト
max_retries 2 レート制限エラー時の自動リトライ
http_client None プロキシや証明書設定用のカスタム httpx クライアント

チャット補完:基本リクエスト

チャット補完が最も一般的なユースケースです。messages リストは API と同じ形式で、会話を表すロールとコンテンツの辞書のリストです:

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: "You are a helpful assistant." },
    { role: "user", content: "Explain promises vs async/await in JavaScript." },
  ],
  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: "Summarize the fetch API in 3 sentences." }],
});

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": "Azure OpenAI を Python で使う方法は?"},
    ],
)

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",
)

Novita AI の OpenAI 互換 API への切り替え

Novita AI は、https://api.novita.ai/openai で OpenAI 互換のエンドポイントを公開しています。同じ openai Python SDK または 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-v4-pro",
    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-30b-a3b-instruct",
  messages: [{ role: "user", content: "Write a Python type annotation cheatsheet." }],
  max_tokens: 600,
});

console.log(response.choices[0].message.content);

ストリーミング、関数呼び出し、非同期使用法、response_formattemperaturemax_tokens など、後続のすべてが同じように動作します。Novita AI エンドポイントは OpenAI Chat Completions API 仕様に従っています。

Novita AI によるオープンソースモデル

base_url を変更するだけで、特定のタスクでクローズドソースの最先端モデルに匹敵するようになったオープンウェイトモデルのカタログにアクセスできます。コーディングワークフロー、関数呼び出し、長文脈推論において、実用的な差は大幅に縮まっています。

Novita AI の OpenAI 互換エンドポイントを通じて利用可能で、評価に値するモデル:

DeepSeek V4 Pro (deepseek/deepseek-v4-pro):大規模 MoE モデル(MIT 類似ライセンス)で、SWE-Bench や関数呼び出しベンチマークでトップクラスにランクイン。GPT-4o や Claude Opus を使っていたコーディングエージェント、コードレビュー、マルチステップツール使用タスクに強力。

Qwen3 Coder 30B A3B Instruct (qwen/qwen3-coder-30b-a3b-instruct):Qwen Coder ファミリーの 30B スパース MoE モデル。コード生成、バグトリアージ、プルリクエストレビューに最適化。Novita AI では入力 100 万トークンあたり $0.07、出力 100 万トークンあたり $0.27 と、日常のコーディング支援においてほとんどのクローズド API よりも大幅に安価。

Qwen3 235B A22B Instruct (qwen/qwen3-235b-a22b-instruct-2507):大規模 MoE モデル(Apache 2.0)。優れた推論能力と多言語コーディング性能を持つ。現在 GPT-4o を創造的または複雑な応答に使用しているが、ボリュームあたりのトークンコストを削減したいタスクに適している。

Novita AI でのモデル ID 形式は provider/model-name です。SDK の 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 テスト、タスクごとのパフォーマンスベンチマーク、リクエストロジックに触れずに安価なモデルへのボリュームシフトが可能になります。

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 とほぼ同じです。

Azure OpenAI を Python で使用するにはどうすればよいですか?

openai パッケージの AzureOpenAI クラスを使用します。azure_endpointapi_keyapi_version を渡します。model パラメータは基盤モデルではなく Azure のデプロイ名を指します。

OpenAI Python SDK を他のプロバイダーでも使用できますか?

はい。OpenAI Chat Completions API 形式を実装しているプロバイダーであれば、クライアントの base_url を設定することで使用できます。Novita AI のエンドポイント https://api.novita.ai/openai はその一例で、ストリーミング、関数呼び出し、非同期などの SDK の全機能が変更なしで動作します。

OpenAI API キーを安全に保つにはどうすればよいですか?

キーを環境変数(OPENAI_API_KEY)に保存し、os.environ["OPENAI_API_KEY"] で読み取ります。ソースコード、公開リポジトリ、ビルドログ、クライアントサイド JavaScript に決して記述しないでください。

おすすめ記事