Azure OpenAI Responses API を使用する

Azure OpenAI Responses API を使用して、ステートフルな複数ターン応答を生成します。 チャットの完了と Assistants API の機能を 1 つの統合されたエクスペリエンスにまとめます。 Responses API は、computer-use-previewを支援する モデルもサポートしています。

前提 条件

  • デプロイされた Azure OpenAI モデル。
  • 認証方法:
    • API キー (たとえば、 AZURE_OPENAI_API_KEY)、または
    • Microsoft Entra ID (推奨)。
  • 言語のクライアント ライブラリをインストールします。
    • Python:pip install openai azure-identity
    • .NET: dotnet add package OpenAIdotnet add package Azure.Identity
    • JavaScript/TypeScript: npm install openai @azure/identity
    • Java: com.openai:openai-javacom.azure:azure-identity をプロジェクトに追加します。
  • REST の例では、AZURE_OPENAI_API_KEY (API キー フロー) または AZURE_OPENAI_AUTH_TOKEN (Microsoft Entra ID フロー) を設定します。

サポートされているリージョン

この記事の例を実行する前に、リソース リージョンで Responses API がサポートされていることを確認してください。 v1 API は、最新の機能にアクセスするために必要です。詳細については、 API バージョンのライフサイクルを参照してください。 現在、Responses API は次のリージョンで使用できます。

  • australiaeast
  • brazilsouth
  • canadacentral
  • canadaeast
  • eastus
  • eastus2
  • francecentral
  • ドイツ西中央
  • italynorth
  • japaneast
  • koreacentral
  • northcentralus
  • norwayeast
  • polandcentral
  • southafricanorth
  • southcentralus
  • southeastasia
  • インド南部
  • spaincentral
  • swedencentral
  • switzerlandnorth
  • uaenorth
  • uksouth
  • westus
  • westus3

サポートされているモデル

Responses API では、次のモデルがサポートされています。

  • gpt-chat-latest (バージョン: 2026-05-282026-05-05)
  • gpt-5.5 (バージョン: 2026-04-24)
  • gpt-5.4-nano (バージョン: 2026-03-17)
  • gpt-5.4-mini (バージョン: 2026-03-17)
  • gpt-5.4-pro (バージョン:2026-03-05)
  • gpt-5.4 (バージョン:2026-03-05)
  • gpt-5.3-chat (バージョン: 2026-03-03)
  • gpt-5.3-codex (バージョン: 2026-02-24)
  • gpt-5.2-codex (バージョン: 2026-01-14)
  • gpt-5.2 (バージョン: 2025-12-11)
  • gpt-5.2-chat (バージョン: 2025-12-11)
  • gpt-5.2-chat (バージョン: 2026-02-10)
  • gpt-5.1-codex-max (バージョン: 2025-12-04)
  • gpt-5.1 (バージョン: 2025-11-13)
  • gpt-5.1-chat (バージョン: 2025-11-13)
  • gpt-5.1-codex (バージョン: 2025-11-13)
  • gpt-5.1-codex-mini (バージョン: 2025-11-13)
  • gpt-5-pro (バージョン: 2025-10-06)
  • gpt-5-codex (バージョン: 2025-09-11)
  • gpt-5 (バージョン: 2025-08-07)
  • gpt-5-mini (バージョン: 2025-08-07)
  • gpt-5-nano (バージョン: 2025-08-07)
  • gpt-5-chat (バージョン: 2025-08-07)
  • gpt-5-chat (バージョン: 2025-10-03)
  • gpt-5-codex (バージョン: 2025-09-15)
  • gpt-4o (バージョン: 2024-11-202024-08-062024-05-13)
  • gpt-4o-mini (バージョン: 2024-07-18)
  • computer-use-preview
  • gpt-4.1 (バージョン: 2025-04-14)
  • gpt-4.1-nano (バージョン: 2025-04-14)
  • gpt-4.1-mini (バージョン: 2025-04-14)
  • gpt-image-1 (バージョン: 2025-04-15)
  • gpt-image-1-mini (バージョン: 2025-10-06)
  • gpt-image-1.5 (バージョン: 2025-12-16)
  • o1 (バージョン: 2024-12-17)
  • o3-mini (バージョン: 2025-01-31)
  • o3 (バージョン: 2025-04-16)
  • o4-mini (バージョン: 2025-04-16)

サポートされているすべてのリージョンですべてのモデルを使用できるわけではありません。 モデルページでモデル地域の可用性を確認してください。 要求パラメーターと応答パラメーターの完全なセットについては、 Responses API リファレンス ドキュメントを参照してください

メモ

現在サポートされていません。

  • 複数ターンの編集とストリーミングを使用した画像の生成。
  • 画像をファイルとしてアップロードし、入力として参照することはできません。

