Googleの「Agent Development Kit(ADK)」を使って、独自のAIエージェントを構築している方も多いのではないでしょうか?今回は、ADKの開発用UI上で、Geminiの画像生成モデルを使った画像生成が可能かどうかを検証してみました。

初期のシンプルなコードではうまくいかなかった点と、その解決策となる「after_agent_callback」と「アーティファクト」の活用方法を詳しく解説します。

検証環境

本記事の検証は、以下のバージョン環境で行っています。バージョンが異なる場合、挙動が変わる可能性がありますのでご注意ください。

google-adk  1.25.0

初期検証:Google ADKでの画像生成(ダメだった例)

まずは、Google ADKの開発用UIを使って、シンプルなコードで画像生成ができるか検証しました。検証に使用したコードは以下の通りです。Googleが提供する強力なLLMである「Gemini」の画像生成モデルを指定しています。

from google.adk.agents.llm_agent import Agent

root_agent = Agent(
    name="root_agent",
    model="gemini-2.5-flash-image",
    description="画像生成エージェント",
    instruction="ユーザーのリクエストに適した画像を生成して。"
)

このコードを使って、開発用UIから「犬の画像を生成して」とリクエストしてみた結果がこちらです。

チャット上の応答を見ると、「はい、承知いたしました。犬の画像を生成します。」と返ってきており、イベントログを見てもinlineDataとして画像データは生成されているようです。しかし、残念ながら左側サイドナビの表示エリア「Artifacts」には何も出力されず、チャット上にも画像は表示されませんでした。

解決策:after_agent_callbackとartifactの活用

画像生成が行われているにも関わらず表示されない原因は、生成された画像データの「保存」が指定されていないためです。画像生成が起きても保存方法の実装がないため、inlineDataとしてしか出力されない仕様になっているようです。

ADKの開発用UIで画像を表示させるためには、画像生成を行ってもらったエージェントのafter_agent_callbackを利用して、画像を一時的に保存・読み込ませる処理を追加します。

import uuid
from google.adk import types
from google.adk.agents.llm_agent import Agent
from google.adk.sessions import CallbackContext

async def save_image(callback_context: CallbackContext):
    events = callback_context.session.events
    if not events or not (content := getattr(events[-1], 'content', None)):
        return None

    text_parts, inline_parts = [], []
    for p in content.parts:
        (inline_parts if getattr(p, 'inline_data', None) else text_parts).append(p)
    if not inline_parts:
        return None

    try:
        image = inline_parts[0].inline_data
        mime_type = getattr(image, 'mime_type', "image/png") or "image/png"
        file_name = f"gen_{uuid.uuid4().hex}.{mime_type.split('/')[-1]}"

        # 保存と読み込み
        await callback_context.save_artifact(filename=file_name, artifact=types.Part.from_bytes(data=image.data, mime_type=mime_type))
        artifact = await callback_context.load_artifact(filename=file_name)

        return types.Content(
            role="model",
            parts=[*text_parts, types.Part.from_bytes(data=artifact.inline_data.data, mime_type=artifact.inline_data.mime_type)]
        )
    except Exception as e:
        print(f"画像処理エラー: {e}")

    return None

root_agent = Agent(
    name="root_agent",
    model="gemini-2.5-flash-image",
    description="画像生成エージェント",
    instruction="ユーザーのリクエストに適した画像を生成して。",
    after_agent_callback=save_image,
)

ポイントは、save_artifactload_artifactを利用することです。これにより、画像ファイルなどのデータをエージェントのセッション内に「アーティファクト」として保存させたり、読み込ませたりすることができるようになります。

再度開発用UIから「猫の画像を生成して」とリクエストしてみた結果がこちらです。

今度は見事に、左側サイドナビの表示エリア「Artifacts」とチャット上の両方に生成された猫の画像が表示されました!
Artifactsタブ内で保存された画像のファイル名とバージョン情報、ダウンロードボタンがしっかりと表示されるようになっています。

生成された画像の保存場所を確認

生成された画像が実際にどこに保存されているかを確認してみましょう。ADKが動作しているプロジェクトディレクトリ内に自動的に作成される.adkフォルダの中に保存されています。

.adk
└── artifacts
    └── users
        └── user
            └── sessions
                └── 507be308-5a95-4012-b265-e06c54d2c35a
                    └── artifacts
                        └── gen_5a59814816ff42ebbc09fa64d2d22b85.png
                            └── versions
                                └── 0
                                    ├── gen_5a59814816ff42ebbc09fa64d2d22b85.png
                                    └── metadata.json

このように、セッションIDごとに独立したディレクトリが作られ、その中に生成された画像が保存されていることがわかります。

まとめ

開発用UIで表示させたい方も多いかと思うので今回は、Google ADKの開発用UIを使って、Geminiの画像生成モデルを使った画像出力方法を検証しました。

初期のシンプルなコードでは画像が表示されませんでしたが、after_agent_callback内でsave_artifactおよびload_artifactを活用することで、生成されたデータを「アーティファクト」として適切に処理し、開発用UI上に画像を出力することに成功しました。

画像がクラウドに保存されるようにCloud Storageに保存なども可能です。
利用する際はadk webのコマンドにオプションとして--artifact_service_uri gs://を併せて入力することで画像のクラウド保存が可能になります。

Google ADKは、テキストだけでなく画像などの多様なデータを扱える強力なフレームワークです。今回の検証が、皆さんの独自のAIエージェント開発のヒントになれば幸いです。

最後まで読んでいただきありがとうございました。