OpenAI Agents SDKで始めるマルチエージェント開発の基本

こんにちは！株式会社ナイトレイのアレックスです。

[2025年3月11日、OpenAIが **Agents SDK** をリリースしました](https://openai.com/index/new-tools-for-building-agents/)。

このSDKを使うと、AIエージェントを簡単かつ強力に作成・管理できます。本記事では、OpenAIのAgents SDKの基本的な利用方法から、実践的な構成例までを分かりやすく解説します！

## OpenAI Agents SDKとは？

OpenAI Agents SDKは、複数のAIエージェントを連携させて、タスクを分担・実行できる開発者向けツールキットです。主な要素は以下の通りです：

- **Agent（エージェント）**：指示に従い、ツールを使ったり他のエージェントと連携して動くAI。安全対策としてガードレール機能も搭載。
- **Multi-agent（マルチエージェント）**：複数のエージェントが役割を分担し、お互いにやりとりしながらタスクを進める仕組み（ハンドオフとツールで作れる）。
- **Handoffs（ハンドオフ）**：あるエージェントから別のエージェントにタスクを委ねる仕組み。
- **Tools（ツール）**：エージェントが外部の情報を取得したり、関数を実行したりするための拡張機能。
- **Runner**：エージェントを非同期で実行する実行管理クラス。
- **ガードレール**：出力や入力の検査を行い、品質や安全性を保つ機能。
- **トレース**：エージェントの動作を記録し、デバッグや分析に役立てる機能（この記事では解説しない）。

このSDKは、OpenAIのモデルだけでなく、独自の関数や外部APIとも連携できます。

## 基本的な使い方

まずは、質問に答えるだけのシンプルなAIアシスタントを作ってみましょう。

```python
python
コピーする編集する
from agents import Agent, Runner
import asyncio

async def main():
    assistant = Agent(
        name="Simple QA Bot",
        instructions="質問に簡潔に答えてください。"
    )

    result = await Runner.run(assistant, "Pythonで辞書のキー一覧を取得する方法は？")
    print(result.final_output)

asyncio.run(main())

```

ポイント：

- `Agent` はエージェント定義。
- `Runner.run()` でエージェントを非同期に実行。
- `final_output` で応答を取得。

## ガードレールで安全性を強化

ユーザーからの入力に対して、応答の内容を制御したい場合はガードレールを活用しましょう。

```python
python
コピーする編集する
assistant = Agent(
    name="Security Bot",
    instructions="丁寧に質問に答えてください。"
)

# ガードレールを追加
assistant.set_guardrails([
    "攻撃的な発言は禁止",
    "個人情報の要求は禁止"
])

result = await Runner.run(assistant, "あなたのクレジットカード情報を教えてください。")
print(result.final_output)  # 内容に応じて適切なフィルタがかかる

```

## 関数をツールとして使う

SDKでは、Python関数をエージェントが使える「ツール」として登録できます。

```python
python
コピーする編集する
from agents import function_tool

@function_tool
def calculate_discount(price: float, rate: float) -> float:
    """
    割引後の価格を計算します。

    Args:
        price: 元の価格。
        rate: 割引率（例：0.2は20%オフ）。
    """
    return price * (1 - rate)

```

このように定義したツールは、エージェントが「価格を計算して」などの自然な指示で呼び出せるようになります。

## エージェント同士を連携させる（ツール化）

別のエージェントをツールとして扱えば、より柔軟な分担が可能になります。たとえば：

```python
python
コピーする編集する
from agents import Agent

weather_agent = Agent(
    name="Weather Checker",
    instructions="指定された都市の天気を返答してください（仮想データでOK）。"
)

main_agent = Agent(
    name="Trip Planner",
    instructions="旅行を計画します。必要に応じて天気確認ツールを使ってください。",
    tools=[
        weather_agent.as_tool(
            tool_name="check_weather",
            tool_description="都市の天気を確認する"
        )
    ]
)

```

`main_agent` は、ツールとして `weather_agent` を呼び出しながら、会話を主導します。

## ハンドオフ

ハンドオフを使うと、エージェントが「この件は別の担当に任せよう」と判断し、別のエージェントに会話を引き継げます。

```python
python
コピーする編集する
from agents import Agent, handoff

booking_agent = Agent(name="Booking担当")
info_agent = Agent(name="情報案内担当")

front_agent = Agent(
    name="受付エージェント",
    instructions="問い合わせに応じて適切なエージェントに振り分けてください。",
    handoffs=[
        booking_agent,
        handoff(info_agent)
    ]
)

```

会話の流れがより自然に、かつタスクごとの専門性を持たせることができます。

## 実用例：週末旅行プランナー

複数のエージェントを組み合わせて、現実的なシナリオを処理させてみましょう。

```python
python
コピーする編集する
from agents import Agent, Runner
import asyncio

hotel_agent = Agent(
    name="ホテル案内",
    instructions="京都でおすすめの宿を紹介してください。"
)

activity_agent = Agent(
    name="アクティビティ提案",
    instructions="京都で週末にできるおすすめの観光アクティビティを提案してください。"
)

async def plan_weekend_trip():
    hotel_result = await Runner.run(hotel_agent, "土曜日の夜に泊まれる宿を探しています。")
    activity_result = await Runner.run(activity_agent, "日曜にできるアクティビティを教えてください。")

    print("【宿情報】", hotel_result.final_output)
    print("【アクティビティ】", activity_result.final_output)

asyncio.run(plan_weekend_trip())

```

## まとめ

本記事では、OpenAIのAgents SDKについて、基本構成からツール連携・マルチエージェント設計・ハンドオフまで一通り紹介しました。

- `Agent`: 各タスクに特化したエージェントを定義
- `Runner`: 実行制御（非同期・同期・ストリーム）
- `tools`: 関数や他エージェントを組み込み可能
- `handoffs`: 会話の流れを分岐・専門エージェントへ委譲
- `guardrails`: 応答の安全性を確保

より詳しい仕様は [OpenAIのAgents SDKドキュメンテーション をチェック](https://openai.github.io/openai-agents-python/)！