レバレジーズ データAIブログ

インハウスデータ組織のあたまのなか

色々なAIエージェントのSDKを触ってみた

はじめに

こんにちは、データ戦略室データアナリストのブライソンです。2025年は、AIエージェントの年と言われるくらい、AIエージェントに注目が集まっています。AIエージェントとは、簡単に言うと、特定の目的やタスクを自律的に遂行するAIを搭載したプログラムです。このAIエージェントを簡単に構築することができるPythonのライブラリが続々と出ていますので、試しに使ってみました。今回触ってみるのは、Google、OpenAI、AWSの3社が出しているライブラリです。それぞれの名前は以下になります。

  • Google:Agent Development Kit(ADK
  • OpenAI:Agents SDK
  • AWS:Strands Agents

これら3つのSDKで簡単なMCPサーバーをツールとして接続したエージェントを作成し、使用感の違いを見ていこうと思います!

実装する内容

今回は、ローカルのファイルシステムを操作できるMCPサーバー(@modelcontextprotocol/server-filesystem)を使い、指定したローカルフォルダの中にあるファイルをAIエージェントが操作できるように実装しました。MCPとは、AIが外部のデータソースやツールに接続しやすくするためのプロトコルで、MCPに則ったインターフェースを提供しているサーバーをMCPサーバーと呼びます。

後述のプログラムで引数として渡している/path/to/dirには、操作対象のディレクトリのパスを渡すのですが、実際にプログラムを動かす際にはデスクトップへの絶対パスを指定して挙動を確認しました。

Agent Development Kit(ADK

実装

pip install google-adkでライブラリをインストールできます。GoogleADKは、Geminiモデルの利用がしやすいAIエージェント構築用のSDKで、ツール連携機能も内蔵しています。以下のように、簡単にMCPと繋いだエージェントを構築することができます。ADKには、開発者用にチャットUIが用意されており、adk webと実行すると、簡単にエージェントを試すことができます。デフォルトで指定されるモデルがないので、明示的に指定する必要があります。

下記のようなフォルダ構造でプログラムを作成します。

.
├── .env
└── file_operator
    ├── __init__.py
    └── agent.py
# .env
GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
GOOGLE_CLOUD_LOCATION=LOCATION
# __init__.py
from . import agent
# agent.py
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters

root_agent = LlmAgent(
    model="gemini-2.0-flash",
    name="FileOperator",
    instruction='あなたは、指定されたフォルダでファイルの作成、読み取り、更新、などの操作を行うことができます。指示に従って、ファイルの操作を行ってください。',
    tools=[
        MCPToolset(
            connection_params=StdioServerParameters(
                command="npx",
                args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
            )
        )
    ],
)

実行結果

とりあえずファイルを作成しようとして失敗したため、作成可能なフォルダを改めて取得してから、tmp.txtを作成するという行動をしていることが伺えます。エージェントらしさがあって面白いですね。

OpenAI Agents SDK

実装

pip install openai-agentsでライブラリをインストールできます。Agents SDKは、OpenAIのモデルだけでなく、任意のLLMにも対応しています。デフォルトでは、gpt-4oモデルが使用されています。自分のOpenAIアカウントからトレースも確認することができ、エージェントの行動をGUIで確認することが容易です。export OPENAI_API_KEY=sk-...をして、OpenAIのAPIキーを環境変数にセットしておくと便利です。agent.pyのみ作成し、python agent.pyで実行できます。

# agent.py
import asyncio
from agents import Agent, Runner, ItemHelpers
from agents.mcp import MCPServer, MCPServerStdio

async def run(mcp_server: MCPServer):
    agent = Agent(
        name="FileOperator",
        instructions="あなたは、指定されたフォルダでファイルの作成、読み取り、更新、などの操作を行うことができます。指示に従って、ファイルの操作を行ってください。",
        mcp_servers=[mcp_server],
    )

    message = 'tmp.txtというファイルを作成し、"Hello, World!"という内容を書き込んでください。'
    result = Runner.run_streamed(starting_agent=agent, input=message)
    async for event in result.stream_events():
        if event.type == "run_item_stream_event":
            if event.item.type == "tool_call_item":
                print(f"Tool: {event.item.raw_item.name}")
            elif event.item.type == "message_output_item":
                print(f"{ItemHelpers.text_message_output(event.item)}")

async def main():
    async with MCPServerStdio(
        params={
            "command": "npx",
            "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"],
        },
    ) as server:
        await run(server)

if __name__ == "__main__":
    asyncio.run(main())

実行結果

丁寧にできることを確かめてタスクを完了する姿がなんとも可愛いですね。

AWS Strands Agents

実装

pip install strands-agentsでライブラリをインストールできます。Strands Agentsは、Bedrockに接続しやすく設計されたライブラリになります。デフォルトでは、claude-3.7-sonnetモデルが使われます。今回は使っていませんが、裏側でboto3が回っており、AWSのリソースへのアクセスも可能です。あらかじめ、AWSのアクセスキーなどは環境変数に設定しておきます。agent.pyのみ作成し、python -u agent.pyで実行します。

# agent.py
from strands import Agent
from strands.tools.mcp.mcp_client import MCPClient
from mcp import stdio_client, StdioServerParameters

client = MCPClient(lambda: stdio_client(
    StdioServerParameters(
        command="npx",
        args=["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
    )
))

with client:
    tools = client.list_tools_sync()
    agent = Agent(tools=tools, system_prompt="あなたは、指定されたフォルダでファイルの作成、読み取り、更新、などの操作を行うことができます。指示に従って、ファイルの操作を行ってください。")
    agent('tmp.txtというファイルを作成し、"Hello, World!"という内容を書き込んでください。')

実行結果

こちらも同様に、失敗してから対象フォルダを取得して、tmp.txtを作成しています。

おわりに

どのエージェントも、カレントディレクトリにtmp.txtを作成しようと試みた後に、権限を持っているフォルダを確認し、正しい位置に作成する行動をしました。自律的に考え、行動をするエージェントをこんなにも簡単に実装できるなんて嬉しいですね!簡単な違いは以下になります。
ADK (Agent Development Kit): Geminiモデルを使うのであれば、連携がスムーズです。開発者向けのチャットUIがあり、その場で会話の挙動を確認する際に便利です。また、今回は使っていませんが、Google検索やGoogle Cloudのサービスのツールも提供しており、親和性が高いです。

Agents SDK: OpenAIのモデルを使いたい場合に便利です。環境変数APIキーを登録するだけで、使用できます。また、エージェントがどのように考え、どのツールを使ったか、などの情報が簡単にOpenAIのアカウントからGUIで確認できます。複雑なトレーシングの実装をする必要がなく、非常に便利です。

Strands Agents: AWSのBedrockを使う場合に簡単に構築することができます。また、裏側では「boto3」が動いており、AWSのリソースに簡単にアクセスできるのも強みです。他にもデフォルトで使えるツールを豊富に取り揃えています。

自分は、個人的にADKに用意されている開発者用チャットUIが便利で好きです。また、ADKは6/12時点で唯一、1系のバージョンが出ていて安定しています。今回はprint文でエージェントの行動を出力していましたが、これらをレスポンスとしたAPIを構築し、様々なシステムに繋げることも可能です。生成AI周りの技術は日進月歩で進化していくので、今後が楽しみです!