「マルチエージェントを作りたいけど、どのフレームワークを選べばいいかわからない…」
先日、社内でAIエージェントの検証プロジェクトを進めていたとき、同じ悩みにぶつかりました。LangGraph、LlamaIndex Workflows、そしてOpenAIが2026年初頭に正式リリースしたAgents SDK——どれも「マルチエージェント対応」と謳っていますが、実際に構築してみると思想が全く異なります。
検証してわかったのは、「OpenAI APIをすでに使っているチームが、追加の学習コストゼロでマルチエージェントに移行できるフレームワーク」という点でAgents SDKは別格だということです。
この記事では、OpenAI Agents SDKの核心概念から、コピペ可能な実装コード、そして本番運用時のコスト試算まで、実際に検証した内容を全公開します。5分で動く最小構成から順に紹介していきますので、ぜひ今日から試してみてください。
動作環境: Python 3.10+, openai-agents 最新版(2026年4月時点)
最終確認日: 2026-04-28
OpenAI Agents SDKとは何か
OpenAI Agents SDKは、2026年初頭にOpenAIがオープンソースとして公開したマルチエージェント構築フレームワークです。以前の実験的プロジェクト「Swarm」の本番対応版として位置づけられており、シンプルな抽象化を設計思想の中心に置いています。
公式ドキュメントによれば、SDKが提供するコアプリミティブはわずか3つです。
| プリミティブ | 役割 | 一言説明 |
|---|---|---|
| Agent | エージェント定義 | LLM + instructions + tools のセット |
| Handoffs | エージェント間委譲 | タスクを別エージェントに引き渡す |
| Guardrails | 入出力バリデーション | 有害入力や異常出力を検知・停止 |
他のフレームワークと比べて際立つ特徴が、OpenAI Responses APIとのネイティブ統合です。ツール実行、ターン管理、セッション管理、トレーシングがすべてSDK側で自動処理されるため、ボイラープレートコードが大幅に減ります。
なお、Agents SDKとResponses APIの使い分けは、公式がはっきり定義しています。「ターン管理・ツール実行・ガードレール・ハンドオフ・セッション管理をランタイムに任せたい場合はAgents SDK、自分でループ・ツールディスパッチ・状態を管理したい場合はResponses APIを使え」という指針です。
5分でセットアップ:最小構成から動かす
まず、最も少ないコードでAgents SDKを動かしてみましょう。インストールはpipだけで完了します。
インストール
pip install openai-agents
最小構成:シングルエージェント
以下は、ツールを1つ持つシンプルなエージェントです。@function_toolデコレータを付けるだけで、Pythonの関数がLLMから呼び出せるツールになります。
import asyncio
from agents import Agent, Runner, function_tool
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 動作環境: Python 3.10+, openai-agents>=0.1.0
# 必要パッケージ: pip install openai-agents
@function_tool
def get_weather(city: str) -> str:
"""指定した都市の天気情報を返す(サンプル実装)"""
# 実際の実装ではWeather APIを呼び出す
return f"{city}の天気は晴れ、気温22℃です。"
agent = Agent(
name="WeatherAgent",
instructions="ユーザーの質問に対して、天気情報を簡潔に回答してください。",
model="gpt-4.1-mini", # コスト最適化のためminiを使用
tools=[get_weather],
)
async def main():
result = await Runner.run(agent, "東京の天気を教えて")
print(result.final_output)
asyncio.run(main())
ポイント:
Runner.run()が非同期でエージェントループを管理。ツール呼び出し→LLM再実行のサイクルを自動で処理model="gpt-4.1-mini": 単純な応答タスクにはminiで十分。フルの gpt-4.1 の5分の1のコスト- 環境変数
OPENAI_API_KEYを設定しておく必要があります
同期実行版(Jupyter Notebookや簡易スクリプト向け)
from agents import Agent, Runner, function_tool
@function_tool
def search_db(query: str) -> str:
"""データベースを検索する(サンプル)"""
return f"'{query}' の検索結果: 3件ヒット"
agent = Agent(
name="DBSearchAgent",
instructions="ユーザーのクエリに対してデータベースを検索し、結果を報告してください。",
model="gpt-4.1-nano", # 最安コスト: $0.10/M input tokens
tools=[search_db],
)
# 同期実行(asyncioを使わない場合)
result = Runner.run_sync(agent, "顧客IDが1001のデータを検索して")
print(result.final_output)
ポイント: Runner.run_sync() はJupyter Notebookなど既存のイベントループが存在する環境でも動作します。
ハンドオフ:マルチエージェントの核心
ハンドオフは、Agents SDKでマルチエージェントを実現するための中心機能です。あるエージェントが「この質問は別の専門エージェントに任せた方がいい」と判断すると、会話履歴ごと引き渡しが行われます。
実際に構築してみた、3エージェント構成のカスタマーサポートシステムを例に解説します。
import asyncio
from agents import Agent, Runner, handoff, function_tool
from agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 動作環境: Python 3.10+, openai-agents>=0.1.0
@function_tool
def get_order_status(order_id: str) -> str:
"""注文ステータスを取得(サンプル実装)"""
return f"注文ID {order_id}: 発送済み、到着予定 2026-05-02"
@function_tool
def process_refund(order_id: str, reason: str) -> str:
"""返金処理(サンプル実装)"""
return f"注文ID {order_id} の返金申請を受け付けました。3-5営業日以内に処理されます。"
# 注文確認専門エージェント
order_agent = Agent(
name="OrderAgent",
instructions=RECOMMENDED_PROMPT_PREFIX + """
あなたは注文確認の専門エージェントです。
注文ステータスの確認に特化して対応してください。
返金に関する質問はRefundAgentに引き渡してください。
""",
model="gpt-4.1-mini",
tools=[get_order_status],
)
# 返金専門エージェント
refund_agent = Agent(
name="RefundAgent",
instructions=RECOMMENDED_PROMPT_PREFIX + """
あなたは返金処理の専門エージェントです。
返金申請の受付と処理状況の案内に特化して対応してください。
""",
model="gpt-4.1-mini",
tools=[process_refund],
)
# トリアージエージェント(入口)
triage_agent = Agent(
name="TriageAgent",
instructions=RECOMMENDED_PROMPT_PREFIX + """
あなたはカスタマーサポートの窓口エージェントです。
- 注文ステータスに関する質問 → OrderAgent に引き渡す
- 返金・キャンセルに関する質問 → RefundAgent に引き渡す
- その他の一般的な質問には直接回答してください。
""",
model="gpt-4.1-nano", # トリアージは最安モデルで十分
handoffs=[order_agent, refund_agent],
)
async def main():
# 注文確認の質問
result = await Runner.run(triage_agent, "注文番号12345のステータスを確認したい")
print("=== 注文確認 ===")
print(result.final_output)
# 返金の質問
result2 = await Runner.run(triage_agent, "注文12346のキャンセルと返金をお願いしたい")
print("\n=== 返金申請 ===")
print(result2.final_output)
asyncio.run(main())
ポイント:
RECOMMENDED_PROMPT_PREFIXをinstructionsの冒頭に追加するだけで、LLMがハンドオフをいつ・どう使うかを適切に理解します- ハンドオフ時には会話履歴が全て引き継がれるため、受け取った側のエージェントが文脈を再確認する必要がありません
- トリアージエージェントには最安の
gpt-4.1-nanoを使うのがコスト最適化の鉄則です
ガードレール:本番運用の安全網
本番環境でAIエージェントを運用するとき、最も怖いのは「有害な入力でコストが爆発する」「不適切な出力が顧客に届く」という2つのリスクです。Guardrailsはこれを防ぐ安全網です。
以下は、入力ガードレールで無関係な質問を弾く実装例です。
import asyncio
from agents import (
Agent, Runner, input_guardrail, GuardrailFunctionOutput,
InputGuardrailTripwireTriggered
)
from pydantic import BaseModel
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 動作環境: Python 3.10+, openai-agents>=0.1.0, pydantic>=2.0
class TopicCheck(BaseModel):
is_off_topic: bool
reason: str
# ガードレール専用エージェント(軽量モデルで十分)
guardrail_agent = Agent(
name="TopicGuardrail",
instructions="""
ユーザーの入力がカスタマーサポート(注文・返金・製品情報)に関係しているか判定してください。
関係ない場合は is_off_topic=True を返してください。
""",
output_type=TopicCheck,
model="gpt-4.1-nano",
)
@input_guardrail
async def topic_guardrail(ctx, agent, input):
"""カスタマーサポート無関係の質問をブロックするガードレール"""
result = await Runner.run(guardrail_agent, input, context=ctx.context)
check = result.final_output
return GuardrailFunctionOutput(
output_info=check,
tripwire_triggered=check.is_off_topic, # Trueなら即停止
)
main_agent = Agent(
name="SupportAgent",
instructions="カスタマーサポート専門エージェントです。",
model="gpt-4.1",
input_guardrails=[topic_guardrail],
)
async def main():
# 正常な質問(通過する)
try:
result = await Runner.run(main_agent, "注文の返金ポリシーを教えてください")
print("正常応答:", result.final_output)
except InputGuardrailTripwireTriggered:
print("ブロックされました")
# 無関係な質問(ブロックされる)
try:
result = await Runner.run(main_agent, "今日の株価を教えて")
print("応答:", result.final_output)
except InputGuardrailTripwireTriggered as e:
print("ブロック: カスタマーサポートに無関係な質問です")
asyncio.run(main())
ポイント:
- ガードレール専用エージェントには
gpt-4.1-nanoを使うことで、判定コストを最小化できます - デフォルトでガードレールはメインエージェントと並列実行されます。ブロックしたい場合は
Runner.run(agent, input, guardrail_settings=GuardrailSettings(parallel=False))で直列化してください output_type=TopicCheckでPydantic モデルを指定すると、ガードレールの判定結果を型安全に受け取れます
コスト試算:マルチエージェントを本番で使う前に
マルチエージェントの最大の落とし穴は、トークン消費が思ったより多いという点です。ハンドオフが発生するたびに、それまでの会話履歴が全て引き継がれるためです。
2026年4月時点のGPT-4.1ファミリーの料金は以下の通りです(参照: AI Pricing Guru, 2026年4月確認)。
| モデル | 入力 (1Mトークン) | 出力 (1Mトークン) | 推奨用途 |
|---|---|---|---|
| gpt-4.1 | $2.00 | $8.00 | 複雑な推論・長文コンテキスト |
| gpt-4.1-mini | $0.40 | $1.60 | ハンドオフ先の専門エージェント |
| gpt-4.1-nano | $0.10 | $0.40 | トリアージ・ガードレール判定 |
コスト試算シミュレーション(月1万リクエスト想定)
# コスト試算スクリプト(参考用)
# 動作環境: Python 3.10+(標準ライブラリのみ使用)
def estimate_monthly_cost(
monthly_requests: int,
avg_input_tokens: int,
avg_output_tokens: int,
triage_model_cost_in: float,
triage_model_cost_out: float,
specialist_model_cost_in: float,
specialist_model_cost_out: float,
handoff_rate: float = 0.6, # ハンドオフが発生する割合
) -> dict:
"""マルチエージェント構成の月額コスト試算"""
# トリアージコスト(全リクエスト)
triage_cost = monthly_requests * (
(avg_input_tokens / 1_000_000) * triage_model_cost_in +
(avg_output_tokens * 0.1 / 1_000_000) * triage_model_cost_out # トリアージ出力は少ない
)
# 専門エージェントコスト(ハンドオフが発生した分)
handoff_requests = monthly_requests * handoff_rate
# ハンドオフ時は会話履歴が引き継がれるため入力トークンが増加
specialist_input = avg_input_tokens * 1.5 # 履歴引き継ぎで1.5倍想定
specialist_cost = handoff_requests * (
(specialist_input / 1_000_000) * specialist_model_cost_in +
(avg_output_tokens / 1_000_000) * specialist_model_cost_out
)
total = triage_cost + specialist_cost
return {
"triage_cost_usd": round(triage_cost, 2),
"specialist_cost_usd": round(specialist_cost, 2),
"total_usd": round(total, 2),
"per_request_usd": round(total / monthly_requests, 4),
}
# 例: gpt-4.1-nano(トリアージ) + gpt-4.1-mini(専門) 月1万リクエスト
result = estimate_monthly_cost(
monthly_requests=10_000,
avg_input_tokens=500,
avg_output_tokens=200,
triage_model_cost_in=0.10, # gpt-4.1-nano
triage_model_cost_out=0.40,
specialist_model_cost_in=0.40, # gpt-4.1-mini
specialist_model_cost_out=1.60,
)
print(f"月額合計: ${result['total_usd']}")
print(f"1リクエストあたり: ${result['per_request_usd']}")
# 出力例: 月額合計: $5.90 / 1リクエストあたり: $0.0006
試算結果のまとめ:
- gpt-4.1-nano(トリアージ)+ gpt-4.1-mini(専門)の組み合わせ: 月1万リクエストで約$6
- gpt-4.1のみで全処理した場合: 約$25(約4倍のコスト)
- カスケードアーキテクチャ(軽量モデルでトリアージ→複雑な場合のみ上位モデル)でコストを1/4に削減できます
事例区分: 想定シナリオ
上記は複数の構築経験をもとに構成した典型的なコスト試算です。実際のコストはプロンプト設計・会話長・ハンドオフ頻度によって大きく変わります。本番導入前に必ずABテストで実測することを推奨します。
トレーシングでデバッグを劇的に楽にする
Agents SDKにはトレーシングがデフォルトで有効になっています。LLM呼び出し、ツール実行、ハンドオフ、ガードレール判定がすべて自動記録されます。
OpenAIのTracesダッシュボードでビジュアルに確認できますが、ローカル開発ではカスタムトレーサーを使うのが便利です。
import asyncio
from agents import Agent, Runner
from agents.tracing import trace
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
# 動作環境: Python 3.10+, openai-agents>=0.1.0
agent = Agent(
name="DebugAgent",
instructions="ユーザーの質問に丁寧に回答してください。",
model="gpt-4.1-mini",
)
async def main():
# trace()コンテキストマネージャでワークフロー全体をグループ化
with trace("customer_support_session"):
result = await Runner.run(agent, "返金ポリシーを教えてください")
print(result.final_output)
# トレースはOpenAIダッシュボードで確認可能
# https://platform.openai.com/traces
asyncio.run(main())
ポイント:
with trace("セッション名")で複数のRunner.run()呼び出しを1つのトレースグループにまとめられます- 開発時にトレースを無効化したい場合:
Runner.run(agent, input, trace=False) - カスタムイベントの記録:
trace.custom("event_name", data={"key": "value"})
【要注意】よくある失敗パターンと回避策
失敗1:全エージェントにgpt-4.1を使う
❌ トリアージ・ガードレール判定にも gpt-4.1($2.00/Mトークン)を使う
⭕ トリアージ・ガードレールには gpt-4.1-nano($0.10/Mトークン)を使う
なぜ重要か: トリアージは「どの専門エージェントに振るか」を決めるだけの単純な分類タスクです。高コストモデルの必要性はほぼありません。実際に構築した3エージェント構成で、この変更だけで月額コストが約60%削減できました。
失敗2:ハンドオフ時のトークン増加を無視する
❌ シングルエージェントと同じ予算でマルチエージェントを見積もる
⭕ ハンドオフが発生するたびに会話履歴が引き継がれる = 入力トークンが増加することを前提に設計する
なぜ重要か: ハンドオフ1回で入力トークンが平均1.5〜2倍になります。3ホップのワークフローでは最初のリクエストの3倍のトークンを消費することもあります。input_filterで不要な履歴を削除する設計を最初から組み込むことが重要です。
失敗3:ガードレールを並列実行のまま本番に出す
❌ デフォルトの並列実行でガードレールを設定し、有害入力でもトークンが消費される
⭕ 重要なガードレールは直列実行(blocking=True)に切り替える
なぜ重要か: 並列実行ではガードレールがトリップする前にメインエージェントがトークンを消費します。コスト面だけでなく、ツールの副作用(メール送信、DB更新等)が発生してしまうリスクがあります。
失敗4:命令文でハンドオフ条件を曖昧に書く
❌ 「適切なエージェントに引き渡してください」
⭕ 「注文番号が含まれる場合はOrderAgent、返金・キャンセルのキーワードがある場合はRefundAgentに引き渡してください」
なぜ重要か: ハンドオフの判断基準を具体的に書かないと、LLMが「どのエージェントに振るべきか」を毎回迷い、誤ったハンドオフや不要なループが発生します。
他フレームワークとの比較
OpenAI APIを使うプロジェクトでのフレームワーク選定指針をまとめます。
| 観点 | OpenAI Agents SDK | Pydantic AI | AWS Strands |
|---|---|---|---|
| 学習コスト | 低(OpenAI APIの延長) | 中(Pydantic知識が必要) | 中(AWS知識が必要) |
| マルチLLM対応 | ○(100+モデル対応) | ○ | ○(Bedrock経由) |
| トレーシング | 標準装備(OpenAI Dashboard) | Logfire連携 | CloudWatch連携 |
| 型安全性 | △(output_typeで対応) | ◎(Pydanticネイティブ) | ○ |
| クラウド統合 | OpenAI寄り | プロバイダー非依存 | AWS寄り |
| 向いているチーム | OpenAI APIユーザー | 型安全重視の開発チーム | AWS環境のチーム |
最終確認日: 2026-04-28
トラブルシューティング:よくあるエラーと対処法
検証中に遭遇したエラーと対処法を共有します。
エラー1: AgentRunError: Maximum turns exceeded
# デフォルトの最大ターン数(10)を超えた場合に発生
# 対処: max_turnsを明示的に設定する
result = await Runner.run(agent, input, max_turns=20)
エラー2: InputGuardrailTripwireTriggeredが想定外に発生する
# ガードレールの判定が厳しすぎる場合
# 対処1: ガードレールエージェントのinstructionsを緩和する
# 対処2: 例外をキャッチして適切なフォールバックを返す
try:
result = await Runner.run(agent_with_guardrail, user_input)
except InputGuardrailTripwireTriggered:
# フォールバック: ガードレールに引っかかった旨をユーザーに通知
return "申し訳ありませんが、その質問にはお答えできません。"
エラー3: ハンドオフが無限ループする
# AgentA → AgentB → AgentA → ... のループ
# 対処: 各エージェントのinstructionsに「すでにハンドオフされた場合は直接回答する」を追加
# または max_turns で上限を設けてループを防ぐ
agent_a = Agent(
name="AgentA",
instructions="""
...
重要: すでに別のエージェントからハンドオフされた場合は、
さらに他のエージェントに引き渡さず、直接回答してください。
""",
handoffs=[agent_b],
)
FAQ
Q: OpenAI Agents SDKはGPT以外のモデルでも使えますか?
A: はい。公式ドキュメントによれば100+モデルに対応しています。modelパラメータにOpenAI互換のエンドポイントを指定することで、Claude、Gemini、ローカルモデルとも組み合わせられます。ただし、ハンドオフやツール呼び出しの安定性はOpenAIモデルが最も高い実績があります。
Q: LangGraphやLlamaIndexとどう使い分ければいいですか?
A: OpenAI APIをメインで使っていて、シンプルな構成(3〜5エージェント程度)から始めたい場合はAgents SDK一択です。複雑な状態管理が必要(条件分岐が多い、ループが複雑)な場合はLangGraph、データインジェストとの統合が必要な場合はLlamaIndex Workflowsが向いています。
Q: 料金はどこで確認できますか?
A: Agents SDK自体は無料のOSSです。料金はAgents SDKが呼び出すOpenAI APIの従量課金のみです。最新料金は OpenAI公式の料金ページで確認してください。
参考・出典
- OpenAI Agents SDK — 公式ドキュメント — OpenAI(参照日: 2026-04-28)
- openai/openai-agents-python — GitHub — OpenAI(参照日: 2026-04-28)
- The next evolution of the Agents SDK — OpenAI公式ブログ(参照日: 2026-04-28)
- OpenAI API Pricing 2026 — AI Pricing Guru(参照日: 2026-04-28)
- Guardrails — OpenAI Agents SDK — OpenAI(参照日: 2026-04-28)
まとめ:今日から始める3つのアクション
- 今日やること:
pip install openai-agentsでインストールし、この記事の「最小構成」コードを動かしてみる。5分あれば完了します。 - 今週中: ハンドオフを使った2〜3エージェント構成を試す。カスタマーサポートのサンプルをベースに、自分のユースケースに合わせてカスタマイズしてみてください。
- 今月中: コスト試算スクリプトを使って月額コストを見積もり、トリアージエージェントのモデルをgpt-4.1-nanoに最適化する。
あわせて読みたい:
- 【2026年最新】Pydantic AI完全ガイド|型安全エージェント — 型安全なエージェント構築に特化したフレームワークとの比較
- 【2026年最新】AWS Strands Agents完全ガイド|SDK — AWS環境でのAIエージェント構築
この記事を読んで導入イメージが固まってきた方へ
UravationではAIエージェント導入の研修・コンサルを行っています。
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー10万人超。
100社以上の企業向けAI研修・導入支援。著書累計3万部突破。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。