次の既知の問題があります。

  • 入力ファイルとしての PDF がサポートされるようになりましたが、ファイルのアップロードの目的を user_data に設定することは現在サポートされていません。
  • バックグラウンド モードがストリーミングで使用される場合のパフォーマンスの問題。 Microsoftはこの問題の解決に取り組んでいます。

テキスト応答を生成する

Responses API を使用して単純なテキスト応答を生成します。 YOUR-RESOURCE-NAMEMODEL_NAMEをデプロイの値に置き換えます。

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# API key authentication
client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
)
response = client.responses.create(
    model="MODEL_NAME",
    input="This is a test."
)
print(response.model_dump_json(indent=2))

# Microsoft Entra ID authentication (recommended)
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=token_provider(),
)
response = client.responses.create(
    model="MODEL_NAME",
    input="This is a test."
)
print(response.model_dump_json(indent=2))

応答の例

{
  "id": "resp_67cb32528d6881909eb2859a55e18a85",
  "created_at": 1741369938.0,
  "output_text": "Great! How can I help you today?",
  ...
}

応答を取得する

前の Responses API 呼び出しから ID で応答を取得します。

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# API key authentication
client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
)
response = client.responses.retrieve("<response_id>")
print(response.model_dump_json(indent=2))

# Microsoft Entra ID authentication
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=token_provider,
)
response = client.responses.retrieve("<response_id>")
print(response.model_dump_json(indent=2))

応答の例

{
  "id": "resp_67cb61fa3a448190bcf2c42d96f0d1a8",
  "output_text": "Hello! How can I assist you today?",
  ...
}

応答を削除する

既定では、応答データは 30 日間保持されます。 保存されている応答を ID で削除します。

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# API key authentication
client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
)
response = client.responses.delete("<response_id>")
print(response)

# Microsoft Entra ID authentication
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=token_provider,
)
response = client.responses.delete("<response_id>")
print(response)

応答を連結する

チェーンは、前の応答 ID を previous_response_idに渡すことによって変わります。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

first_response = client.responses.create(
    model="MODEL_NAME",
    input="Define catastrophic forgetting."
)

second_response = client.responses.create(
    model="MODEL_NAME",
    previous_response_id=first_response.id,
    input="Explain it for a college freshman."
)

print(second_response.output_text)

応答を手動で連結する

または、次の要求で出力項目を手動で繰り越すことができます。

import os
from openai import OpenAI

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
  api_key=os.getenv("AZURE_OPENAI_API_KEY")  
)

inputs = [{"type": "message", "role": "user", "content": "Define and explain the concept of catastrophic forgetting?"}] 
  
response = client.responses.create(  
    model="gpt-4o",  # replace with your model deployment name  
    input=inputs  
)  
  
inputs += response.output

inputs.append({"role": "user", "type": "message", "content": "Explain this at a level that could be understood by a college freshman"}) 
               

second_response = client.responses.create(
  model="MODEL_NAME",
    input=inputs
)

print(second_response.model_dump_json(indent=2))

応答を圧縮する

圧縮により、後のターンで重要な状態を維持しながら、入力コンテキストが減少します。

import os
from openai import OpenAI

client = OpenAI(
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
  api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

compacted = client.responses.compact(
  model="MODEL_NAME",
  input=[
    {"role": "user", "content": "Create a simple landing page for a dog cafe."},
    {
      "id": "msg_001",
      "type": "message",
      "status": "completed",
      "role": "assistant",
      "content": [{"type": "output_text", "text": "..."}],
    },
  ]
)

follow_up = client.responses.create(
  model="MODEL_NAME",
  input=[*compacted.output, {"role": "user", "content": "Add a booking form."}]
)
print(follow_up.output_text)

返された項目を使用してコンパクト化する

推論、メッセージ、関数呼び出しなど、以前の要求から返されたすべての項目を圧縮できます。

curl -X POST https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/responses/compact \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AZURE_OPENAI_AUTH_TOKEN" \
  -d '{
        "model": "MODEL_NAME",
        "input": [
          {
            "role"   : "user",
            "content": "Create a simple landing page for a dog petting café."
          },
          {
            "id": "msg_001",
            "type": "message",
            "status": "completed",
            "content": [
              {
                "type": "output_text",
                "annotations": [],
                "logprobs": [],
                "text": "Below is a single file, ready-to-use landing page for a dog petting café:..."
              }
            ],
            "role": "assistant"
          }
        ]
    }'
# Use the compacted output as input for the next turn.
next_response = client.responses.create(
  model="MODEL_NAME",
  input=[*compacted.output, {"role": "user", "content": "Add opening hours."}],
)
print(next_response.output_text)

