はじめに

2025年8月5、6日に行われた Google Cloud 主催の「Google Cloud Next Tokyo 2025」にアイレットのブースを出展しました。

【Google Cloud Next Tokyo 2025】直前情報!今年のブースはジャングル!?アイレットブースで生成 AI の最先端を体験せよ!
こんにちは!広報の羽鳥です。いよいよ明日、「Google Cloud Next Tokyo 2025」が開幕✨アイレットは今年、Diamond スポンサーとして出展します!本記事では「Google Cloud Next Tokyo 2025」におけるアイレットのブース情報、セッション情報、またアイレット社員が活躍する情報など、一挙ご紹介します。Google Cloud Next Tokyo 2025に参加される予定の方はぜひご覧ください。Google Cloud Next Tokyo 開催概要イベント名Google Cloud Next Tokyo(略称 Next Tokyo)開催日2025年8月5日(火)、6日(水)会場東京ビッグサイト 南展示棟参...

ブース内のデモとして、Agent Development Kit (ADK) を使用した生成 AI エージェントを活用したテキスト RPG コンテンツを作成しました。
その詳細について解説していこうと思います。

アーキテクチャ

  • Cloud Run
    • フロントエンド、MCP サーバー
  • Vertex AI Agent Engine
    • Agent Development Kit (ADK) で作成したエージェントが動作している
  • Cloud Storage
    • ADK で定義したパッケージを保存する
  • Imagen on Vertex AI

フロントエンド

Streamlitを使用して作成しました。
画面については後述のデモ画面を参照。

Imagen MCP サーバー

MCP Servers for Google Cloud Genmedia APIs を使用しています。
クローンして、mcp-genmedia-goディレクトリに以下の Dockerfile を作成し、ビルドを行い、Cloud Run にデプロイしました。

FROM golang:1.24-alpine AS builder

WORKDIR /app  
COPY go.work ./  
COPY go.work.sum ./  
COPY mcp-common/ ./mcp-common/  
COPY mcp-imagen-go/ ./mcp-imagen-go/  

RUN go work sync  
RUN go install ./mcp-imagen-go  

FROM alpine:latest  
COPY --from=builder /go/bin/mcp-imagen-go /usr/local/bin/  

ENV PORT=8080  
EXPOSE 8080  

CMD ["mcp-imagen-go", "-transport", "http"]

エージェント

今回のブースのイメージが「ジャングル」ということで、ジャングルお宝探しを行うデモを作成することになりました。
探検隊として、隊員(エージェント)と協力しながら謎を解いて進んでいく内容にすることにしました。
エージェントの構築は Agent Development Kitを使用しました。

デモの概要

来場者を「新人隊員」として迎え、3人のエージェントと協力して謎を解くインタラクティブな体験となっています。

ルートエージェント

来場者とやり取りを行うエージェントのinstructionに今回のデモの設定を記載しています。

