OpenAI APIAPI TutorialFunction Calling

OpenAI APIチュートリアル2026:最初の呼び出しから本番運用まで

約1分

OpenAIのドキュメントは網羅的です。ただし、6つの異なるAPIリファレンス、3つの移行ガイド、そして毎月更新されるチェンジログに散らばっています。

2024年のチュートリアルは、非推奨になったモデルや削除されたパラメータを参照しています。「OpenAI streaming example」を検索すると、4つの異なる実装が見つかります——そのうち動くのは2つだけです。

このチュートリアルでは、2026年7月時点のOpenAI APIの主要機能をすべて、学ぶべき順番に、動作するコード付きで解説します。

非推奨パラメータはありません。「最新のドキュメントを確認してください」という逃げもありません。すべての例は現在のAPIでテスト済みです。

2026年のOpenAI APIの全体像

OpenAIは現在3つのアクティブなAPIを提供しています。どれを使うべきかを知っていれば、多くの混乱を避けられます。

Chat Completions API/v1/chat/completions):定番です。ステートレスで、リクエスト・レスポンス方式。メッセージを送ると、コンプリーション(生成結果)が返ってきます。streaming、function calling、JSON mode、structured outputsに対応しています。アプリケーションの90%がこれを使っています。どのAPIを使えばいいか分からない場合は、これを使いましょう。

Responses API/v1/responses):より新しく、ステートフルです。メッセージ配列を自分で管理する代わりに、サーバー側で会話状態を維持します。Web検索、ファイル検索、コンピューター操作を組み込みツールとしてサポートしています。モデルが複数ターンにわたって複数のツールを調整する必要がある複雑なエージェントワークフローに向いています。トレードオフ:メッセージ履歴に対する制御が限られ、APIもまだ進化しています。

Agents SDK:最も新しい追加です。組み込みのガードレール、専門エージェント間のハンドオフ、トレーシングを備えた永続的なAIエージェントを構築するためのフレームワークです。生のAPIよりも制約が強く——柔軟性と引き換えに、一般的なエージェントパターンをより速く開発できます。ここでは詳しく扱いません。Building AI Agentsガイドで詳しく解説しています。

現在のモデルラインナップ(2026年7月):

モデルInput $/MOutput $/MContext最適な用途
GPT-5.5$5.00$30.001M最大の性能、複雑な推論
GPT-5.4$2.50$15.001M高い性能、優れた価値
GPT-5.4 Mini$0.75$4.50400K日常タスク、コストと品質のバランス良好
GPT-5.4 Nano$0.20$1.25128K高ボリュームの単純タスク
o4-mini$1.10$4.40200K数学、論理、コードパズル(推論特化)

認証。 APIキーは OPENAI_API_KEY 環境変数として設定しましょう——ハードコードは絶対にしないこと。本番でのキー管理、ローテーション、スコープ設定、バーチャルキー構成については、APIキー管理ガイドをご覧ください。

Chat Completions API:基礎

すべてのOpenAI統合はここから始まります。

基本的なチャット呼び出し——Python:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.tokspan.com/v1",
    api_key="ts-your-key-here"
)

response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[
        {"role": "system", "content": "You are a software engineer. Answer with code when appropriate."},
        {"role": "user", "content": "Write a Python function to check if a string is a palindrome."}
    ],
    temperature=0.3,       # Low = deterministic, good for code
    max_tokens=500,        # Cap output length
    top_p=0.95             # Nucleus sampling —usually leave at default
)

print(response.choices[0].message.content)

重要なパラメータ:

  • model ——使うモデルを指定。本番ではエイリアス(gpt-5.5)ではなく日付付きID(gpt-5.5-2025-06-15)を使いましょう。エイリアスは新しいスナップショットに静かにアップグレードされ、プロンプトの挙動が変わる可能性があります。
  • messages —— role(“system”、“user”、“assistant”)と content を持つメッセージオブジェクトの配列。システムメッセージは挙動を設定します。ユーザーメッセージはリクエストです。アシスタントメッセージは以前のモデル応答——会話コンテキストを維持するために含めます。
  • temperature ——0から2。コードや事実ベースのタスクには0〜0.3。チャットや創作には0.7〜1.0。ブレインストーミングには1.0以上。
  • max_tokens ——出力長のハードな上限。この制限に達すると、文の途中でもモデルは停止します。ほとんどのタスクでは余裕を持って(500〜4,000)設定しましょう。
  • top_p ——temperatureに代わるもの。通常はデフォルト(1.0)のままにして、ランダム性はtemperatureだけで制御します。

システムメッセージを正しく書く。 良いシステムメッセージは具体的で、哲学的ではありません。悪い例:「あなたは親切なAIアシスタントです。」良い例:「あなたはPythonコードレビュアーです。すべてのコードスニペットについて、(1)潜在的なバグ、(2)パフォーマンスの問題、(3)スタイル違反を特定してください。応答は箇条書きで、各項目は30語以内にしてください。」

複数ターンの会話。 APIはステートレスです。前回の呼び出しを覚えていません。