以前の応答 ID を使用してコンパクト化する

以前の応答 ID を使用して圧縮することもできます。

initial_response = client.responses.create(
  model="MODEL_NAME",
  input="What is the size of France?"
)

compacted_response = client.responses.compact(
  model="MODEL_NAME",
  previous_response_id=initial_response.id
)

follow_up_response = client.responses.create(
  model="MODEL_NAME",
  input=[
    *compacted_response.output,
    {"role": "user", "content": "What is the capital?"}
  ]
)
print(follow_up_response.output_text)

サーバー側の圧縮

POST /responsesclient.responses.createを設定することで、応答 (context_managementまたはcompact_threshold) でサーバー側の圧縮を直接使用することもできます。

  • 出力トークン数が構成されたしきい値を超えると、Responses API によって圧縮が自動的に実行されます。
  • このモードでは、 /responses/compact を個別に呼び出す必要はありません。
  • 応答には、暗号化された圧縮項目が含まれます。
  • 応答の作成要求で store=false を設定すると、サーバー側の圧縮が機能します。

圧縮項目は、より少ないトークンを使用して、本質的な前の状態と推論を次のターンに進めます。 不透明であり、人間が判読できるものではありません。

ステートレス入力配列チェーンを使用している場合は、通常どおり出力項目を追加します。 previous_response_idを使用している場合は、各ターンで新しいユーザー メッセージのみを渡します。 どちらのパターンでも、圧縮項目には次のウィンドウに必要なコンテキストが含まれます。

ヒント

前の入力項目に出力項目を追加した後、最新の圧縮項目の前に来た項目を削除して、要求を小さくし、長い末尾の待機時間を短縮できます。 最新の圧縮項目には、会話を続行するために必要なコンテキストが含まれています。 previous_response_idチェーンを使用する場合は、手動で剪定しないでください。

Flow

  1. 通常どおり responses を呼び出します。 context_managementを使用してcompact_thresholdを追加して、サーバー側の圧縮を有効にします。
  2. 出力がしきい値を超えた場合、サービスは圧縮をトリガーし、出力ストリームに圧縮項目を出力し、推論を続行する前にコンテキストを排除します。
  3. 次のいずれかのパターンを使用して会話を続行します。
    1. ステートレス入力配列チェーン: 圧縮項目を含む出力項目を次の入力配列に追加します。
    2. previous_response_id チェーン: 各ターンで新しいユーザー メッセージのみを渡し、最新の応答 ID を転送します。

conversation = [
  {
    "type": "message",
    "role": "user",
    "content": "Let's begin a long coding task.",
  }
]

while keep_going:
  response = client.responses.create(
    model="MODEL_NAME",
    input=conversation,
    store=False,
    context_management=[{"type": "compaction", "compact_threshold": 200000}],
  )

  conversation.append(
    {
      "type": "message",
       "role": "user",
      "content": get_next_user_input(),
    }
  )

ストリーミング

stream=trueを設定して、生成された応答をストリーム配信します。 サービスは、出力トークンをトークンごとにレンダリングするために使用できる増分イベントを出力します。

メモ

ストリーミング中に、サービスでトークンの制限や解析の問題などのエラーが発生した場合、Responses API はエラー イベント ( 500429、および同様のエラー) を返す可能性があります。 アプリケーションはこのイベントを検出し、ストリーミングを正常に停止または再開する必要があります。 失敗したストリーミング応答中に生成されたトークンには課金されません。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

stream = client.responses.create(
    model="MODEL_NAME",
    input="Summarize Azure OpenAI Responses API in one sentence.",
    stream=True,
)

for event in stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="")

関数呼び出し

Responses API では、関数呼び出しがサポートされています。

import os
import json
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    tools=[
        {
            "type": "function",
            "name": "get_weather",
            "description": "Get weather for a location",
            "parameters": {
                "type": "object",
                "properties": {"location": {"type": "string"}},
                "required": ["location"],
            },
        }
    ],
    input="What is the weather in San Francisco?",
)

tool_outputs = []
for item in response.output:
    if item.type == "function_call" and item.name == "get_weather":
        args = json.loads(item.arguments)
        weather = {"location": args["location"], "temperature": "70 F"}
        tool_outputs.append(
            {
                "type": "function_call_output",
                "call_id": item.call_id,
                "output": json.dumps(weather),
            }
        )

final_response = client.responses.create(
    model="MODEL_NAME",
    previous_response_id=response.id,
    input=tool_outputs,
)

print(final_response.output_text)

ガードレールとコンテンツフィルタリングを処理する

