OpenAI Agents SDK vs. Google ADK (後編)

OpenAI Agent SDK vs. Google ADK(後編)
OpenAI Agent SDK vs. Google ADK(後編)
佐野 麟

この記事を書いた人

佐野 麟

(Rin Sano)

理工学専攻の大学院生です。自然言語処理・生成AIを活用した教育でのレポート評価について研究しています。

今回は2部構成で発信している「OpenAI Agents SDK vs. Google ADK」の後編です。
前編では、AIエージェントの開発環境である OpenAI Agents SDK と Google ADK の概要と、これらを用いた単一エージェントの実装例を比較しました。

後編となる本記事では、コード例を交えながら応用機能について紹介し、開発環境の違いが実装にどう影響するかを具体的に解説します。


① OpenAI Agents SDK と Google ADK の応用機能と設計の違い

両 SDK は、マルチエージェント構成、ツール拡張、動作制御といった高度な機能を備えています。ただし、それらをどのような仕組みで実現するかという設計思想の違いがあります。
ここでは実装時の挙動の違いが分かるよう、3つの観点で整理します。

1. マルチエージェント連携の設計

複雑な処理では、複数のエージェントが役割分担して動作する構成が必要になります。 両 SDK で実現可能ですが、「誰が次を呼ぶか」の決め方が異なります。

OpenAI Agents SDKGoogle ADK
分担方式handoffs による転送 [1]sub_agents による階層登録 [2]
呼び出し方LLM が実行時に判断定義された構成を参照して選択
向く構成柔軟な役割切替役割が明確な業務フロー

OpenAI Agents SDK の「handoffs」はどのエージェントに任せるかをモデルの判断に委ね、Google ADKの「sub_agents」は親子関係を事前に定義し、その範囲内で呼び出します。
つまり、「適切な担当が処理を行う」という目的は共通していますが、

  • OpenAI Agents SDK :モデルによる柔軟で動的な遷移を想定
  • Google ADK :階層構造による明示的な管理を想定

という違いがあります。

2. 応答・動作の制御

エージェントの応答品質や安全性を担保する仕組みにも差があります。両者とも制御機構を持ちますが、「検知して止める」か「検知して通知する」かで役割が分かれます。

OpenAI Agents SDKGoogle ADK
機能名Guardrails [3]Callbacks [4]
目的入出力の監視、自動停止入出力の監視、介入ポイントの提供
違反時SDKが例外送出して実行を停止開発者が停止処理を追加
用途例NG条件の検知 / 出力規制ログ監視 / エラー処理

どちらも信頼性向上に関わる仕組みですが、役割は異なります。
OpenAI Agents SDK の Guardrail は、入出力を検査し、条件違反時には例外を送出して実行を中断するための安全機構であり、検知と停止処理を組み合わせた仕組みが提供されています。 一方で、Google ADK の Callback は、処理の各段階でフック(処理途中で割り込むポイント)を受け取り、ログ取得・修正・例外送出などを開発者が明示的に記述します。
なお、OpenAI Agents SDK にも実行トレースやイベント取得などの監視機能が用意されており、これらを利用して Callback 的な介入ロジック(条件判定や例外送出による停止など)をアプリケーション側で実装することも可能です。

3. 拡張機能

AIエージェントでは tool(拡張機能) を利用することで、単なるテキスト生成を超えた処理が可能になります。外部 API 呼び出し、Web 検索、コード実行、ファイル参照などをエージェントから直接実行できるため、実用システム構築では必須の要素です。

機能カテゴリOpenAI Agents SDKGoogle ADK実装・設計上の違い
Web検索WebSearchTool [5]を標準提供URL Context Tool / Web 情報取得系ツール[6] を利用可能両者とも少ない設定で利用できる
カスタム関数・外部APIfunction_tool / custom tool [5]として関数を直接登録FunctionTool.from_function [7]で登録両者とも柔軟
Python関数のツール化が容易
コード・スクリプト実行Code Interpreter / Shell 系ツールあり [5]code execution [8]どちらもサンドボックス前提
実行権限設計が重要
ドキュメント・ファイル検索File Search などの専用ツールあり [5]専用ツールは提供されているが、外部連携での実装も必要Google側は Vertex AI や既存のAPI機能と組み合わせた実装例が多い
使用できる tool の例