会話を行うには、毎回メッセージ履歴全体——システムメッセージ+これまでのすべてのユーザーメッセージとアシスタントメッセージ+新しいユーザーメッセージ——を送信します。履歴がモデルのコンテキスト制限に近づいたら、最も古いメッセージを削るか要約しましょう。切り詰めることはエラーよりまし。要約は切り詰めることよりましです。

Streaming:リアルタイム応答

非ストリーミングモード:ユーザーは3〜8秒待ってから、応答全体を一度に見ます。ストリーミングモード:ユーザーは約0.4秒から、言葉がリアルタイムに現れるのを見ます。UIの違いは「遅いと感じる」と「瞬時だと感じる」の違いです。

Pythonでのstreaming実装:

stream = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Explain recursion."}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Node.jsでのstreaming実装:

const stream = await client.chat.completions.create({
    model: "gpt-5.5",
    messages: [{ role: "user", content: "Explain recursion." }],
    stream: true
});

for await (const chunk of stream) {
    if (chunk.choices[0]?.delta?.content) {
        process.stdout.write(chunk.choices[0].delta.content);
    }
}

対応すべきエッジケース: 空チャンク(ストリームの最初の数チャンクにはコンテンツがないことが多い——APIがまだ処理中)。接続切断(ストリームをtry/exceptでラップし、途中で失敗したら同じメッセージでリトライ)。finish_reasonの追跡(最後のチャンクに finish_reason が含まれています——モデルが自然に停止したのか、制限に達したのかを確認しましょう)。

Function Calling:LLMにツールを持たせる

モデルはコードを実行しません。どの関数をどのパラメータで呼ぶかを記述したJSONを生成します。関数を実行するのはあなたのコードです。

結果をモデルに送り返します。モデルはその結果を使って最終応答を生成します。これはすべてのAIエージェントの背後にあるアーキテクチャです。

完全な天気エージェントの例:

import json

# Step 1: Define the tool
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get current weather for a city. Returns temperature in Celsius and conditions.",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "City name, e.g. 'Tokyo'"}
            },
            "required": ["city"]
        }
    }
}]

# Step 2: User asks a question that needs the tool
response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
    tools=tools,
    tool_choice="auto"  # Model decides whether to use a tool
)

# Step 3: Check if model wants to call a tool
msg = response.choices[0].message
if msg.tool_calls:
    tool_call = msg.tool_calls[0]
    args = json.loads(tool_call.function.arguments)

    # Step 4: Execute the function (in reality, call a weather API)
    weather_result = get_actual_weather(args["city"])

    # Step 5: Send the result back
    messages = [
        {"role": "user", "content": "What's the weather in Tokyo?"},
        msg,  # The assistant's tool_call message
        {"role": "tool", "tool_call_id": tool_call.id, "content": str(weather_result)}
    ]

    final_response = client.chat.completions.create(
        model="gpt-5.5",
        messages=messages
    )
    print(final_response.choices[0].message.content)

並列function calling。 複数のツールを定義します。ツールが独立していれば、モデルは一度に複数要求することがあります——「東京と大阪の天気を取得して」。コードは応答内の複数の tool_calls を処理し、並列に実行し(asyncio.gather)、すべての結果をまとめて送り返す必要があります。

Function callingのベストプラクティス。 ツールの説明はプロンプトです——明確に書き、各ツールをいつ使うかの例を含めましょう。パラメータは厳密に制約——自由文の文字列ではなくenumを使いましょう。OpenAIのfunction callingガイドで、streamingツール呼び出しや並列実行などのエッジケースを詳しく解説しています。

ツールは冪等にしましょう。ツールの実行が失敗したら、エラーメッセージをモデルに送り返しましょう——異なるパラメータを試して回復できることがよくあります。

OpenAI、Anthropic、Google、DeepSeekにわたるfunction callingのクロスプロバイダー比較——OpenAI互換の変換後も生き残る機能を含む——は、ツール呼び出し比較に完全なクロスプロバイダー内訳があります。

Structured Outputs:保証されたJSON

JSON mode(response_format={"type": "json_object"})はJSONが欲しいことを「ほのめかします」。モデルはたいてい従います。Structured Outputs(response_format={"type": "json_schema", ...})はそれを「保証します」——モデルのトークンサンプリングが、スキーマに一致する有効なJSONだけを生成するように制約されます。

どちらを使うか。 JSON mode:迅速なプロトタイピング、内部ツール、まれに壊れたJSONを処理できるケース。Structured Outputs:本番API、顧客向け機能、不正なJSONが連鎖障害を引き起こすあらゆるケース。OpenAIのStructured Outputsドキュメントで、完全なスキーマ定義構文と対応モデルを解説しています。

スキーマの定義——履歴書パーサーの例:

response = client.chat.completions.create(
    model="gpt-5.4",  # Structured Outputs supported on GPT-5.4+
    messages=[{"role": "user", "content": f"Extract information from this resume:\n\n{resume_text}"}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "resume_extraction",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "skills": {"type": "array", "items": {"type": "string"}},
                    "years_experience": {"type": "integer"},
                    "current_role": {"type": "string"}
                },
                "required": ["name", "skills", "years_experience"]
            }
        }
    }
)