Guardrail (コンテンツ フィルター) はデプロイ レベルで適用され、すべての Responses API 呼び出しで自動的に実行されるため、送信する入力とモデルによって生成される出力の両方が保護されます。 ガードレールは個別に構成します。 詳細については、「 ガードレールとコントロールの構成」を参照してください。 このセクションでは、Responses API を呼び出すときにガードレールの結果を検出して処理する方法を示します。

Responses API は、チャットの完了とは異なる方法でガードレールの結果を表示します。 chat completions が返す prompt_filter_results フィールドと content_filter_results フィールドの代わりに、レスポンス オブジェクトにはトップレベルの content_filters 配列が含まれます。 各エントリは、1 つのフィルター結果を記述します。

フィールド Description
blocked コンテンツがブロックされたかどうか。
source_type 結果が prompt (入力) に適用されるか、 completion (出力) に適用されるか。
content_filter_results 重大度レベルの hatesexualviolenceself_harm などのカテゴリの結果に加えて、 jailbreakindirect_attackprotected_material_textprotected_material_codeなどのオプションのカテゴリが表示されます。
content_filter_offsets 結果の適用対象となる文字オフセット。

メモ

content_filters配列は、基本 OpenAI 応答スキーマの一部ではない Microsoft Foundry 拡張機能であるため、SDK は型指定されたプロパティを公開しません。 次の例に示すように、生または追加のフィールドとして読み取ります。

ブロックされた入力を検出する

ガードレールによって入力がブロックされると、API はコード content_filterで HTTP 400 エラーを返します。 ブロックされたプロンプトを適切に処理するには、このエラーをキャッチします。

import os
from openai import OpenAI, BadRequestError

client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
)

# A blocked prompt raises BadRequestError with the code "content_filter"
try:
    response = client.responses.create(
        model="MODEL_NAME",
        input="This is a test."
    )
    print(response.output_text)
except BadRequestError as error:
    if error.code == "content_filter":
        print("The prompt was blocked by a guardrail.")
    else:
        raise

ガードレールのアノテーションを読み取る

要求が成功したら、応答から content_filters 配列を読み取り、入力と出力のガードレールの結果を調べます。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
)
response = client.responses.create(
    model="MODEL_NAME",
    input="This is a test."
)

# content_filters is an Azure extension, so read it from model_extra
content_filters = response.model_extra.get("content_filters", [])
for result in content_filters:
    print(f"Source: {result['source_type']}, Blocked: {result['blocked']}")

ガードレールのカテゴリと重大度レベルの詳細については、「 ガードレールの概要 」および 「注釈の操作」を参照してください。

コード インタープリター

コード インタープリター ツールを使用すると、セキュリティで保護されたサンドボックス環境でPythonコードを記述して実行できます。 次のようなさまざまな高度なタスクがサポートされています。

  • さまざまなデータ形式と構造を持つファイルの処理
  • データと視覚化を含むファイルの生成 (グラフなど)
  • 問題を解決するためのコードを繰り返し記述して実行します。モデルは、成功するまでコードをデバッグして再試行できます
  • トリミング、ズーム、回転などの画像変換を有効にして、サポートされているモデル (o3、o4-mini など) の視覚的推論を強化する
  • このツールは、データ分析、数学計算、およびコード生成を含むシナリオに特に役立ちます。
curl -X POST https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/responses \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
        "model": "MODEL_NAME",
        "tools": [
            { "type": "code_interpreter", "container": {"type": "auto"} }
        ],
        "instructions": "You are a personal math tutor. When asked a math question, write and run code using the python tool to answer the question.",
        "input": "I need to solve the equation 3x + 11 = 14. Can you help me?"
    }'
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    tools=[{"type": "code_interpreter", "container": {"type": "auto"}}],
    instructions="You are a math tutor. Write and run Python code to solve math problems.",
    input="Solve 3x + 11 = 14."
)

print(response.output_text)

Containers

重要

コード インタープリターには、Azure OpenAI の使用に対するトークン ベースの料金を超える追加料金があります。 Responses API が 2 つの異なるスレッドでコード インタープリターを同時に呼び出すと、2 つのコード インタープリター セッションが作成されます。 各セッションは既定で 1 時間アクティブで、アイドル タイムアウトは 20 分です。

コード インタープリター ツールにはコンテナーが必要です。コンテナーは、モデルがコードPython実行できる完全にサンドボックス化された仮想マシンです。 コンテナーには、アップロードされたファイルまたは実行中に生成されたファイルを含めることができます。

コンテナーを作成するには、新しい Response オブジェクトを作成するときにツール構成で "container": { "type": "auto", "file_ids": ["file-1", "file-2"] } を指定します。 これにより、新しいコンテナーが自動的に作成されるか、モデルのコンテキストで以前のcode_interpreter_callのアクティブなコンテナーが再利用されます。 APIwill の出力の code_interpreter_call には、生成された container_id が含まれます。 このコンテナーは、20 分間使用しないと有効期限が切れます。

