結論: OpenAI Agents SDKは2025年3月リリースのプロダクション向けエージェントフレームワークで、マルチエージェント・ハンドオフ・ガードレール・組み込みトレーシングが揃い、Assistants APIの後継として企業の自律AIシステム構築に使える基盤になっています。
この記事の要点:
- 要点1: Responses APIはChat Completions比でキャッシュ効率が40〜80%改善し、新規プロジェクトはAssistants APIではなくResponses API + Agents SDKで構築すべき(OpenAI公式推奨)
- 要点2: ハンドオフ機能でトリアージエージェント→専門エージェントへの自律的な処理委任が実装できる
- 要点3: OpenAIはAssistants APIを2026年中に廃止予定(サンセット日は2026年中ごろの見込み)
対象読者: PythonでAIシステムを構築しているエンジニア・技術部門責任者・DX推進担当者
読了後にできること: pip install openai-agentsから始めて、最初のシングルエージェントをResponses API上で動かせる
「Assistants APIで作ったアプリが、将来使えなくなるって本当ですか?」
先日、ある受託開発系の企業(エンジニア15名規模)の技術顧問として入っているときに受けた質問です。ChatGPTのAssistants APIでカスタマーサポートボットを構築していたのですが、OpenAIの公式ドキュメントに「Responses APIへの移行を推奨、Assistants APIは廃止予定」という記述を見つけて焦っていました。
これは無理もない混乱です。2025年3月のOpenAI発表は「新API2本、新SDK1本、新ツール5個」という大量の情報だったので、多くの開発者がキャッチアップできていない状況があります。
正直に言うと、Agents SDKとResponses APIの組み合わせは、Assistants APIより明確に使いやすく、プロダクション品質に到達しやすいと感じています。この記事では、移行の全手順からマルチエージェント実装まで、コピペ可能なPythonコードとともに解説します。
AIエージェントの基本概念については、AIエージェント導入完全ガイドで体系的にまとめています。こちらも合わせてご覧ください。
まず5分で動かす:最初のエージェント起動
先に動かしてみましょう。Pythonが入っていれば以下だけで始められます。
インストール
pip install openai-agents
# OpenAI APIキーの設定
export OPENAI_API_KEY='your-api-key'
最初のエージェント(Hello World相当)
from agents import Agent, Runner
# エージェントの定義
agent = Agent(
name="サポートアシスタント",
instructions="""
あなたは株式会社XYZのカスタマーサポートAIです。
質問に対して、丁寧で簡潔な日本語で回答してください。
不足している情報があれば、最初に質問してから作業を開始してください。
"""
)
# 実行
result = Runner.run_sync(agent, "返品手続きの方法を教えてください")
print(result.final_output)
これだけです。たった10行で、instructions(システムプロンプト)を持つエージェントが動きます。研修で初めてこれを見たバックエンドエンジニアが「え、Assistants APIの設定の複雑さは何だったんですか?」と言っていました。それくらい簡潔です。
Assistants APIとの違い:なぜ移行すべきか
「今のAssistants APIで動いているのに、なぜ移行するの?」という疑問への答えを整理します。
| 項目 | Assistants API(旧) | Responses API + Agents SDK(新) |
|---|---|---|
| 将来性 | 2026年中に廃止予定 | OpenAI公式推奨(全新規プロジェクトに) |
| コスト | — | キャッシュ効率40〜80%改善(内部テスト値) |
| マルチエージェント | 実装が複雑 | ハンドオフ機能でネイティブサポート |
| セーフガード | 自前で実装 | ガードレールがSDKに組み込まれている |
| デバッグ | ログが散在 | Traces Dashboardで一元可視化 |
| 状態管理 | Thread/Run管理が必要 | SDKが自動でループ処理 |
| 組み込みツール | File Search, Code Interpreter | Web Search, File Search, Code Interpreter, Computer Use, MCP連携 |
最大の理由は「廃止」ですが、実際にResponses APIを触ってみると、設計思想がより洗練されているのを感じます。特にトレーシングとガードレールがプロダクション品質のシステムを作るのに本質的に必要な機能で、Assistants APIでは自前実装が必要だったものが組み込まれています。
Responses APIの基本:Chat Completionsからの移行
Chat Completions(旧)との対比
# 旧: Chat Completions API
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "あなたは優秀なアシスタントです"},
{"role": "user", "content": "Pythonのリスト内包表記を説明してください"}
]
)
print(response.choices[0].message.content)
# 新: Responses API(組み込みツールを使う場合)
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-4o",
instructions="あなたは優秀なアシスタントです",
input="Pythonのリスト内包表記を説明してください",
# 組み込みツールも簡単に追加できる
tools=[{"type": "web_search_preview"}]
)
print(response.output_text)
最大の変化は、`instructions`(システムプロンプト)と`input`(ユーザー入力)が明確に分離されたことです。また、`tools`に組み込みツールを配列で追加するだけでウェブ検索・ファイル検索などが使えます。
ストリーミングへの対応
# Responses APIでのストリーミング
from openai import OpenAI
client = OpenAI()
with client.responses.stream(
model="gpt-4o",
instructions="あなたは優秀なアシスタントです",
input="AIエージェントの設計原則を説明してください"
) as stream:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
print() # 改行
Agents SDKの4つのコアコンセプト
1. エージェント(Agent):AIの役割定義
from agents import Agent
# 特定の専門知識を持つエージェントを定義
billing_agent = Agent(
name="請求サポート",
instructions="""
あなたは請求・支払いに関する専門サポートです。
- 請求書の確認・再発行
- 支払い方法の変更
- 返金対応
について対応します。それ以外の質問は、適切な担当者に引き継いでください。
仮定した点は必ず"仮定"と明記してください。
"""
)
technical_agent = Agent(
name="テクニカルサポート",
instructions="""
あなたは技術的な問題の専門サポートです。
- ログイン・認証の問題
- 機能の使い方
- バグ・エラーの対応
について対応します。
"""
)
2. ハンドオフ(Handoffs):エージェント間の処理委任
これが研修先で一番「おお」となる機能です。「AIが自分で判断して別のAIに渡す」という動作が、コード数行で実装できます。
from agents import Agent, handoff
# トリアージエージェント(最初の窓口)
triage_agent = Agent(
name="トリアージ",
instructions="""
ユーザーの問い合わせ内容を分析して、適切な担当エージェントに引き継いでください。
- 請求・支払いに関する質問 → billing_agentに引き継ぐ
- 技術的な問題 → technical_agentに引き継ぐ
- どちらでもない場合は自分で対応する
""",
handoffs=[
handoff(billing_agent,
description="請求・支払いに関する問い合わせを担当"),
handoff(technical_agent,
description="技術的な問題・バグ報告を担当")
]
)
# 実行(トリアージエージェントが自動で振り分ける)
from agents import Runner
result = Runner.run_sync(triage_agent, "先月の請求書が届いていないのですが")
print(result.final_output)
# → billing_agentに自動でハンドオフされて処理される
顧問先のSaaS企業でこれを実装したとき、カスタマーサポートの「振り分けミス」が大幅に減りました。人間が分類していたときは誤振り分け率が約15%あったのですが(測定期間: 2025年10月〜12月、対象: 月間問い合わせ2,000件)、トリアージエージェント導入後はほぼゼロになりました。
3. ガードレール(Guardrails):入出力の安全チェック
from agents import Agent, input_guardrail, GuardrailFunctionOutput, RunContextWrapper
from pydantic import BaseModel
# ガードレールの定義
class ContentCheck(BaseModel):
is_safe: bool
reason: str
@input_guardrail
async def check_input_safety(
ctx: RunContextWrapper,
agent: Agent,
input: str
) -> GuardrailFunctionOutput:
"""有害なコンテンツ・個人情報の入力チェック"""
# 簡易チェック(実際はより高度な判定ロジックを実装)
prohibited_patterns = ["マイナンバー", "クレジットカード番号", "パスワード"]
for pattern in prohibited_patterns:
if pattern in input:
return GuardrailFunctionOutput(
output_info=ContentCheck(
is_safe=False,
reason=f"機密情報({pattern})が含まれています"
),
tripwire_triggered=True # エージェントの実行を停止
)
return GuardrailFunctionOutput(
output_info=ContentCheck(is_safe=True, reason="問題なし"),
tripwire_triggered=False
)
# ガードレール付きエージェント
safe_agent = Agent(
name="安全対応エージェント",
instructions="ユーザーの質問に丁寧に回答してください",
input_guardrails=[check_input_safety]
)
ガードレールはプロダクション環境では必須です。企業システムで「AIが社内機密を外に出してしまった」という事故を防ぐための第一防衛線になります。
4. トレーシング(Tracing):デバッグと監視の一元化
# トレーシングはデフォルトで有効
# 追加設定なしでOpenAI Traces Dashboardに記録される
from agents import Runner, trace
# カスタムトレースの追加
async def process_with_trace():
with trace("カスタマーサポートフロー"):
result = await Runner.run(
triage_agent,
"ログインできないのですが、どうすればいいですか?"
)
return result
# ダッシュボードURL: https://platform.openai.com/traces
# ここで以下が確認できる:
# - どのエージェントが呼ばれたか
# - どのツールを使ったか
# - どのガードレールがトリガーされたか
# - 各ステップの実行時間とコスト
トレーシングは「AIが何をしたか」の監査ログとしても機能します。セキュリティ審査を要する企業では、このログが「AIシステムの動作説明」として使えます。実際に顧問先の金融関連企業でこれを提示したところ、内部監査チームから「これなら導入の説明ができる」という言葉をいただきました。
実践:カスタマーサポートボットの完全実装
研修でよく使う「ゼロから本番まで」の実装例です。以下のコードをそのまま使えます。
from agents import Agent, Runner, handoff, tool, input_guardrail, GuardrailFunctionOutput, RunContextWrapper
from pydantic import BaseModel
import json
# --- ツールの定義 ---
@tool
def get_order_status(order_id: str) -> str:
"""注文IDから配送状況を取得する"""
# 実際はデータベースやAPIを呼ぶ
mock_data = {
"ORD-001": "配送中(明日到着予定)",
"ORD-002": "出荷準備中",
"ORD-003": "配送完了(2026-03-20)"
}
return mock_data.get(order_id, f"注文ID {order_id} が見つかりません")
@tool
def create_refund_request(order_id: str, reason: str) -> str:
"""返金申請を作成する"""
# 実際はAPIを呼ぶ
return f"返金申請を受け付けました(申請番号: REF-{order_id[-3:]})。3〜5営業日以内に処理します。"
# --- ガードレール ---
class SafetyCheck(BaseModel):
is_appropriate: bool
issue: str
@input_guardrail
async def safety_guardrail(ctx: RunContextWrapper, agent: Agent, input: str) -> GuardrailFunctionOutput:
prohibited = ["個人情報", "マイナンバー", "パスワード教えて"]
for p in prohibited:
if p in input:
return GuardrailFunctionOutput(
output_info=SafetyCheck(is_appropriate=False, issue=f"{p}は受け付けられません"),
tripwire_triggered=True
)
return GuardrailFunctionOutput(
output_info=SafetyCheck(is_appropriate=True, issue=""),
tripwire_triggered=False
)
# --- エージェント定義 ---
billing_agent = Agent(
name="請求・返金サポート",
instructions="""
請求・支払い・返金に関する問い合わせを担当します。
- 注文番号(ORD-XXX形式)が必要な場合は聞いてください
- 返金は注文から30日以内が対象です
不足している情報があれば、最初に質問してから作業を開始してください。
""",
tools=[create_refund_request]
)
shipping_agent = Agent(
name="配送サポート",
instructions="""
配送状況・到着日・再配達に関する問い合わせを担当します。
注文番号(ORD-XXX形式)を確認して配送状況をお伝えします。
""",
tools=[get_order_status]
)
triage_agent = Agent(
name="カスタマーサポート(総合窓口)",
instructions="""
お客様からのお問い合わせを適切な担当者に振り分けます。
- 請求・返金 → billing_agentに引き継ぐ
- 配送状況 → shipping_agentに引き継ぐ
- その他は自分で丁寧に対応する
常に丁寧な日本語を使ってください。
仮定した点は必ず"仮定"と明記してください。
""",
handoffs=[
handoff(billing_agent, description="請求・返金の問い合わせ"),
handoff(shipping_agent, description="配送・到着日の問い合わせ")
],
input_guardrails=[safety_guardrail]
)
# --- 実行 ---
if __name__ == "__main__":
questions = [
"注文ORD-001の配送状況を確認したいのですが",
"先月購入した商品を返品したいのですが",
"配送会社を変更することはできますか?"
]
for q in questions:
print(f"n[質問] {q}")
result = Runner.run_sync(triage_agent, q)
print(f"[回答] {result.final_output}")
Assistants APIからの移行ガイド
すでにAssistants APIで動いているシステムがある場合の移行手順です。
| Assistants API(旧) | Responses API + Agents SDK(新) |
|---|---|
| Assistant作成 (client.beta.assistants.create) | Agent定義 (Agent(name=…, instructions=…)) |
| Thread作成 (client.beta.threads.create) | 不要(SDKが自動管理) |
| Message追加 (client.beta.threads.messages.create) | Runner.run(agent, input_message) |
| Run作成・ポーリング (client.beta.threads.runs.create_and_poll) | 不要(SDKが自動でループ) |
| Tool outputs提出 | @tool デコレータで自動処理 |
| File Search / Code Interpreter | tools=[“file_search”] / tools=[“code_interpreter”] で追加 |
移行の基本パターン
# 旧: Assistants API
from openai import OpenAI
client = OpenAI()
assistant = client.beta.assistants.create(
name="サポートBot",
instructions="丁寧に回答してください",
model="gpt-4o",
tools=[{"type": "file_search"}]
)
thread = client.beta.threads.create()
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="返品の手続きを教えてください"
)
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id
)
messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)
# 新: Agents SDK(同等の機能を1/3のコードで実現)
from agents import Agent, Runner
agent = Agent(
name="サポートBot",
instructions="丁寧に回答してください",
tools=["file_search"]
)
result = Runner.run_sync(agent, "返品の手続きを教えてください")
print(result.final_output)
コード量が1/3になるだけでなく、`Thread`/`Run`の状態管理という「本来やりたいことと無関係なコード」が消えます。
組み込みツールの使い方
ウェブ検索ツール
from agents import Agent, Runner, WebSearchTool
research_agent = Agent(
name="リサーチエージェント",
instructions="""
最新の情報をウェブで検索して、正確な情報を提供してください。
情報源のURLも必ず明記してください。
数字と固有名詞は、根拠(出典/計算式)を添えてください。
""",
tools=[WebSearchTool()]
)
result = Runner.run_sync(
research_agent,
"2026年3月のOpenAI最新アップデートについて教えてください"
)
print(result.final_output)
ファイル検索ツール(社内ドキュメントRAG)
from openai import OpenAI
from agents import Agent, Runner, FileSearchTool
client = OpenAI()
# Vector Storeの作成(社内文書をアップロード)
vector_store = client.vector_stores.create(name="社内規程集")
client.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id,
files=[
open("就業規則.pdf", "rb"),
open("セキュリティポリシー.pdf", "rb"),
]
)
# 社内文書を参照できるエージェント
hr_agent = Agent(
name="人事サポートAI",
instructions="""
社内規程集を参照して、正確な情報を提供してください。
規程に記載のない事項については「規程に記載がないため確認が必要です」と答えてください。
仮定した点は必ず"仮定"と明記してください。
""",
tools=[FileSearchTool(
max_num_results=5,
vector_store_ids=[vector_store.id]
)]
)
【要注意】よくある失敗パターンと回避策
失敗1:ガードレールを後付けしようとする
❌ 「まず動くものを作って、あとでセキュリティを追加しよう」
⭕ エージェントの定義時点でガードレールを組み込む
なぜ重要か: ガードレールなしのエージェントをプロダクション環境に置くのは、セキュリティホールを空けたまま公開するのと同じです。入力ガードレール(プロンプトインジェクション防止)と出力ガードレール(機密情報漏洩防止)の両方を最初から設計してください。
失敗2:ハンドオフを多段階にしすぎる
❌ 「トリアージ → 一次サポート → 二次サポート → 専門家」と4段階のハンドオフを設計
⭕ 「トリアージ → 専門エージェント(2〜3種)」の2段階を基本とする
なぜ重要か: ハンドオフは1回ごとにレイテンシーとコストが発生します。また、深い階層はデバッグが困難になります。私が顧問先で見た失敗例では、5段階のハンドオフで処理時間が1回あたり20〜30秒になり、ユーザー体験が大幅に悪化しました。
失敗3:トレーシングを無効化する
❌ コスト削減のためにトレーシングをオフにする(OPENAI_AGENTS_DISABLE_TRACING=1)
⭕ 開発・ステージング・本番すべてでトレーシングを有効にする
なぜ重要か: AIシステムの不具合は「なぜそのような出力をしたか」が追跡できないと再現・修正できません。トレーシングは障害対応コストを大幅に下げる保険です。月間コストが数百円増える程度なので有効にし続けることを推奨します。
失敗4:Assistants APIとResponses APIの混用
❌ 新機能はAgents SDKで作りつつ、既存のAssistants APIコードをそのまま残す
⭕ 計画的にResponses APIへの一括移行を実施する
なぜ重要か: Assistants APIの廃止日が近づくにつれて、混用状態での移行は技術的負債になります。移行コストは早い方が低い。6ヶ月前に移行した案件と廃止直前に移行した案件では、工数が3〜4倍違うというのが業界の経験則です。
コスト最適化:Responses APIのキャッシュ活用
from openai import OpenAI
client = OpenAI()
# Prompt Cachingが自動で適用される(同一instructions × 異なるinputの場合)
# キャッシュヒット時はinputトークンが50%割引
# キャッシュ効率を最大化するコツ:
# 1. instructionsを固定し、inputだけ変える
# 2. instructionsは長くても構わない(キャッシュされるから)
# 3. 頻繁に変わる情報はinputに入れる(日付・ユーザー固有情報など)
STATIC_INSTRUCTIONS = """
あなたは株式会社XYZのカスタマーサポートAIです。(← これは毎回キャッシュされる)
...(長い説明)...
"""
responses = [
client.responses.create(
model="gpt-4o",
instructions=STATIC_INSTRUCTIONS, # キャッシュヒット
input=user_question # 毎回異なる
)
for user_question in questions_batch
]
OpenAIの内部テストでは、Chat Completions比でキャッシュ効率が40〜80%改善したと報告されています(出典: OpenAI公式ドキュメント「Migrate to the Responses API」、参照日: 2026-03-27)。月間APIコストが高い場合は効果が大きいです。
参考・出典
- New tools for building agents — OpenAI(参照日: 2026-03-27)
- OpenAI Agents SDK 公式ドキュメント — OpenAI GitHub(参照日: 2026-03-27)
- Migrate to the Responses API — OpenAI Developers(参照日: 2026-03-27)
- Guardrails – OpenAI Agents SDK — OpenAI GitHub(参照日: 2026-03-27)
- Handoffs – OpenAI Agents SDK — OpenAI GitHub(参照日: 2026-03-27)
まとめ:今日から始める3つのアクション
- 今日やること:
pip install openai-agentsでインストールし、記事内の「最初のエージェント」コードをそのまま動かしてみる(所要時間10分) - 今週中: 既存のAssistants API実装があれば移行計画を立てる。まずは最もシンプルなエージェント1つをAgents SDKで書き直して動作比較する
- 今月中: ガードレールとトレーシングを組み込んだ本番向けエージェントを1本完成させる。Traces Dashboardでの監視フローを確立する
次回予告: 次の記事では「OpenAI Agents SDK × MCPサーバー連携実践ガイド」として、社内システム(Slack・Google Workspace・Notion)をエージェントから操作する方法をお届けします。
あわせて読みたい:
- AIエージェント導入完全ガイド — エージェント型AIの基本概念から企業導入設計まで
- ChatGPTビジネス活用完全ガイド — OpenAI製品の業務活用全体像
- Claude Code Agent Teams完全ガイド
- Claude Code Hooksガイド
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー約10万人)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。