resume_data = json.loads(response.choices[0].message.content)
# Guaranteed to match your schema. No try/except json.loads needed.

本番デプロイのチェックリスト

環境管理。 APIキーは .env ファイルではなく、シークレットボールト(AWS Secrets Manager、HashiCorp Vault、Doppler)に保存しましょう。キーは90日ごとにローテーション。開発、ステージング、本番で異なるキーを使い、それぞれに異なる予算上限とモデル許可リストを設定します。

本番のエラー処理。 すべてのAPI呼び出しを、指数バックオフとジッター付きのリトライでラップします。一貫して失敗するプロバイダーにはサーキットブレーカー——30秒間ルーティングを止め、プローブし、健全なら再開します。生のAPIエラーをユーザーに返さない——ユーザーフレンドリーなメッセージにマッピングし、詳細は内部でログに記録します。

コスト監視。 ユーザー別、機能別、モデル別のコストを追跡します。通常の日次支出の2倍で異常アラートを設定します。

$500の驚きの請求書は、誰も見ていなかったときに発生します。日次コストサマリーは10秒で確認できます。

レート制限の管理。 自分のティアのRPMとTPMの上限を知っておきましょう。すべてのレスポンスの x-ratelimit-remaining-* ヘッダーを読みます。残り30%で速度を落とします。10%で停止します。

リアクティブなバックオフから予測的なスロットリングまでの完全なレート制限アーキテクチャは、本番レート制限ハンドリングガイドをご覧ください。

代替の道。 集約プラットフォームは、認証、エラー回復、コストログ、レート制限管理をインフラレベルで処理します。あなたはアプリケーションロジックに集中できます。

トレードオフは、リクエスト経路に対する制御が減ることです。ほとんどのチームにとって、節約できる時間は手放す制御を上回ります。

FAQ

GPT-5.5とo4-miniの違いは?

GPT-5.5は、チャット、コーディング、分析、生成のための汎用モデルです。o4-miniは推論特化モデル——応答前に長く考えるため、数学、論理パズル、形式推論に強い一方、遅く、トークンあたりのコストが高くなります。

日常的なタスクにはGPT-5.5を。計算機や形式証明に手を伸ばすようなタスクにはo4-miniを使いましょう。

Chat Completionsの代わりにResponses APIを使う必要がありますか?

まだです。Chat Completionsは安定しており、広くサポートされ、ユースケースの90%を処理します。Responses APIは状態管理と組み込みツール(Web検索、ファイル検索)を追加しますが、新しく、進化しています。

Chat Completionsから始めましょう。その固有の機能が必要になったらResponses APIに移行します。

OpenAI APIのコストをどう減らせばいいですか?

単純なタスクにはGPT-5.5($5/$30)の代わりにGPT-5.4 Mini($0.75/$4.50)を使いましょう。プロンプトキャッシングを有効に——キャッシュされた入力は50%オフ。緊急でない作業にはバッチAPIを——24時間のターンアラウンドで50%割引。

または、ボリュームプール価格と自動モデルルーティングで、手動のモデル切り替えなしにコストを削減できる集約プラットフォームを使いましょう。請求額削減戦術ガイドで各戦略を解説しています。

OpenAI SDKをOpenAI以外のモデルでも使えますか?

はい。ほとんどのプロバイダーがOpenAI互換のエンドポイントを提供しています。

base_urlapi_key を変更するだけです。コードはそのままです。これはOpenAI互換標準の最大の利点——特定のプロバイダーに縛られません。

OpenAIが使っているモデルを非推奨にしたらどうなりますか?

OpenAIは通常1〜3ヶ月前の通知を出します。日付付きモデルID(gpt-5.5-2025-06-15)に固定し、エイリアス(gpt-5.5)は使わないで、いつ移行するかをコントロールしましょう。

非推奨日までに置き換えモデルを自分のプロンプトでテストしましょう。OpenAI以外のフォールバックモデルを設定しておけば、OpenAIのタイムラインで移行を強制されません。

OpenAI APIが業界標準なのには理由があります:成熟したSDK、網羅的なドキュメント、そして真っ先にサポートするエコシステム。しかし2026年は、その標準にひずみが見え始めた最初の年です——Anthropicのネイティブプロトコル、Googleの自動function calling、DeepSeekの価格圧力が、それぞれ開発者を /v1/chat/completions の変換後には生き残らない機能へ引き寄せています。追跡する価値のある問い:OpenAIのAgents SDKはエコシステムを再統合する次の業界標準になるのか、それともOpenAIの自社インフラでしか使えない機能を導入して断片化を加速させるのか。

さあ始めましょう——あなたの流儀でOpenAIのAPIを使いこなす。準備ができたら、同じSDKでClaude、Gemini、DeepSeekも追加できます——2026年で唯一安全な賭けは、すべてのプロバイダーで動くコードだからです。