ファイルの入力と出力

コード インタープリターを実行する場合、モデルは独自のファイルを作成できます。 たとえば、プロットの作成や CSV の作成を依頼した場合、コンテナーにこれらのイメージが直接作成されます。 次のメッセージの注釈でこれらのファイルを引用します。

モデル入力内のすべてのファイルがコンテナーに自動的にアップロードされます。 コンテナーに明示的にアップロードする必要はありません。

サポートされているファイル

ファイル形式 MIME の種類
.c text/x-c
.cs text/x-csharp
.cpp text/x-c++
.csv text/csv
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html text/html
.java text/x-java
.json application/json
.md text/markdown
.pdf application/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py text/x-python
.py text/x-script.python
.rb text/x-ruby
.tex text/x-tex
.txt text/plain
.css text/css
.js text/JavaScript
.sh application/x-sh
.ts application/TypeScript
.csv application/csv
.jpeg image/jpeg
.jpg image/jpeg
.gif image/gif
.pkl application/octet-stream
.png image/png
.tar application/x-tar
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml または "text/xml"
.zip application/zip

入力項目を一覧表示する

応答に送信された入力項目を取得します。 これは、モデルによって追加された項目 (関数呼び出しや圧縮項目など) を含む、完全な会話コンテキストを検査する場合に便利です。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

items = client.responses.input_items.list("<response_id>")
print(items.model_dump_json(indent=2))

応答の例

{
  "object": "list",
  "data": [
    {
      "id": "msg_...",
      "type": "message",
      "role": "user",
      "content": [{"type": "input_text", "text": "This is a test."}]
    }
  ]
}

画像入力

視覚対応モデルでは、画像をテキストと共に解釈できます。 この記事で後述する制限に従って、オブジェクト、図形、色、テクスチャを認識し、画像に含まれるテキストを読み取ることができます。

次のいずれかの方法で、要求への入力として画像を提供できます。

  • 画像ファイルへの完全な URL
  • Base64 でエンコードされたデータ URI
  • Files API で作成されたファイル ID

イメージの URL

パブリック URL でホストされているイメージを参照します。 モデルは画像を取得し、入力コンテンツの一部として含めます。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "What is in this image?"},
                {"type": "input_image", "image_url": "<image_url>"}
            ]
        }
    ]
)

print(response.output_text)

Base64 でエンコードされたイメージ

バイトを base64 データ URI としてエンコードして、イメージをインラインで送信します。 このパターンは、イメージがパブリック URL でホストされていない場合、または余分なネットワーク フェッチを回避する場合に使用します。

import base64
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

with open("path_to_your_image.jpg", "rb") as image_file:
    base64_image = base64.b64encode(image_file.read()).decode("utf-8")

response = client.responses.create(
    model="MODEL_NAME",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "What is in this image?"},
                {"type": "input_image", "image_url": f"data:image/jpeg;base64,{base64_image}"}
            ]
        }
    ]
)

print(response.output_text)

ファイルID

purpose="vision"を使用して Files API を使用してイメージをアップロードし、要求で返されたファイル ID を参照します。 この方法は、バイトを再送信せずに複数の要求で同じイメージを再利用する場合に便利です。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

def create_file(file_path):
    with open(file_path, "rb") as file_content:
        result = client.files.create(
            file=file_content,
            purpose="vision",
        )
        return result.id

file_id = create_file("path_to_your_image.jpg")

response = client.responses.create(
    model="MODEL_NAME",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "What is in this image?"},
                {"type": "input_image", "file_id": file_id},
            ],
        }
    ],
)

print(response.output_text)

画像入力の要件

次の表に、イメージ入力でサポートされているファイルの種類を示します。

ファイルの種類 MIME の種類
PNG image/png
JPEG image/jpeg
WebP image/webp
アニメーション以外の GIF image/gif

1 つの要求に、最大 100 個の画像を含めることができます。 個々のイメージ ファイルは 50 MB 未満である必要があり、要求内のすべてのイメージの合計サイズも 50 MB 未満である必要があります。

イメージは、次の追加要件を満たしている必要があります。

  • イメージはプロンプトに関連している必要があります。モデルは、関連のないビジュアル コンテンツ用に設計されていません。
  • 画像には、コンテンツ ポリシーに違反する有害または機密性の高いコンテンツを含めることはできません。
  • 画像ファイルは破損していたり、読み取れなかったりすることはできません。 モデルがイメージを処理できない場合、要求は失敗します。

画像の詳細レベルを選択する

