Agent Deployment Kit (ADK) によるAIエージェントの作成からデプロイと動作確認まで

2025/07/24に公開されました。
2025/07/24に更新されました。

ADKでエージェントを作ってデプロイして動作確認するまで。


author: kuribo-

はじめに

インフラチームのkuribo-です。

最近、Google Cloudが提供するAgent Deployment Kit(以下、ADK)を触り始めました。
Pythonで書いたAIエージェントをサクッとデプロイできるという触れ込みですが、
いざ試してみると「なぜデプロイやクエリにまでPythonスクリプトが必要なんだろう?」という点で少し戸惑いました。

この記事では、簡単な「時刻案内エージェント」を例に、ADKを使った開発からデプロイ、動作確認までの一連の流れをご紹介します。
本記事が、同じように感じた方や、これからADKを試してみようという方の第一歩を後押しできれば幸いです。

今回作成したファイル

今回作成したのは、以下の3つのPythonスクリプトです。

  • agent.py: エージェント本体の定義
  • deploy.py: 作成したエージェントをAgent Engineにデプロイするためのスクリプト
  • query.py: デプロイしたエージェントに問い合わせするためのスクリプト

通常、Cloud Runのようなサービスでは gcloud コマンドでデプロイし、curl などで動作確認を行いますが、
Agent Engineではこれらの操作もPythonスクリプトで行うのが特徴です。

それぞれのスクリプトについて、順に説明していきます。

1. エージェントの定義 (agent.py)

まず、Agent Engineにデプロイするエージェント本体を定義します。

import datetime
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
from google.adk.agents import Agent

def get_current_time(city: str) -> dict:
    """指定された都市の現在時刻を返します。"""
    try:
        tz = ZoneInfo(city)
        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}

    except ZoneInfoNotFoundError:
        return {
            "status": "error",
            "error_message": (
                f"Sorry, I don't have timezone information for {city}."
            ),
        }

root_agent = Agent(
    name="city_time_agent",
    model="gemini-2.5-flash",
    description=(
        "問い合わせのあった都市のタイムゾーンを回答する。"
    ),
    instruction=(
        "あなたは日本語で書かれた都市の時間に関する質問に、日本語で回答する親切なエージェントです。"
        "ユーザーから日本語で都市名を受け取ったら、まず最初に対応するIANAタイムゾーン名を判断してください。"
        "IANAタイムゾーン名がわかったら、`get_current_time`ツールを使って現在時刻を取得してください。"
    ),
    tools=[get_current_time],
)

やっていることは非常にシンプルです。

  1. ツールの定義: get_current_time という関数(ツール)を定義します。これは、IANAタイムゾーン名(例: Asia/Tokyo)を引数に受け取り、現在時刻を返します。
  2. エージェントの定義: Agent クラスを使い、LLMモデル(Gemini)に指示(Instruction)と先ほどのツールを与え、エージェントを定義します。
  3. 動作の仕組み:「イギリスの時刻は?」といった自然言語での質問をLLMが解釈し、適切なタイムゾーン名(Europe/London)を推測して get_current_time ツールを実行してくれる、という仕組みです。

2. デプロイ (deploy.py)

次に、作成したエージェントを deploy.py スクリプトを使ってAgent Engineにデプロイします。

import vertexai
from vertexai import agent_engines
from agent import root_agent


PROJECT_ID = "<your-project-id>"
LOCATION = "us-central1"
STAGING_BUCKET = "gs://<staging-bucket>"

vertexai.init(
    project=PROJECT_ID,
    location=LOCATION,
    staging_bucket=STAGING_BUCKET,
)

remote_app = agent_engines.create(
    display_name="city_time_agent",
    description="時刻案内エージェントを Agent Engine にデプロイします。",
    agent_engine=root_agent,
    requirements=[
        "google-cloud-aiplatform[adk,agent_engines]"
    ],
    extra_packages=["agent"]
)

デプロイすると以下のようなログが出ます。
(以下のログは適宜マスクしています)