両開発環境でも使用できる機能そのものは共通しており、小規模なエージェントを試しに設計するならその差はほぼ気にならないと思われますが、実装方法と制御の考え方には明確な差があります。
OpenAI Agents SDK ではあらかじめ実装・運用している豊富な外部機能をエージェントからそのまま呼び出し、モデルがツール選択を行う設計になっており、プロトタイピングや単体アプリ構築での実装に向いています。一方で、 Google ADK は単体利用も可能ですが、Vertex AI や Google Cloud との統合を想定した設計例が多く提供されています。


② エージェントの実装例

※本実装例は2026年1月時点の仕様に基づきます
ここからは、各応用機能を組み合わせた小規模な実装例を通して、実際にどのようなエージェント構成ができるのかを見ていきます。
個別の機能をばらばらに試すのではなく、

  • マルチエージェント連携
  • Tool 呼び出し
  • 入力検査と停止制御

をまとめて含んだ最小構成のサンプルとして紹介します。 例として、ユーザーの依頼内容に応じて処理担当エージェントを切り替えつつ、個人情報が含まれる入力は自動的に停止する構成を実装します。

構成は次の3層です。

Root エージェント

  • 依頼内容を見て担当を振り分ける
  • 登録されたエージェントの中から委譲先を選択
  • 入力検査を適用

検索エージェント(Searcher)

  • Web検索機能を使用
  • 最新ニュースなど外部情報を検索して要約

計算エージェント(ComputeAgent)

  • モデルによる推論計算は禁止し、カスタム関数 tool を必ず使用させるように条件付け

さらに、入力テキストに個人名などの個人情報が含まれていないかを別エージェントで判定し、該当する場合は処理を中断します。
なお、SDK および API 仕様は更新が速く、クラス名・呼び出し方法・利用条件が変更される可能性があります。利用時は公式ドキュメントを必ず確認してください。

1. OpenAI Agent SDK 版のコード例

Tool の定義(カスタム関数)

まず、エージェント専用の処理を tool として登録します。OpenAI Agent SDK では Python 関数をそのまま tool 化できます。

@function_tool
def compute_agent_process(x: int) -> str:
   return f"ComputeAgent結果: {x * 2 + 50}"

このように、業務ロジックをそのまま tool にできるため、小さな処理単位をエージェントに安全に委譲できます。

専門エージェントの定義

検索担当と計算担当のサブエージェントを分離します。

search_agent = Agent(
   name="Searcher",
   instructions="最新情報はWebSearchToolで検索して要約する。",
   tools=[WebSearchTool()]
)

compute_agent = Agent(
   name="ComputeAgent",
   instructions="必ずツールで処理すること。",
   tools=[compute_agent_process]
)

ここでは以下の点がポイントです。

  • 既存のWebSearchTool をそのまま登録して利用できる
  • カスタム関数 tool も同じ形式で扱える
  • instructions によって「ツール使用を強く誘導」できる(実行されるかはモデルの判断)

Guardrail による入力検査

OpenAI Agent SDK では Guardrail を使うことで、エージェントの入出力を自動検査できます。ここでは、入力に個人情報(例:個人名)が含まれるかを判定する専用エージェントを使い、その結果に応じて処理を停止させます。

class PIIOutput(BaseModel):
   contains_pii: bool
   reasoning: str

# Guardrail判定専用エージェント
guardrail_agent = Agent(
   name="PII detector",
   instructions="""
   入力文に個人名や個人情報が含まれているか判定してください。
   含まれる場合 contains_pii=true にしてください。
   """,
   output_type=PIIOutput,
)

@input_guardrail
async def pii_guardrail(
   ctx: RunContextWrapper[None],
   agent: Agent,
   input: str | list[TResponseInputItem],
) -> GuardrailFunctionOutput:

   result = await Runner.run(
       guardrail_agent,
       input,
       context=ctx.context
   )

   return GuardrailFunctionOutput(
       output_info=result.final_output,
       tripwire_triggered=result.final_output.contains_pii,
   )

親(root)エージェントの定義

root エージェントを登録します。

root_agent = Agent(
   name="Root",
   instructions="""
   ニュース → Searcher
   数値処理 → ComputeAgent
   """,
   handoffs=[search_agent, compute_agent],
   input_guardrails=[pii_guardrail],
)

これにより、 Guardrail で違反が検知されると例外を送出し、以降の処理は実行されずに 例外として中断される設計になっています。

実行時の挙動

この構成では、入力によって挙動が変わります。

  • ニュース要約依頼 → Searcher に handoff → Web検索実行
  • 数値処理依頼 → ComputeAgent に handoff → tool 実行
  • 個人名を含む依頼 → Guardrail が検知、実行停止

停止時は例外として検知できます。