detail コンテンツ パーツの input_image プロパティを使用して、モデルがイメージを処理する方法を制御します。 詳細が小さいほど使用されるトークンが少なく、高速になりますが、より詳細な場合は、より多くのトークンが使用されますが、モデルはより細かい機能をキャプチャできます。

{
  "type": "input_image",
  "image_url": "<image_url>",
  "detail": "high"
}

次の表では、各詳細レベルについて説明します。

詳細レベル Description
low このモデルでは、画像の解像度の低いバージョンが使用されます。 このオプションでは、最も少ないトークンが使用され、最速の応答が生成されますが、モデルでは細かい詳細が見逃される可能性があります。
high このモデルでは、画像の解像度が高いバージョンが使用されます。 このオプションは、より詳細な情報をキャプチャしますが、より多くのトークンを使用し、応答に時間がかかります。
auto これが既定値です。 モデルは、画像とプロンプトに基づいて適切な詳細レベルを選択します。

画像入力の制限事項

ビジョン対応モデルには、次の制限があります。

  • 医療画像: このモデルは、CT スキャンなどの特殊な医療画像を解釈するのに適していません。また、医療アドバイスには使用しないでください。
  • 英語以外のテキスト: 日本語や韓国語など、ラテン以外のアルファベットのテキストを含む画像を処理する場合、モデルが最適に動作しない可能性があります。
  • 小さいテキスト: 画像内のテキストを拡大して読みやすくしますが、重要な詳細をトリミングしないようにします。
  • 回転: モデルは、回転した、または上下逆さまのテキストや画像を誤って解釈する可能性があります。
  • ビジュアル要素: モデルは、色やスタイル (実線、破線、点線など) が異なるグラフやテキストに苦労する可能性があります。
  • 空間推論: このモデルは、チェスの位置の識別など、正確な空間ローカライズを必要とするタスクでは困難です。
  • 精度: モデルでは、場合によっては不適切な説明やキャプションが生成される場合があります。
  • 画像の形状:モデルはパノラマ画像と魚眼画像では困難です。
  • メタデータとサイズ変更: モデルは元のファイル名やメタデータを処理せず、画像は分析前にサイズ変更され、元のディメンションに影響します。
  • カウント: モデルは、画像内のオブジェクトの概数を示す場合があります。
  • CAPTCHA: 安全上の理由から、CAPTCHA の送信をブロックするシステムが整っています。

ファイル入力

ビジョン機能を備えたモデルでは、PDF 入力がサポートされます。 PDF ファイルは、Base64 でエンコードされたデータまたはファイル ID として提供できます。 モデルが PDF コンテンツを解釈できるように、抽出されたテキストと各ページの画像の両方がモデルのコンテキストに含まれます。 これは、重要な情報が図やテキスト以外のコンテンツを介して伝達される場合に便利です。

メモ

  • 抽出されたすべてのテキストと画像は、モデルのコンテキストに配置されます。 PDF を入力として使用した場合の価格とトークンの使用への影響を理解していることを確認してください。
  • 1 つの API 要求では、複数のファイルを含めることができますが、各ファイルは 50 MB 未満である必要があります。 要求内のすべてのファイルの合計制限は 50 MB です。
  • PDF ファイルを入力として受け入れることができるのは、テキスト入力と画像入力の両方をサポートするモデルのみです。
  • purposeuser_dataは現在サポートされていません。 一時的な回避策として、目的をassistantsに設定する必要があります。

PDF を Base64 に変換して分析する

バイトを base64 データ URI としてエンコードして、PDF をインラインで送信します。 モデルは、抽出されたテキストと各ページのレンダリングされた画像の両方を受け取ります。

import base64
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

with open("PDF-FILE-NAME.pdf", "rb") as f:
    base64_string = base64.b64encode(f.read()).decode("utf-8")

response = client.responses.create(
    model="MODEL_NAME",
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_file",
                    "filename": "PDF-FILE-NAME.pdf",
                    "file_data": f"data:application/pdf;base64,{base64_string}",
                },
                {"type": "input_text", "text": "Summarize this PDF."},
            ],
        },
    ]
)

print(response.output_text)

PDF をアップロードして分析する

purpose="assistants"を使用して PDF ファイルをアップロードします。 purposeuser_dataは現在サポートされていません。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

file = client.files.create(
    file=open("nucleus_sampling.pdf", "rb"),
    purpose="assistants"
)

response = client.responses.create(
    model="MODEL_NAME",
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_file", "file_id": file.id},
                {"type": "input_text", "text": "Summarize this PDF."},
            ],
        },
    ]
)

print(response.output_text)

リモート MCP サーバーの使用

