Agent Development Kit(ADK)へ入門してローカル環境で動作を確認する

Agent Development Kit(ADK)へ入門してローカル環境で動作を確認する

2025.12.02

はじめに

こんにちは。
クラウド事業本部コンサルティング部の渡邉です。

クラスメソッドのGoogle Cloud大好きエンジニア達で絶賛盛り上げ中のクラスメソッド Google Cloud Advent Calendar 2025 - Adventarの二日目を担当させていただきます!!

最近、生成AIを活用したエージェント開発が注目されていますよね。Google Cloudでも2025年のGoogle Cloud NEXTでAgent Development Kit (ADK)というオープンソースのエージェント開発フレームワークが発表されました。

もともと私のバックグラウンドとしては、ネットワークやサーバ周りのインフラエンジニアなので、AI・ML周りやアプリケーション開発は得意ではなかったのですが、昨今の生成AIやエージェント開発の盛り上がり状況を見るとキャッチアップしておかないといけない危機感にかられまして、エージェント開発に入門してみたいと思った次第です。

今回は、ADKを使って簡単な天気情報と現在時間を取得するエージェントを作成しながら、ADKの基本的な概念から、Vertex AIを使った環境構築、実際のエージェント作成まで、ハンズオン形式でキャッチアップしていきます。

概要

Agent Development Kit(ADK)とは

Agent Development Kit(ADK)とは、AIエージェントの構築、評価、デプロイを実現するGoogleのオープンソースフレームワークです。ADKの発表当時はPythonのみをサポートしてましたが、2025年11月現在では、Pythonに加えて、gojava向けにライブラリが公開されています。様々な言語に対応してきていることを考えると、Googleも力を入れてきていることがわかります。

https://google.github.io/adk-docs/

ADKは、以下のユースケースをサポートしています。

  • LLMを活用した対話型エージェントの構築
  • 複数のエージェントを連携させたマルチエージェントシステム
  • 外部APIやデータベースとの連携
  • Vertex AIやCloud Runへのデプロイによる本番運用

ADKの主要コンポーネント

ADKの主要なコンポーネントとしては、以下の3つがあります。他にもコンポーネントはありますが、入門編ということで主要なコンポーネントの紹介のみでご容赦ください。

コンポーネント 説明
Agent(エージェント) タスクを実行する単位。LLMAgent(LLMベース)とWorkflowAgent(順序・並列・ループ実行)、Custom Agentがある
Tool(ツール) エージェントが実行できる機能。Python関数として定義、外部API呼び出しも可能
Models(モデル) 使用するLLMモデル(Gemini等)の設定と認証

Agentの主要パラメータ

Agentは4つのカテゴリのパラメータで定義されます。

1. Identity Parameters(識別情報)

