GoogleのAgent Development KitでAIエージェント開発に入門する

# 初めに
AIエージェントの開発に興味はあるものの、難しそうで手を出せずにいました。
そんな中、Googleが出してる**Agent Development Kit（ADK）**を使えば、そのAIエージェントが意外と簡単に作れることを知りました。
この記事では、ADKの公式ドキュメントにあるQuickStartを参考に、簡単なAIエージェント開発に入門してみます。

# ADKとは
ADKとは`Agent Development Kit`の略で、AIエージェントを作成するためのフレームワークです。
このフレームワークはGoogleから提供されており、現在はPythonとJavaの2言語で利用することができます。

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

LLMはGoogleが提供しているモデルをオンラインで利用することが可能です。
`Vertex AI`、もしくは`Google AI Studio`のモデルを利用することができます。

# 構築してみる
今回は、公式ドキュメントにあるQuickStartを参考に作成してみます。

https://google.github.io/adk-docs/get-started/quickstart/

PCはWindowsです。
言語はPython、LLMはVertex AIのものを利用します。
Vertex AIを利用するために以下の準備が必要です。

* GCPのプロジェクトを作成
* gcloud CLIのセットアップ
* gcloud auth loginコマンド実行
* Vertex AIの有効化

詳しくはドキュメントをご覧ください。

https://google.github.io/adk-docs/get-started/quickstart/#set-up-the-model



## 1. 環境の作成（venv）
まずは、venvを使って仮想環境を立ち上げていきます。
（venvは使ったことなかったですが、python用のdockerみたいなイメージなんですかね？便利）

```
$ python -m venv .venv
```

その後、venvを有効化しましょう。

```sh
$ .venv\Scripts\Activate
```

## 2. プロジェクトの作成

pipでgoogle-adkをインストールします。
```
$ pip install google-adk
```

## 3. Agentの作成
AIエージェントを実装していきましょう。
3ファイル実装します。

* `__init__.py`
* `agent.py`
* `.env`

構成は以下のような感じです。
`__init__.py`を置き、`multi_tool_agent`という一つのパッケージを作成しているイメージです。
```
parent_folder/
    multi_tool_agent/
        __init__.py
        agent.py
        .env
```


### `agent.py`
`multi_tool_agent`の実態になります。
・AIエージェントが利用できるツールを関数として定義
・AIエージェント自体をAgentオブジェクトとして定義する

#### ツールの定義
ツールとは、AIエージェントが利用できる拡張機能のようなイメージです。
QuickStartでは、以下の2つのツールが用意されています。
* get_weather：天気を取得する
* get_current_time：現在時刻を取得する

各ツールは関数で定義し、エージェントから呼び出しができるようにしておきます。

```python: get_weather
def get_weather(city: str) -> dict:
    """Retrieves the current weather report for a specified city.

    Args:
        city (str): The name of the city for which to retrieve the weather report.

    Returns:
        dict: status and result or error msg.
    """
    if city.lower() == "new york":
        return {
            "status": "success",
            "report": (
                "The weather in New York is sunny with a temperature of 25 degrees"
                " Celsius (77 degrees Fahrenheit)."
            ),
        }
    else:
        return {
            "status": "error",
            "error_message": f"Weather information for '{city}' is not available.",
        }
```

```python: get_current_timeツール
def get_current_time(city: str) -> dict:
    """Returns the current time in a specified city.

    Args:
        city (str): The name of the city for which to retrieve the current time.

    Returns:
        dict: status and result or error msg.
    """

    if city.lower() == "new york":
        tz_identifier = "America/New_York"
    else:
        return {
            "status": "error",
            "error_message": (
                f"Sorry, I don't have timezone information for {city}."
            ),
        }

    tz = ZoneInfo(tz_identifier)
    now = datetime.datetime.now(tz)
    report = (
        f'The current time in {city} is {now.strftime("%Y-%m-%d %H:%M:%S %Z%z")}'
    )
    return {"status": "success", "report": report}
```