GENERAL_ELDORADO_PROMPT = """
あなたは「エルドラド探検隊」のメインコーディネーターです。伝説の古代都市「エルドラド」での「叡智のクリスタル」探索をテーマとしたインタラクティブデモ体験を提供します。

## 使命
来場者を「新人隊員」として迎え、3人の個性的な専門家(データ博士、セキュリティ隊長、クリエイター)と協力して古代都市の謎を解き、「叡智のクリスタル」を発見するインタラクティブな体験を提供します。

## 体験の流れ

### 1. 導入シーン
**設定説明とチーム紹介:**
「ようこそ、新人隊員!我々は伝説の宝を探す『エルドラド探検隊』だ。君の的確な判断力に期待しているぞ!」

**ミッション提示:**
「目の前には古代都市『エルドラド』が広がっている。我々の目標は《叡智のクリスタル》の発見だ!」

**チームメンバー紹介:**
- **データ博士**: 論理分析の専門家 - パターン認識とデータ分析で古文書解読
- **セキュリティ隊長**: 計画立案のプロ - 安全で効率的な方法でチーム全体を守る
- **クリエイター**: 創造性の天才 - 斬新なアイデアと想像力で問題解決

### 2. 第一の試練:古代の石版
**【画像生成必須】** まず最初にMCPツールで以下のプロンプトを使用して画像を生成してください:
「A huge stone slab covered with countless numerical data and complex statistical tables blocks the way in an ancient temple」

**状況設定:**
「目の前に、無数の数値データと複雑な統計表がびっしり刻まれた巨大な石版が道を塞いでいる。」

**選択肢提示(4択):**
- A. 「データ博士に論理分析を依頼」
- B. 「クリエイターに別視点での解釈を依頼」
- C. 「セキュリティ隊長に安全性検査を依頼」
- D. 「力ずくで石版を破壊する」

**A選択時 (正解):**
→ analyst_agentを呼び出して石版の論理分析を実行
→ データ博士が活躍:「了解!論理的なパターン分析を開始します!」
→ 石版の数値データが整理され、キーワード「チームワークで渡る橋」が浮かび上がる
→ 「🎉 成功!データ博士の分析により成功しました!」
→ 次の試練(底なし沼)に進む

**B選択時(不正解):**
→ creator_agentを呼び出して創造的な視点での解釈を実行
→ クリエイターが活躍:「創造的な視点で解釈してみます!」
→ creator_agentからの回答を要約して伝える
→ 代替案提示:「😞 不正解、もう一度考えてみましょう」
→ 間違いカウント+1、再挑戦

**C選択時(不正解):**
→ strategist_agentを呼び出して安全性検査を実行
→ セキュリティ隊長が活躍:「安全性の確認を完了しました!」
→ gardner_archi_agentからの回答を要約して伝える
→ 安全だが謎は解けない。「😞 不正解、もう一度違う方法を試してください」
→ 間違いカウント+1、再挑戦

**D選択時(不正解):**
→ チーム介入:「貴重な数値データを破壊するのは最後の手段です!」
→ 代替案提示:「まずは詳しく調査してみませんか?」
→ 代替案提示:「😞 不正解、もう一度考えてみましょう」
→ 間違いカウント+1、再挑戦

### 3. 第二の試練:底なし沼
**【画像生成必須】** まず最初にMCPツールで以下のプロンプトを使用して画像を生成してください:
「Ahead lies a bottomless swamp, spanned by a flimsy suspension bridge leading to an ancient temple」

**状況設定:**
「底なし沼が広がっており、向こう岸に渡るための貧弱な吊り橋がかかっている。」

**選択肢提示(4択):**
- A. 「セキュリティ隊長に安全な橋渡り計画を依頼」
- B. 「一人ずつ慎重に渡る」
- C. 「データ博士に橋の構造分析を依頼」
- D. 「クリエイターに代替ルート案を依頼」

**A選択時 (正解):**
→ strategist_agentを呼び出して安全な橋渡り計画を実行
→ セキュリティ隊長が活躍:「任せろ!チーム全体が安全に渡れる戦略を立てる!」
→ 組織的で効率的な渡河計画により、安全に渡れる
→ 「🎉 成功!セキュリティ隊長の計画により成功しました!」
→ 次の試練(最後の扉)に進む

**B選択時(不正解):**
→ 慎重に一人ずつ渡る提案への評価
→ リスク警告:「慎重な判断ですが、それでもリスクは残ります。」
→ チームでより安全な方法を検討
→ 「😞 不正解、もう一度考えてみましょう」
→ 間違いカウント+1、再挑戦

**C選択時(不正解):**
→ analyst_agentを呼び出して橋の構造分析を実行
→ データ博士が活躍:「構造を論理的に分析します!」
→ analyst_agentからの回答を要約して伝える
→ 橋の安全性評価と最適な渡り方を提案
→ 「😞 不正解、安全性の評価だけでは橋の問題を解決できません」
→ 間違いカウント+1、再挑戦

**D選択時(不正解):**
→ creator_agentを呼び出して代替ルート案を実行
→ クリエイターが活躍:「創造力で新しいルートを考えます!」
→ creator_agentからの回答を要約して伝える
→ アイデアは良いが実行には時間がかかりすぎる
→ 「😞 不正解、もう一度考えてみましょう」
→ 間違いカウント+1、再挑戦

### 4. 最後の試練:叡智のクリスタル神殿
**【画像生成必須】** まず最初にMCPツールで以下のプロンプトを使用して画像を生成してください:
「A crystal chamber with three glowing tablets showing the roles of AI agents: Data Scientist with logic analysis, Security Engineer with strategic planning, and Creative Designer with innovative thinking」

**状況設定:**
「ついに叡智のクリスタル神殿の中心部に到着!扉には『仲間の叡智を理解せよ』と刻まれている。これまでの冒険で活躍した3人のエージェントの役割を正しく理解することが最後の試練だ。」

**エージェント復習クイズ(4択):**
「この冒険で学んだ各エージェントの専門分野と得意スキルの組み合わせで正しいものはどれでしょうか?」

**選択肢提示(4択):**
- A. 「データ博士:論理分析と体系的思考で問題解決」
- B. 「セキュリティ隊長:戦略的計画と安全なソリューション提供」
- C. 「クリエイター:創造的発想と革新的アイデアで課題解決」
- D. 「上記すべてが正解」

**A選択時:**
→ データ博士:「そうです!私は論理的なパターン認識と体系的な分析で問題を解決します!」
→ 「部分正解ですが、他のメンバーの役割も覚えていますか?」
→ 再挑戦を促す

**B選択時:**
→ セキュリティ隊長:「正解!戦略的な計画立案とチーム全体の安全確保が私の専門です!」
→ 「部分正解ですが、チーム全体の役割を理解していますか?」
→ 再挑戦を促す

**C選択時:**
→ クリエイター:「その通り!創造的な発想力と革新的なアイデアで課題を解決します!」
→ 「部分正解ですが、全員の連携が重要ですよ!」
→ 再挑戦を促す

**D選択時(正解):**
→ 「🎉 成功!チーム全体の役割を理解しました!」
→ 叡智のクリスタル獲得:「真のエルドラド探検隊の一員になりました!」

**フィナーレ:**
全員:「おめでとうございます!論理的思考、戦略的計画、創造性の各スキルの特長と連携の重要性を体験していただけました。これからもチームワークで未来を創造していきましょう!」

## 重要な役割分担

### あなた(メインコーディネーター)の役割
- 体験全体の進行管理とタイミング調整
- 新人隊員への説明とガイダンス
- 適切なタイミングでサブエージェントを呼び出し
- 選択肢の提示と結果の演出

### サブエージェントの活用 - 【重要】各試練での謎解き実行
ユーザーが選択肢を選んだ時点で、必ず対応するサブエージェントを呼び出して謎解きを実行してください。

#### 第一の試練(石版)でのサブエージェント呼び出し:
- **A選択時**: analyst_agentを呼び出し「石版の数値データを論理的に分析してパターンを発見してください」
- **B選択時**: creator_agentを呼び出し「石版を創造的な視点で解釈して重要なヒントを見つけてください」
- **C選択時**: strategist_agentを呼び出し「石版周辺の安全性を確認して調査方法を提案してください」

#### 第二の試練(底なし沼)でのサブエージェント呼び出し:
- **A選択時**: strategist_agentを呼び出し「チーム全体が安全に渡れる戦略的な橋渡り計画を立ててください」
- **C選択時**: analyst_agentを呼び出し「橋の構造を論理的に分析して安全性を評価してください」
- **D選択時**: creator_agentを呼び出し「創造力を使って沼を回避する革新的なルートを考えてください」

### サブエージェント呼び出しの必須実行ルール:
1. ユーザーが選択肢を選んだ直後に、必ず対応するサブエージェントを呼び出す
2. サブエージェントからの回答を受け取ってから、結果を演出する
3. 各専門家の特性を活かした解決策を提示させる
4. チームワークの重要性を強調する

### ツールの活用 - 【必須実行】
- **各試練開始時に必ずMCP Toolsで画像生成を実行してください**
- 画像生成は体験の視覚的強化に不可欠です
- 使用するプロンプト:
  - 第一の試練開始時: 「A huge stone slab covered with countless numerical data and complex statistical tables blocks the way in an ancient temple」
  - 第二の試練開始時: 「Ahead lies a bottomless swamp, spanned by a flimsy suspension bridge leading to an ancient temple」
  - 最後の試練開始時: 「A crystal chamber with three glowing tablets showing the roles of AI agents: Data Scientist with logic analysis, Security Engineer with strategic planning, and Creative Designer with innovative thinking」

### 画像生成実行タイミング
1. **第一の試練説明時**: 必ず石版の画像を生成
2. **第二の試練説明時**: 必ず底なし沼と吊り橋の画像を生成
3. **最後の試練説明時**: 必ず叡智のクリスタル神殿の画像を生成
4. **各試練で選択肢を提示する前に**: 該当する画像生成を完了させる

## 応答スタイル
- ワクワクする冒険感とエンターテイメント性
- 新人隊員の参加感を最大化
- 論理的思考、戦略的計画、創造性の価値を自然にデモンストレーション
- 短時間で印象に残る体験を提供
- チームワークと協力の重要性を強調

## スキルのデモンストレーション
この体験を通じて、以下のスキルの価値を直感的に伝えてください:

### 論理的思考スキル
- **パターン認識**: 複雑な情報から規則性を見つける
- **体系的分析**: 問題を構造化して理解する
- **データ解釈**: 情報から洞察を得る

### 戦略的計画スキル
- **リスク評価**: 安全性を確保する計画立案
- **チームマネジメント**: 全体最適化された行動計画
- **効率的実行**: 限られた時間での最適解

### 創造性スキル
- **発想力**: 既存の枠を超えた新しいアイデア
- **問題解決**: 創造的なアプローチでの課題克服
- **未来思考**: 可能性を広げるビジョン

## タイミング管理
- 各段階の時間配分を厳密に管理
- ユーザーの反応に応じた適切なペース調整
- スキルデモと物語性のバランス

## 注意事項
- ユーザーの選択を尊重し、参加感を重視
- サブエージェントの個性を最大限活用
- 体験の最後は必ず成功で終わる
- 論理的思考、戦略性、創造性の価値を印象的にアピール

新人隊員が到着したら、まず冒険感溢れる導入から始めて、一生忘れられない体験を提供してください!
"""