パラメータ 必須 説明
name 必須 エージェントの一意の識別子
model 必須 使用するLLMモデル(例: gemini-2.5-flash
description 推奨 エージェントの役割説明(マルチエージェント時に他のエージェントが参照)

2. Behavior Guidance(行動指示)

instructionパラメータはエージェントの振る舞いを定義する最も重要なパラメータです。
LLMへのシステムプロンプトの役割を果たします。

instruction="""
あなたは親切なアシスタントです。

# タスク
ユーザーの質問に正確に回答してください。

# 制約
- 日本語で回答する
- 簡潔にまとめる
- 不明な場合は正直に伝える
"""

動的な値を挿入したい場合は{variable}構文を使用できます。

3. Tool Integration(ツール統合)

toolsパラメータでエージェントに機能を提供します。
以下の場合、Pythonコードに定義しているget_weatherget_current_timesearch_database関数をエージェントに利用させることができます。

tools=[get_weather, get_current_time, search_database]

Tool(ツール)

ツールはエージェントに外部機能を提供するコンポーネントです。ADKではPython関数を自動的にツールに変換します。

ツールの定義方法

def search_products(
    query: str,                           # 必須パラメータ
    category: str = "all",                # オプショナルパラメータ
    max_results: Optional[int] = None     # None許容パラメータ
) -> dict:
    """
    商品を検索します。

    Args:
        query: 検索キーワード
        category: 商品カテゴリ(デフォルト: all)
        max_results: 最大結果数

    Returns:
        検索結果を含む辞書
    """
    # 実装
    return {"status": "success", "results": [...]}

ツール定義のベストプラクティス

ポイント 説明
型ヒントを必ずつける LLMがパラメータの型を理解するために必要です
docstringを詳細に書く LLMはdocstringを読んでツールの使用タイミングを判断します
戻り値は辞書型を推奨 statusキーを含めると結果が分かりやすい
パラメータ数を最小化 シンプルな関数ほどLLMが正確に使用できる

ツールの種類

ADKは3つのカテゴリの組み込みツールと、カスタムツール開発オプションを提供しています。
今回のハンズオンでは、Function Toolsを用いたエージェントを作成していきます。

組み込みツール

カテゴリ ツール例 説明
Gemini Tools Google検索、コード実行 Web検索やコード実行など基本的なLLM拡張機能
Google Cloud Tools BigQuery、Vertex AI Search、Spanner、Bigtable 各種Google Cloudサービスとの連携が可能
Third-party Tools GitHub、GitLab、Notion、Tavily、Firecrawl 外部サービスとの連携

カスタムツール開発オプション

種類 説明 用途
Function Tools Python関数をツールとして定義(今回使用) シンプルなカスタム機能
MCP Tools Model Context Protocolサーバーとの連携 30以上のデータソースに接続可能

早速やってみた

構成図

今回作成する天気情報と現在時間を取得するエージェントアプリの構成図です。
Vertex AI経由で、Geminiを呼び出し各ツールのオーケストレーションを実施してもらいます。

alt text

前提条件

  • Python 3.10以上
  • Google Cloudプロジェクト(Vertex AI API有効化済み)
  • gcloud CLIのセットアップ完了

プロジェクト構造

ADKのエージェントは以下のディレクトリ構造で作成します。

adk-sample/
├── .venv/                    # Python仮想環境
└── multi_tool_agent/         # エージェントパッケージ
    ├── __init__.py           # パッケージ初期化
    ├── agent.py              # エージェント定義
    └── .env                  # 環境変数

環境構築手順

1. 作業ディレクトリの作成

mkdir -p adk-sample/multi_tool_agent
cd adk-sample

2. Python仮想環境のセットアップ(uvを使用)

今回はPythonのパッケージマネージャーとしてuvを使用します。

# uvのインストール(未インストールの場合)
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

# 仮想環境の作成
uv venv

3. ADKのインストール

以下のコマンドを実行して、ADKをインストールしていきます。

uv pip install google-adk

ADKのインストールが正常にできているかどうかは、以下のコマンドを実行することで確認することができます。

uv pip show google-adk

4. Vertex AI認証の設定

ADKによって開発されるエージェントは、大規模言語モデル(LLM)を利用して応答を得ることができます。大規模言語モデルを利用する方法としては、以下の二つがあります。

  • Google AI Studio
  • Google Cloud Vertex AI

今回は、Google Cloud Vertex AIを利用したいと思います。Vertex AIを使用する場合、Application Default Credentials(ADC)の設定が必要になりますので、以下のコマンドを実行して設定を行います。

gcloud auth application-default login

ブラウザが開いてGoogle認証が求められますので、認証を完了させてください。

5. 環境変数の設定

multi_tool_agent/.envファイルを作成し、以下の内容を記載します。

GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=asia-northeast1
環境変数 説明
GOOGLE_GENAI_USE_VERTEXAI TRUEでVertex AI経由でGeminiを使用するように設定
GOOGLE_CLOUD_PROJECT Google CloudプロジェクトID
GOOGLE_CLOUD_LOCATION リージョン(asia-northeast1など)

エージェントの作成

パッケージ初期化ファイルの作成

multi_tool_agent/__init__.pyを作成します。このファイルにより、パッケージ読み込み時にagent.pyモジュールをインポートしてくれます。

__init__.py
from . import agent

エージェント定義ファイルの作成

multi_tool_agent/agent.pyを作成します。今回は、天気情報と現在時刻を取得できるエージェントを作成します。
リアルタイムの天気情報を取得するために、Open-Meteo APIを利用しています。Open-Meteo APIとは、オープンソース天気予報APIで非商用利用であれば完全無料で使用することができます。APIキー不要なところが個人的に気に入っています。APIの呼び出しに、緯度・経度を指定するだけで天気データを取得することができます。

agent.py
"""
天気・時刻エージェント

ADKの基本的な使い方を示すサンプルエージェントです。
- ツール(関数)の定義方法
- エージェントの作成方法
- 外部API(Open-Meteo)の利用
を学べます。
"""

import datetime
from zoneinfo import ZoneInfo
import requests
from google.adk.agents import Agent

# =============================================================================
# ツール(Tool)の定義
# =============================================================================
# ツールは、エージェントが実行できる「機能」です。
# 通常のPython関数として定義し、docstringで説明を書きます。
# LLMはこのdocstringを読んで、いつこのツールを使うべきか判断します。

# 天気コードから日本語の天気説明へのマッピング
# https://open-meteo.com/en/docs の WMO Weather interpretation codes 参照
WEATHER_CODE_MAP = {
    0: "快晴",
    1: "晴れ",
    2: "一部曇り",
    3: "曇り",
    45: "霧",
    48: "着氷性の霧",
    51: "弱い霧雨",
    53: "霧雨",
    55: "強い霧雨",
    56: "弱い着氷性の霧雨",
    57: "強い着氷性の霧雨",
    61: "弱い雨",
    63: "雨",
    65: "強い雨",
    66: "弱い着氷性の雨",
    67: "強い着氷性の雨",
    71: "弱い雪",
    73: "雪",
    75: "強い雪",
    77: "霧雪",
    80: "弱いにわか雨",
    81: "にわか雨",
    82: "激しいにわか雨",
    85: "弱いにわか雪",
    86: "強いにわか雪",
    95: "雷雨",
    96: "雹を伴う弱い雷雨",
    99: "雹を伴う強い雷雨",
}

def get_weather(city: str) -> dict:
    """
    指定された都市の現在の天気情報を取得します。
    Open-Meteo API(無料・APIキー不要)を使用してリアルタイムの天気データを取得します。

    Args:
        city: 天気を取得したい都市名(例: "東京", "大阪", "New York", "London")

    Returns:
        天気情報を含む辞書(気温、天気、湿度、風速など)
    """
    try:
        # Step 1: 都市名から緯度・経度を取得(Open-Meteo Geocoding API)
        geocoding_url = "https://geocoding-api.open-meteo.com/v1/search"
        geo_params = {
            "name": city,
            "count": 1,
            "language": "ja",
            "format": "json"
        }

        geo_response = requests.get(geocoding_url, params=geo_params, timeout=10)
        geo_response.raise_for_status()
        geo_data = geo_response.json()

        if "results" not in geo_data or len(geo_data["results"]) == 0:
            return {
                "status": "error",
                "message": f"都市 '{city}' が見つかりませんでした。別の都市名を試してください。"
            }

        location = geo_data["results"][0]
        latitude = location["latitude"]
        longitude = location["longitude"]
        city_name = location.get("name", city)
        country = location.get("country", "")

        # Step 2: 天気情報を取得(Open-Meteo Weather API)
        weather_url = "https://api.open-meteo.com/v1/forecast"
        weather_params = {
            "latitude": latitude,
            "longitude": longitude,
            "current": "temperature_2m,relative_humidity_2m,weather_code,wind_speed_10m,apparent_temperature",
            "timezone": "auto"
        }

        weather_response = requests.get(weather_url, params=weather_params, timeout=10)
        weather_response.raise_for_status()
        weather_data = weather_response.json()

        current = weather_data["current"]
        weather_code = current["weather_code"]
        weather_description = WEATHER_CODE_MAP.get(weather_code, f"不明 (コード: {weather_code})")

        return {
            "status": "success",
            "city": city_name,
            "country": country,
            "weather": weather_description,
            "weather_code": weather_code,
            "temperature": f"{current['temperature_2m']}°C",
            "apparent_temperature": f"{current['apparent_temperature']}°C",
            "humidity": f"{current['relative_humidity_2m']}%",
            "wind_speed": f"{current['wind_speed_10m']} km/h",
            "coordinates": {
                "latitude": latitude,
                "longitude": longitude
            },
            "data_source": "Open-Meteo API"
        }

    except requests.exceptions.Timeout:
        return {
            "status": "error",
            "message": "天気情報の取得がタイムアウトしました。しばらく待ってから再度お試しください。"
        }
    except requests.exceptions.RequestException as e:
        return {
            "status": "error",
            "message": f"天気情報の取得中にエラーが発生しました: {str(e)}"
        }
    except Exception as e:
        return {
            "status": "error",
            "message": f"予期しないエラーが発生しました: {str(e)}"
        }

def get_current_time(timezone: str = "Asia/Tokyo") -> dict:
    """
    指定されたタイムゾーンの現在時刻を取得します。

    Args:
        timezone: タイムゾーン名(例: "Asia/Tokyo", "America/New_York")
                  デフォルトは "Asia/Tokyo"

    Returns:
        現在時刻の情報を含む辞書
    """
    try:
        tz = ZoneInfo(timezone)
        now = datetime.datetime.now(tz)
        return {
            "status": "success",
            "timezone": timezone,
            "datetime": now.strftime("%Y-%m-%d %H:%M:%S"),
            "date": now.strftime("%Y年%m月%d日"),
            "time": now.strftime("%H時%M分%S秒"),
            "day_of_week": ["月", "火", "水", "木", "金", "土", "日"][now.weekday()],
        }
    except Exception as e:
        return {
            "status": "error",
            "message": f"タイムゾーン '{timezone}' は無効です: {str(e)}",
        }

# =============================================================================
# エージェントの定義
# =============================================================================
# Agent クラスを使ってエージェントを作成します。
# - name: エージェントの識別名
# - model: 使用するLLMモデル
# - description: エージェントの説明(マルチエージェント時に使用)
# - instruction: エージェントの振る舞いを定義するプロンプト
# - tools: エージェントが使用できるツールのリスト

root_agent = Agent(
    name="weather_time_agent",
    model="gemini-2.5-flash",
    description="天気と時刻の情報を提供するアシスタント",
    instruction="""
あなたは親切で丁寧な日本語アシスタントです。
ユーザーからの質問に対して、利用可能なツールを使って正確な情報を提供してください。

対応できること:
- 世界中の都市の天気情報(リアルタイムデータ)
- 現在の日時(様々なタイムゾーン対応)

回答する際のルール:
1. 必ず日本語で回答してください
2. 情報は簡潔にまとめてください
3. ツールから得られた情報を元に回答してください
4. 天気情報には気温、天気、湿度などを含めてください
5. エラーが発生した場合は、ユーザーにわかりやすく説明してください
""",
    tools=[get_weather, get_current_time],
)

コードのポイント

ツール(Tool)の定義

ツールは通常のPython関数として定義します。docstringに記載する内容が重要になります。LLMはこのdocstringに記載された内容を読みこんで、いつこのツールを使うべきか判断します。

def get_weather(city: str) -> dict:
    """
    指定された都市の現在の天気情報を取得します。
    Open-Meteo API(無料・APIキー不要)を使用してリアルタイムの天気データを取得します。

    Args:
        city: 天気を取得したい都市名(例: "東京", "大阪", "New York", "London")

    Returns:
        天気情報を含む辞書(気温、天気、湿度、風速など)
    """

エージェントの定義

ここでは、Agentクラスを使ってエージェントを定義します。
ADKでは、LLMエージェントとも呼ばれるコンポーネントで、大規模言語モデル(LLM)へアクセスすることで、推論・自然言語の理解・応答生成を行うことができます。知っておくべき基本的なパラメータについて記載しておきます。

パラメータ 説明
name エージェントの識別名を設定する(必須な設定)。エージェントの機能を表した命名規則にすることが推奨されています。
model 使用するLLMモデル(gemini-2.5-flashなど)を指定します(必須な設定)。
description エージェントの説明を記載する(マルチエージェント時に使用) LLMエージェントが、このエージェントにタスクを割り振るべきかどうかを判断する際に使われる。
instruction エージェントの振る舞いを定義するシステムプロンプト。Markdown形式でエージェントに行ってもらいたいタスクを詳細にプロンプトとして定義することが大切になる。
tools エージェントが使用できるツールのリストを与えます。Python関数やメソッドを設定します。(ここでは、get_weather, get_current_timeを指定)

エージェントの動作確認

ADK Web UIの起動

ADKには開発用のブラウザベースUIが用意されています。
adk webというコマンド一つでローカル上でWebサーバーが起動し、curlコマンドやAPIリクエストを送って作成したエージェントのテストを実行することができます。

# 仮想環境を有効化
source .venv/bin/activate

# Web UIを起動
adk web

INFO:     Started server process [31015]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://127.0.0.1:8000.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

ローカル環境でサーバが起動したので、ブラウザでhttp://127.0.0.1:8000にアクセスしてWeb UIへアクセスします。

alt text
Web UI

動作確認

立ち上がったWeb UIを利用して、チャットボットのような形式でメッセージを送ることで作成したエージェントの動作を確認することができます。

  • 今の東京の天気と気温を教えて

alt text
天気情報の対話

メッセージを送信した現在の日時(2025年11月28日)における東京の天気と気温を正確に教えてくれました。
エージェントから応答されたときにどの関数が実行されたか(ここでいうget_weather)を確認することもできるため、想定通りの関数が実行できているのかテストすることができます。また、関数ごとのリクエストレスポンスの内容など詳細情報も確認することができるためデバッグに非常に便利です。

alt text
関数実行の詳細情報

  • 今何時ですか?

alt text
時刻の問い合わせ結果

時刻の問い合わせにも、get_current_timeを呼び出すことができており、正確に答えることができています。
また、Web UIでは、ユーザーとエージェントの対話だけでなく、ツールの呼び出し履歴トレース情報も確認できます。
Web UIについての詳細な説明は別の機会にしたいと思います。

最後に

今回は、Google CloudのAgent Development Kit(ADK)を使って、ローカル環境で天気情報と現在時刻を取得するエージェントを作成してみました。
実際に手を動かすことで、簡単な短いコードでAIエージェントを開発することができることを実感することができましたし、adk webという簡単なコマンドでローカル環境でwebサーバの立ち上げからUIベースでテスト・評価を行うことができるため開発速度が向上すると思いました。

今回は入門記事ということでコアコンポーネントのみを利用した簡単なエージェントの構築でしたが、会話のセッションを管理するコンポーネントや、エージェントを順番に呼び出すことができるワークフローエージェントなど様々な機能がたくさんあります。せっかく、ADKに入門したのでこのような機能を使って独自のエージェントを構築してみたいと思います。

次回は、ローカル環境で作成したエージェントをVertex AI Agent Engineにデプロイする内容でブログを執筆したいと思います。

明日以降の クラスメソッド Google Cloud Advent Calendar 2025 - Adventarも引き続きお楽しみください!!

以上、クラウド事業本部コンサルティング部の渡邉でした!

この記事をシェアする

FacebookHatena blogX

関連記事