$ python3 ./deploy.py
Deploying google.adk.agents.Agent as an application.
Identified the following requirements: {'google-cloud-aiplatform': '1.102.0', 'cloudpickle': '3.1.1', 'pydantic': '2.11.7'}
The following requirements are missing: {'cloudpickle', 'pydantic'}
The following requirements are appended: {'pydantic==2.11.7', 'cloudpickle==3.1.1'}
The final list of requirements: ['google-cloud-aiplatform[adk,agent_engines]', 'pydantic==2.11.7', 'cloudpickle==3.1.1']
Using bucket <staging-bucket>
Wrote to gs://<staging-bucket>/agent_engine/agent_engine.pkl
Writing to gs://<staging-bucket>/agent_engine/requirements.txt
Creating in-memory tarfile of extra_packages
Writing to gs://<staging-bucket>/agent_engine/dependencies.tar.gz
Creating AgentEngine
Create AgentEngine backing LRO: projects/<project_id>/locations/us-central1/reasoningEngines/**<resource_id>**/operations/xxxxx
View progress and logs at https://console.cloud.google.com/logs/query?project=<your-project-id>
AgentEngine created. Resource name: projects/<project_id>/locations/us-central1/reasoningEngines/**<resource_id>**
To use this AgentEngine in another session:
agent_engine = vertexai.agent_engines.get('projects/<project_id>/locations/us-central1/reasoningEngines/**<resource_id>**')

デプロイログの最後に出力される Resource name の末尾にあるID(resource_id)を、次の動作確認で使います。

3. 問い合わせ (query.py)

最後に、query.py スクリプトを使って、デプロイしたエージェントが正しく動作するか確認します。

import vertexai
from vertexai import agent_engines

PROJECT_ID = "<your-project-id>"
LOCATION = "us-central1"

vertexai.init(
    project=PROJECT_ID,
    location=LOCATION,
)

resource_id = "<resource_id>"
remote_agent = agent_engines.get(resource_id)

user_id = "kuribo-"

# 既存のセッションがないか確認するためにセッションを一覧表示
session_list = remote_agent.list_sessions(user_id=user_id).get("sessions", [])

if session_list:
    print("Found existing session, reusing it.")
    session = session_list[0]
else:
    print("No existing session found, creating a new one.")
    session = remote_agent.create_session(user_id=user_id)

for event in remote_agent.stream_query(
    user_id=user_id,
    session_id=session["id"],
    message="イギリスの現在時刻を教えて下さい",
):
    print(event)

# セッションを削除する場合に利用する
# session_list = remote_agent.list_sessions(user_id=user_id)
#
# for session in session_list["sessions"]:
#     remote_agent.delete_session(user_id=user_id, session_id=session["id"])

実行すると以下のように出力します。

{'content': {'parts': [{'text': 'イギリスのIANAタイムゾーン名はいくつかありますが、ロンドンを想定して回答します。\n\n'}, {'function_call': {'id': 'adk-8b9ed618-a997-4f0b-9e5f-f31282747c62', 'args': {'city': 'Europe/London'}, 'name': 'get_current_time'}}], 'role': 'model'}, ...}
{'content': {'parts': [{'function_response': {'id': 'adk-8b9ed618-a997-4f0b-9e5f-f31282747c62', 'name': 'get_current_time', 'response': {'status': 'success', 'report': 'The current time in Europe/London is 2025-07-22 07:52:29 BST+0100'}}}], 'role': 'user'}, ...}
{'content': {'parts': [{'text': 'ロンドンの現在時刻は、2025722 午前75229秒です。\n'}], 'role': 'model'}, ...}

無事に動作しました。
実行結果から、以下のような流れで処理が行われていることがわかります。

  1. エージェントがユーザーの質問「イギリスの現在時刻を教えて下さい」を解釈し、「イギリス」のタイムゾーンとして Europe/London を推測。
  2. get_current_time ツールを city='Europe/London' という引数で呼び出す。
  3. ツールが成功し、ロンドンの現在時刻を取得。
  4. 取得した結果を基に、人間にとって分かりやすい文章で最終的な回答を生成する。

まとめ

今回は、ADKを使って自作エージェントをデプロイして動作確認するところまで解説しました。

  • ADKを使えば、Pythonコードから直接AIエージェントをデプロイできる。 Cloud Runのようにサーバレスなのでとても手軽です。
  • LLMが賢いので、ツールの呼び出しがいい感じ。 自然言語の指示を良しなに解釈してツールを実行してくれるため、エージェント開発が直感的になります。

情報がまだ少ない部分もありますが、ADKは、AIを活用したアプリケーション開発のハードルを大きく下げてくれる強力なツールだと感じました。
ただ、デプロイやクエリを投げるのにPythonスクリプトが必要な点は、もう少し手軽になると嬉しいなと感じました。

次は、今回デプロイしたAgent Engineを、Agentspaceから呼び出す手順についてもご紹介します。
(実はAgentspaceに繋ぐ部分を説明するための前段でした。)

参考

https://google.github.io/adk-docs/get-started/quickstart/#venv-install
https://blog.g-gen.co.jp/entry/how-to-deploy-adk-agent-to-agent-engine

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。