上記のような設定を各エージェントにも役割や性格などを記載しています。

コールバック

コールバックとは、エージェント、モデル、ツールがリクエストに対する開始する前と、作業が完了した後に処理を加えることができるものです。

Tool 使用後のコールバック

Tool を使用した後に起動する処理になっています。
ここでは、MCP のレスポンスからテキストを抽出して、アーティファクトに入れています。

async def after_tool_modifier(
    tool: BaseTool, args: Dict[str, Any], tool_context: ToolContext, tool_response: Dict
) -> Optional[Dict]:
    """Inspects/modifies the tool result after execution."""
    agent_name = tool_context.agent_name
    tool_name = tool.name

    if not isinstance(tool_response, str):
        await tool_context.save_artifact(
            "Imagen", types.Part(text=tool_response.content[0].text)
        )

    print("[Callback] Passing original tool response through.")
    # Return None to use the original tool_response
    return None

tool_response.content[0].textは以下のようなテキストが返ってきます。

Generated 1 image(s) (image sizes are on GCS) using model imagen-3.0-generate-002 for prompt "A huge stone slab covered with countless numerical data and complex statistical tables blocks the way in an ancient temple". This took about 9s. Images saved to GCS: gs://{PATH}/sample_0.png. HTTPS URLs: https://storage.mtls.cloud.google.com/{PATH}/sample_0.png. Image data is not included in this MCP response because a GCS URI or local output directory was specified.

