👍

【サンプルコードあり】OpenAI Agents SDKをAzure OpenAI Serviceで動かす

に公開

OpenAI Agents SDKが発表されました。せっかくなのでAzure OpenAI Serviceでも使いたいですよね。

本記事のサンプルコードで動作確認ができました。
この記事の最下部のコードを、使いやすく改変したものです。

コード

import os
from agents import Agent, Runner, AsyncOpenAI, OpenAIChatCompletionsModel, set_default_openai_client, set_tracing_disabled, set_tracing_export_api_key
from pydantic import BaseModel

# .envファイルの読み込み
from dotenv import load_dotenv
load_dotenv()
AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY")
AZURE_OPENAI_DEPLOYMENT_NAME = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME")
AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION")
AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT")

## .envの参考
# OPENAI_API_KEY=sk-proj- ←トレースをしない場合はなくても良い
# AZURE_OPENAI_API_KEY=your_api_key
# AZURE_OPENAI_API_VERSION=2024-08-01-preview
# AZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com/
# AZURE_OPENAI_DEPLOYMENT=your-deployment-name

# カスタムのOpenAIクライアントを作成
custom_client = AsyncOpenAI(
    api_key=AZURE_OPENAI_API_KEY,
    base_url=f"{AZURE_OPENAI_ENDPOINT}/openai/deployments/{AZURE_OPENAI_DEPLOYMENT_NAME}",
    default_headers={"api-key": AZURE_OPENAI_API_KEY},
    default_query={"api-version": AZURE_OPENAI_API_VERSION},
)

# カスタムのOpenAIクライアントをデフォルトに設定
set_default_openai_client(custom_client)

# 選択肢①:トレース機能を無効にする(オフにしないと401エラーが出る。)
set_tracing_disabled(disabled=True)

# 選択肢②:OpenAIのDashboardに送る
# set_tracing_export_api_key(os.getenv("OPENAI_API_KEY")) # 「OpenAIのAPIキー」が必要

# 出力の型を定義
class HomeworkOutput(BaseModel):
    is_homework: bool
    reasoning: str

# エージェントの定義
guardrail_agent = Agent(
    name="Guardrail check",
    instructions="宿題に関連する質問かどうかを判断します",
    output_type=HomeworkOutput,
    model=OpenAIChatCompletionsModel( 
        model=AZURE_OPENAI_DEPLOYMENT_NAME,
        openai_client=custom_client,
    ) # ChatCompletions APIを使っているのでResponses APIの機能である、tools=[WebSearchTool()]は使えない。
)

# テストケース1
# 宿題に関連する質問ではない
result = Runner.run_sync(guardrail_agent, "おすすめのご飯は?")  
print(result.final_output)

# テストケース2
# 宿題に関連する質問
result = Runner.run_sync(guardrail_agent, "2+2は?")
print(result.final_output)

注意点

2点引っかかったポイントがあったため、ご紹介します。

①トレース機能をオフにしないとエラーになる

トレース機能をオフにするか、別途OpenAIのAPIキーを設定することで、AOAI(Azure OpenAI Service)のモデルを使いながら、トレース結果の確認だけはOpenAIのDashboardを使うことができます。

# 選択肢①:トレース機能を無効にする(オフにしないと401エラーが出る。)
set_tracing_disabled(disabled=True)

# 選択肢②:OpenAIのDashboardに送る
# set_tracing_export_api_key(os.getenv("OPENAI_API_KEY")) # 「OpenAIのAPIキー」が必要

選択肢②を選んだ場合、モデル自体はAOAIを使っていますが、トレース結果はOpenAIのDashboardに保存されているのが確認できます。

②Responses APIの機能であるbuild-in-toolsが使えない

# エージェントの定義
guardrail_agent = Agent(
    name="Guardrail check",
    instructions="宿題に関連する質問かどうかを判断します",
    output_type=HomeworkOutput,
    model=OpenAIChatCompletionsModel( 
        model=AZURE_OPENAI_DEPLOYMENT_NAME,
        openai_client=custom_client,
    ) # ChatCompletions APIを使っているのでResponses APIの機能である、tools=[WebSearchTool()]は使えない。
)

Agents SDKでは、Responses APIでの利用が主に想定されています。Responses APIは3/17時点ではOpenAI公式しか対応していないと思われます。今後、AOAIでも対応するかもしれません。

今回はAOAIを使いたいので、旧型APIであるChatCompletions APIを使ってAgents SDKを動かします。
そのため、Responses APIの機能であるbuild-in-toolsは使えません。

https://platform.openai.com/docs/guides/responses-vs-chat-completions

出力結果

このコードではガードレールのAgentsを例にして質問の内容が宿題に関係あるか、真偽地とその判定基準のみを出力させています。
その後の実際に回答する部分は含まれていません。

is_homework=False reasoning='この質問は、食事の選択や料理の提案に関するものであり、宿題や学業に関するものではありません。'
is_homework=True reasoning='この質問は基本的な算数の計算問題であり、宿題の一部として出される可能性があります。'

参考にした記事

↓この記事はそのままだと動きませんでした。
https://techcommunity.microsoft.com/blog/azure-ai-services-blog/use-azure-openai-and-apim-with-the-openai-agents-sdk/4392537
https://loner49th.hatenablog.com/entry/2025/03/16/230237
https://github.com/openai/openai-agents-python/issues/96

私の関連記事

https://zenn.dev/k_zumi_dev/articles/e6b0c20e941ad3

Discussion