モデルの機能を拡張するには、リモート モデル コンテキスト プロトコル (MCP) サーバーでホストされているツールに接続します。 これらのサーバーは開発者や組織によって管理され、応答 API など、MCP と互換性のあるクライアントがアクセスできるツールを公開します。

モデル コンテキスト プロトコル (MCP) は、アプリケーションが大規模言語モデル (LLM) にツールとコンテキスト データを提供する方法を定義するオープン標準です。 これにより、外部ツールをモデル ワークフローに一貫性のあるスケーラブルに統合できます。

次の例は、リモート MCP サーバーを使用して、Azure REST API リポジトリに関する情報を照会する方法を示しています。 このモデルは、リポジトリのコンテンツに対する理由をリアルタイムで取得します。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    tools=[
        {
            "type": "mcp",
            "server_label": "github",
            "server_url": "https://contoso.com/Azure/azure-rest-api-specs",
            "require_approval": "never"
        }
    ],
    input="What transport protocols are supported in the 2025-03-26 version of the MCP spec?"
)

print(response.output_text)

MCP ツールは Responses API でのみ機能し、すべての新しいモデル (gpt-4o、gpt-4.1、および推論モデル) で使用できます。 MCP ツールを使用している場合は、ツール定義のインポートまたはツール呼び出し時に使用されるトークンに対してのみ支払います。追加料金はかかりません。

承認

既定では、Responses API は、リモート MCP サーバーとデータを共有する前に明示的な承認を必要とします。 この承認手順は、透明性を確保するのに役立ち、外部に送信される情報を制御できます。

リモート MCP サーバーと共有されているすべてのデータを確認し、必要に応じて監査目的でログに記録することをお勧めします。

承認が必要な場合、モデルは応答出力で mcp_approval_request 項目を返します。 このオブジェクトには、保留中の要求の詳細が含まれており、続行する前にデータを検査または変更できます。

{
  "id": "mcpr_682bd9cd428c8198b170dc6b549d66fc016e86a03f4cc828",
  "type": "mcp_approval_request",
  "arguments": {},
  "name": "fetch_azure_rest_api_docs",
  "server_label": "github"
}

リモート MCP 呼び出しを続行するには、mcp_approval_response項目を含む新しい応答オブジェクトを作成して、承認要求に応答する必要があります。 このオブジェクトは、モデルが指定されたデータをリモート MCP サーバーに送信することを許可する意図を確認します。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    tools=[
        {
            "type": "mcp",
            "server_label": "github",
            "server_url": "https://contoso.com/Azure/azure-rest-api-specs",
            "require_approval": "never"
        }
    ],
    previous_response_id="<previous_response_id>",
    input=[
        {
            "type": "mcp_approval_response",
            "approve": True,
            "approval_request_id": "<approval_request_id>"
        }
    ]
)

print(response.output_text)

認証

重要

  • Responses API 内の MCP クライアントには、TLS 1.2 以上が必要です。
  • 現在、相互 TLS (mTLS) はサポートされていません。
  • Azure サービス タグ は現在、MCP クライアント トラフィックではサポートされていません。

GitHub MCP サーバーとは異なり、ほとんどのリモート MCP サーバーでは認証が必要です。 Responses API の MCP ツールはカスタム ヘッダーをサポートしているため、必要な認証スキームを使用してこれらのサーバーに安全に接続できます。

API キー、OAuth アクセス トークン、その他の資格情報などのヘッダーは、要求で直接指定できます。 最も一般的に使用されるヘッダーは、 Authorization ヘッダーです。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    input="What is this repo in 100 words?",
    tools=[
        {
            "type": "mcp",
            "server_label": "github",
            "server_url": "https://contoso.com/Azure/azure-rest-api-specs",
            "headers": {"Authorization": "Bearer $YOUR_MCP_TOKEN"}
        }
    ]
)

print(response.output_text)

バックグラウンド タスク

バックグラウンド モードでは、 o3o1-proなどの推論モデルを使用して、実行時間の長いタスクを非同期的に実行できます。 これは、完了までに数分かかる複雑なタスク (Codex や Deep Research スタイルのエージェントなど) に役立ちます。 "background": trueで要求が送信されると、タスクは非同期的に処理され、その状態をポーリングします。

バックグラウンド タスクを開始する

タスクをキューに入れるには、要求で background=true を設定します。 サービスは、応答 ID と queued 状態で直ちに返されます。その ID を使用して、タスクのポーリング、ストリーム、または取り消しを行います。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    input="Write me a very long story.",
    background=True
)

print(response.status)

完了に関するアンケート

ステータスが queued または in_progress の間、ポーリングを続行します。 応答が終了状態になると、取得できます。

from time import sleep