#### AIエージェント
AIエージェントは`google.adk.agents`のAgentというオブジェクトで定義します。
インスタンス化する時に、エージェントの名称、説明、モデル、使用するツールを定義します。

```python: root_agent
from google.adk.agents import Agent

root_agent = Agent(
    name="weather_time_agent",
    model="gemini-2.5-flash-preview-05-20",
    description=(
        "Agent to answer questions about the time and weather in a city."
    ),
    instruction=(
        "You are a helpful agent who can answer user questions about the time and weather in a city."
    ),
    tools=[get_weather, get_current_time],
)
```

:::note info
モデルIDはVertex AIのModelGardenに記載されている値から引用しました。
:::


実際の`Agents.py`の全体はこちらです。

<details><summary>Agents.pyの全体</summary>

```python: agent.py
import datetime
from zoneinfo import ZoneInfo
from google.adk.agents import Agent

def get_weather(city: str) -> dict:
    """Retrieves the current weather report for a specified city.

    Args:
        city (str): The name of the city for which to retrieve the weather report.

    Returns:
        dict: status and result or error msg.
    """
    if city.lower() == "new york":
        return {
            "status": "success",
            "report": (
                "The weather in New York is sunny with a temperature of 25 degrees"
                " Celsius (77 degrees Fahrenheit)."
            ),
        }
    else:
        return {
            "status": "error",
            "error_message": f"Weather information for '{city}' is not available.",
        }


def get_current_time(city: str) -> dict:
    """Returns the current time in a specified city.

    Args:
        city (str): The name of the city for which to retrieve the current time.

    Returns:
        dict: status and result or error msg.
    """

    if city.lower() == "new york":
        tz_identifier = "America/New_York"
    else:
        return {
            "status": "error",
            "error_message": (
                f"Sorry, I don't have timezone information for {city}."
            ),
        }

    tz = ZoneInfo(tz_identifier)
    now = datetime.datetime.now(tz)
    report = (
        f'The current time in {city} is {now.strftime("%Y-%m-%d %H:%M:%S %Z%z")}'
    )
    return {"status": "success", "report": report}


root_agent = Agent(
    name="weather_time_agent",
    model="gemini-2.5-flash-preview-05-20",
    description=(
        "Agent to answer questions about the time and weather in a city."
    ),
    instruction=(
        "You are a helpful agent who can answer user questions about the time and weather in a city."
    ),
    tools=[get_weather, get_current_time],
)

```

</details>




### `__init__.py`
`__init__.py`を使い、作成するエージェントをモジュール化します。

```python: __init__.py
from . import agent
```


### `.env`
.envには設定値を書きます。
今回はVertexAIを利用するため`GOOGLE_GENAI_USE_VERTEXAI=TRUE`にしています。

```sh: .env
GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
GOOGLE_CLOUD_LOCATION=LOCATION
```

:::note info
LOCATIONを東京にしたところ、モデルが見つけられないというエラーがでてしまった。`asia-northeast1`にしたらうまくいった。
:::

## 4. AIエージェントを立ち上げる

プロジェクトのディレクトリで`adk web`コマンドを実行すると、ローカルホストにAIエージェントが立ち上がります。

```powershell
$ adk web
INFO:     Started server process [24864]
INFO:     Waiting for application startup.

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

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

記載されているURLにアクセスすると、AIエージェントのUIが立ち上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/71743ef6-a1c0-496c-b5d1-9a0d955ab7b8.png)


左上の`Select an agent`で作成した`multi_tool_agent`を選択するとAIエージェントとの会話用UIが出てきます。
ニューヨークの天気を聞いてみましたが、ちゃんと答えてくれました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/515960c5-4874-4076-ad9f-12229009a04d.png)


# 終わりに
ADKを使うと比較的簡単にAIエージェントを作成できました。
pythonは初めてでしたが、動作確認まで1時間ほどでサクッと作れてかなり良かったです。
今回はローカルでしたが、ADKはGoogleのエージェントエンジンを使うことでデプロイもできるようなので、次はそれを試してみようと思います。

ここまでご覧いただきありがとうございました！