async def main():

  # 数値処理依頼 → 20050を出力
 query = """
   10000の処理結果のみ返せ。
   """

 result = await Runner.run(root_agent, query)
 print(result.final_output) 

 # 個人名を含む依頼 → Guardrailで実行停止
 try:
     result = await Runner.run(
         root_agent,
         "山田太郎の発言を要約して"
     )
     print(result.final_output)

 except InputGuardrailTripwireTriggered:
     print("個人情報検知のため停止")

  # ニュース要約依頼 → Web検索実行
  query = """
   2026年1月の北海道の大雪に関するニュースを1件調べて200文字程度でまとめて。
   """

 print("===")

 result = await Runner.run(root_agent, query)
 print(result.final_output)

 print("===")

asyncio.run(main())

2. Google ADK 版のコード例

OpenAI 側の実装例と同じ構成(役割分担+ツール+入力検査)を Google ADK で書くと、次のような対応になります。

主な変更のポイントOpenAI Agent SDKGoogle ADK
親子エージェントの定義handoffssub_agents
Tool定義function_toolFunctionTool
入力検査GuardrailCallback
Web検索ツールWebSearchToolgoogle_search

Tool の定義(カスタム関数)

from google.adk.tools import FunctionTool

def compute_agent_process(x: int) -> str:
   return f"ComputeAgent結果: {x * 2 + 50}"

compute_tool = FunctionTool.from_function(compute_agent_process)

OpenAI と同様に Python 関数をそのままツール化できます。

エージェントの定義(handoff → sub_agents)

from google.adk.agents import Agent
from google.adk.tools import google_search

MODEL = "gemini-2.0-flash"

compute_agent = Agent(
   name="ComputeAgent",
   model=MODEL,
   instruction="数値処理は必ずツールを使用して実行せよ。",
   tools=[compute_tool],
)

search_agent = Agent(
   name="Searcher",
   model=MODEL,
   instruction="検索ツールを使ってweb上の情報を調べて要約せよ。",
   tools=[google_search], 
)

違いのポイントは以下となります。

  • OpenAI:handoff をモデルが選択
  • Google:親が sub_agents を管理する構造

入力検査(Guardrail → Callback)

Google ADK では Guardrail のように停止までを自動化する仕組みとは設計が異なり、Callback で検知してアプリ側で明示的に停止処理を実装します。

from pydantic import BaseModel
from google.adk.callbacks import Callback
from google.adk.runners import Runner

class PIIOutput(BaseModel):
   contains_pii: bool
   reasoning: str

pii_agent = Agent(
   name="PII detector",
   model=MODEL,
   instruction="""
   入力文に個人名や個人情報が含まれるか判定せよ。
   JSONで contains_pii と reasoning を返せ。
   """,
   output_schema=PIIOutput,
)


class PIICallback(Callback):

   async def before_run(self, ctx):

       result = await Runner.run(
           pii_agent,
           ctx.input_text
       )

       if result.output.contains_pii:
           raise RuntimeError("個人情報検知のため停止")

親(root)エージェントの定義

root エージェントを登録します。

root_agent = Agent(
   name="Root",
   model=MODEL,
   instruction="""
   依頼内容に応じて担当エージェントを選択せよ。

   ニュース要約 → Searcher
   数値処理 → ComputeAgent
   """,
   sub_agents=[search_agent, compute_agent],
   callbacks=[PIICallback()],
)

これにより、違反が検知されると例外を発生させ、処理フローは自動的に中断されます。

実行時の挙動

Google ADK 版での挙動は以下となります。全体の処理フローは概ね同様になります。

  • ニュース要約依頼 → Searcher を選択 → google_search を実行
  • 数値処理依頼 → ComputeAgent を選択 → tool 実行
  • 個人名を含む依頼 → Callback が検知 → アプリ側で実行停止
import asyncio
from google.adk.sessions import InMemorySessionService
from google.adk.runners import Runner
from google.genai import types

session_service = InMemorySessionService()
session = await session_service.create_session(
   app_name="sample_app",
   user_id="user1",
   session_id="s1",
)

runner = Runner(
   agent=root_agent,
   app_name="sample_app",
   session_service=session_service,
)

async def call_agent(query: str):

   content = types.Content(
       role="user",
       parts=[types.Part(text=query)]
   )

   async for event in runner.run_async(
       user_id="user1",
       session_id="s1",
       new_message=content,
   ):
       if event.is_final_response():
           print(event.content.parts[0].text)