while response.status in {"queued", "in_progress"}:
    print(f"Current status: {response.status}")
    sleep(2)
    response = client.responses.retrieve(response.id)

print(f"Final status: {response.status}\nOutput:\n{response.output_text}")

バックグラウンド タスクを取り消す

cancel エンドポイントで進行中のバックグラウンド タスクを取り消します。 キャンセル操作は冪等であり、以降の呼び出しでは最終的な応答オブジェクトが返されます。

response = client.responses.cancel("<response_id>")
print(response.status)

バックグラウンド応答をストリーミングするには、 backgroundstream の両方を trueに設定します。 このパターンでは、接続が切断された場合にストリーミングを再開できます。 各イベントの sequence_number で自分の位置を追跡します。

stream = client.responses.create(
    model="MODEL_NAME",
    input="Write me a very long story.",
    background=True,
    stream=True,
)

cursor = None
for event in stream:
    print(event)
    cursor = event["sequence_number"]

バックグラウンド応答では、現在、同期応答よりも、最初のトークンまでの待機時間が長くなっています。 このギャップを減らすために、改善が進行中です。

制限

  • バックグラウンド モードでは、 store=trueが必要です。 ステートレス要求はサポートされていません。
  • 元の要求が stream=true含まれている場合にのみ、ストリーミングを再開できます。
  • 同期応答を取り消すには、接続を直接終了します。

特定のポイントからのストリーミングを再開する

ストリーミング接続が切断された場合は、stream=truestarting_after=<sequence_number>と共にGETを応答に渡すことで、既知のイベントから再開できます。 サービスは、そのシーケンス番号の後に出力されたイベントを再生します。

curl -N -X GET "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/responses/<response_id>?stream=true&starting_after=42" \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY"

暗号化された推論項目

ステートレス モード (store=false) で Responses API を使用する場合でも、会話のターン間で推論コンテキストを保持する必要があります。 これを行うには、暗号化された推論項目を要求に含めます。

複数のターンにわたって推論項目を保持するには、 reasoning.encrypted_contentinclude パラメーターに追加します。 その後、応答には暗号化されたバージョンの推論トレースが含まれています。これは、今後の要求に渡すことができます。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

response = client.responses.create(
    model="MODEL_NAME",
    reasoning={"effort": "medium"},
    input="What is the weather like today?",
    tools=[
        # Replace with your function or tool definitions.
    ],
    include=["reasoning.encrypted_content"],
    store=False,
)

print(response.output_text)

Responses API を使用すると、会話とマルチステップ ワークフローの一部として画像を生成できます。 コンテキスト内の画像の入力と出力をサポートし、画像を生成および編集するための組み込みのツールが含まれています。

スタンドアロンの Image API と比較すると、Responses API には次の 2 つの利点があります。

  • ストリーミング: 生成中に部分的な画像出力を表示して、認識される待機時間を改善します。
  • 柔軟な入力: 生の画像バイトに加えて、画像ファイル ID を入力として受け入れます。

メモ

Responses API の画像生成ツールは、 gpt-image-1シリーズ モデルでサポートされており、互換性のあるチャットと推論モデルのセットから呼び出すことができます。 サポートされているオーケストレーション モデルの現在の一覧については、この記事で後述する 「サポートされているモデル 」セクションを参照してください。

イメージ生成ツールは現在、ストリーミング モードをサポートしていません。 部分的なイメージをストリーミングするには、Responses API の外部から直接 イメージ生成 API を呼び出します。

Responses API を使用して、GPT イメージ モデルを使用して会話型イメージ エクスペリエンスを構築します。

import base64
import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(
    base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key=token_provider,
    default_headers={
        "x-ms-oai-image-generation-deployment": os.getenv("IMAGE_MODEL_NAME"),
        "api_version": "preview",
    },
)

response = client.responses.create(
    model="MODEL_NAME",
    input="Generate an image of a gray tabby cat hugging an otter with an orange scarf.",
    tools=[{"type": "image_generation"}],
)

image_data = [
    output.result
    for output in response.output
    if output.type == "image_generation_call"
]

if image_data:
    with open("otter.png", "wb") as f:
        f.write(base64.b64decode(image_data[0]))

推論モデル

応答 API で推論モデルを使用する方法の例については、 推論モデルガイドを参照してください。

コンピューターの使用

Playwright でのコンピューターの使用は、 専用のコンピューター使用モデル ガイドに移行しました。

トラブルシューティング

  • 401/403: Microsoft Entra IDを使用する場合は、トークンのスコープが https://ai.azure.com/.default であることを確認します。 API キーを使用する場合は、リソースに正しいキーを使用していることを確認します。
  • 404: model がデプロイ名と一致するかどうかを確認します。