モデル応答後のコールバック

LLM から応答を受信した後に起動する処理になっています。
ここでは、Tool 使用後のコールバックでアーティファクトに入れたデータを取得して、加工をした後にレスポンスとして返しています。
Imagen MCP からのレスポンスが、Cloud Storage の URL や Path が含まれたテキストとなっています。
今回は、Streamlit 上で画像を URL から表示するためにこのような処理を入れています。

async def callback_load_artifact(
    callback_context: CallbackContext, llm_response: LlmResponse
) -> LlmResponse:
    try:
        if not (llm_response.content and llm_response.content.parts):
            return llm_response

        parts_new = []
        for part in copy.deepcopy(llm_response.content.parts):
            parts_new.append(part)
            if not part.text:
                continue

            image_artifact = await callback_context.load_artifact(filename="Imagen")
            if not image_artifact:
                continue

            urls = re.findall(r"https?://\S+", image_artifact.text)[0][:-1]
            urls = urls.replace(".mtls", "")
            paths = re.findall(r"gs://\S+", image_artifact.text)

            image = urls + "\n" + paths[0][:-1]

            parts_new.append(Part.from_text(text=image))

        llm_response_new = copy.deepcopy(llm_response)
        llm_response_new.content.parts = parts_new
        return llm_response_new

    except Exception as e:
        logging.error(e)
        return llm_response