await call_agent("10000の処理結果を出せ")
await call_agent("山田太郎の発言を要約して")
await call_agent("2026年1月の北海道の大雪に関するニュースを1件調べて200文字程度でまとめて。")

本記事の Google ADK の実装例は、執筆時点で公開されていた API 仕様および利用条件にもとづいて動作を確認したものです。現在(2026年2月時点)は利用条件の変更により無料枠ではGemini の API が利用できない場合があり、エージェント実行時に行われるモデル呼び出し(runner.run_async の実行時点)で API 利用制限によるエラーが発生し、処理が停止します。そのため、本記事の Google ADK のコード例は、設計構造および実装パターン比較のための参考例として掲載しています。実行する場合は、最新の利用条件および課金設定をご確認ください。

③ 設計上の違いと使い分け

両 SDK を用いた小規模な実装を比較すると、提供されている基本機能(マルチエージェント構成、ツール連携、実行制御など)は概ね共通しています。一方で、それらをどのように組み合わせて使うかという設計思想と、実装時の体験には違いが見られます。

OpenAI Agents SDK は、ツール選択やエージェント間の遷移を LLM が実行時に判断する柔軟な設計です。複数の tool や handoff を登録しておくことで、モデルが状況に応じて処理経路を選択し、柔軟に振る舞いを試せるため、試作や検証フェーズで構成を素早く組み替えやすいです。一方で、挙動の理由や分岐過程はログやトレースを見て追跡する設計になります。

Google ADK は、sub_agents やツール構成をあらかじめ構造として定義し、その範囲内でモデルが選択する設計が基本です。Callback などを用いた制御も含めて初期の定義は丁寧に行う必要がありますが、その分、処理の責務が明確になります。

開発体験の観点では、周辺ドキュメントや想定ユースケースの違いも影響します。OpenAI Agents SDK は SDK 単体で動かす最小例やツール利用例がまとまって参照しやすく、ローカル環境での試作を始めやすい構成になっています。Google ADK は単体での利用も可能ですが、 Google Cloud や Vertex AI との連携が意識されていることも特徴です。
整理すると、次のように使い分けを考えることができます。

まず小さく試作し、振る舞いを見ながら調整したい場合
→ OpenAI Agents SDK が扱いやすいケースが多い

役割分担や処理構造を明示して設計したい場合
→ Google ADK が適するケースがある

クラウド基盤や周辺サービスとの統合を前提とする場合
→ Google ADK が自然に組み込みやすい構成になることが多い

どちらが優れているというよりも、どこまで事前に構造を固定するか/どこを実行時判断に任せるかが選択の軸になります。

④ まとめ

本記事(後編)では、OpenAI Agents SDK と Google ADK で使用できる機能と実装例について比較しました。
両 SDK とも、実用的な AI エージェントを構築するための主要な機能は備えており、基本的な構成であればどちらでも実装可能です。一方で、実際に試作コードを書いて動作を確認する過程では、設計の進め方や開発体験に違いがあることが分かりました。

本稿での検証の範囲では、OpenAI Agents SDK は SDK 単体で試せる機能がまとまっており、サンプルやドキュメントを参照しながら小規模構成を素早く試す用途で扱いやすい印象があり、プロトタイピングや検証目的の開発では導入しやすい選択肢の一つだと感じました。
一方、Google ADK はエージェント構造や Callbacks による制御ポイントをコード側で明示的に設計するスタイルで、処理フローを整理しながら組み立てる構成になっています。Google Cloud や Vertex AI との連携を前提とした利用例も多く、運用環境を含めて設計するケースでは適した選択肢になると考えられます。
どちらが優れているというよりも、

  • 小さく試しながら構成を固めたいか
  • 最初から構造を決めて組み上げたいか
  • 利用する開発基盤が決まっているか

といった条件によって、使いやすさは変わると考えられます。

※ SDK および API は更新が速いため、クラス名・機能・提供形態が変更される場合があります。利用時には公式ドキュメントを確認してください。


【参考文献】

  1. Handoffs(OpenAI Agents SDK)
  2. Multi-Agent Systems in ADK(Agent Development Kit (ADK))
  3. Guardrails(OpenAI Agents SDK)
  4. Callbacks: Observe, Customize, and Control Agent Behavior(Agent Development Kit (ADK))
  5. Tools(OpenAI Agents SDK)
  6. Google 検索によるグラウンディング(Gemini API)
  7. Function tools(Agent Development Kit (ADK))
  8. Gemini API Code Execution tool for ADK(Agent Development Kit (ADK))