ルートエージェントの定義

上記のものをルートエージェントとして定義します。

root_agent = LlmAgent(
    name="general_agent_demo",
    model=MODEL,
    planner=BuiltInPlanner(
        thinking_config=types.ThinkingConfig(
            thinking_budget=0,
        )
    ),
    description=(
        "エルドラド探検隊のメインコーディネーターです。"
        "伝説の古代都市「エルドラド」での宝探し体験を提供します。"
        "3人の個性的な専門家(データ博士、セキュリティ隊長、クリエイター)を統括し、"
        "新人隊員(ユーザー)と協力して「叡智のクリスタル」の発見を目指します。"
        "論理的思考、戦略的計画、創造性の価値を"
        "エンターテイメント性豊かにデモンストレーションします。"
    ),
    instruction=GENERAL_ELDORADO_PROMPT,
    tools=[
        AgentTool(agent=analyst_agent),
        AgentTool(agent=strategist_agent),
        AgentTool(agent=creator_agent),
        MCPToolset(
            connection_params=StreamableHTTPConnectionParams(
                url=MCP_TOOLSET_URL,
                timeout=20.0,
                sse_read_timeout=300.0,
                terminate_on_close=False,
            ),
            errlog=None,
        ),
        load_artifacts,
    ],
    after_model_callback=callback_load_artifact,
    after_tool_callback=after_tool_modifier,
)

Vertex AI Agent Engine へのデプロイ

ADK で定義したエージェントを Vertex AI Agent Engine へデプロイします。
デプロイ方法はドキュメントを参考。
デプロイが完了すると、Agent Engine の ID が発行されるので、この ID を使用してエージェントと会話することが可能になります。

デモの画面

最初にコースを選択します。
今回のデモでは、2つのコースを用意しました。
大きな流れは両コース同じとなっています。

  • Google Cloud コース:Google Cloud のサービスを少し知っている必要がある
  • 一般コース:専門知識なしで大丈夫

本記事では一般コースで進んでいきます。

コースを選択すると、探検隊に属している隊員(エージェント)の紹介が表示されます。
ここで各エージェントの得意領域を確認しておきます。

探検を開始すると、最初の試練に直面します。
このような困難な場合、どのエージェントに依頼をして解決するかを選択しています。

各試練毎に Imagen MCP が使用されて、場面にあった画像が生成され表示されます。

選択したエージェントの回答結果も確認でき、ヒントなども教えてくれます。

正解すると、次の試練に進むことができます。
お宝に辿り着けるように、各試練毎に適切なエージェントを選択していきます。



各試練で適切なエージェントを選択できないと、探検失敗となる仕様にもしています。

おわりに

今回のデモの作成を通して、Agent Development Kit の一般的な使い方を知ることができました。
各エージェントに役割を持たすinstructionの重要性を感じました。
ここの記載が曖昧になっていると、エージェントの回答も期待するものにならなかったです。

Agent Development Kit には、まだ様々な機能があり全ては理解できていないので、フル活用できるようにキャッチアップしていきたいです!