ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-04-19上級

Antigravity AIエージェント設計:マルチモーダル対応の本番実装パターン

Google Antigravity(Gemma 4)を使ったマルチモーダルAIエージェントの設計・実装を解説。画像・テキスト統合処理、Function Calling、Tool Use、本番環境での状態管理とエラーハンドリングまで網羅します。

antigravity435gemma-420agents90multimodal6function-calling5production59python26

プレミアム記事

はじめて画像入力つきのエージェントを本番に出した日のことを、今でも覚えています。テキストだけのときは想定内で動いていたものが、写真を一枚渡した途端に「見えているはずのもの」を取り違える。その戸惑いから、私のマルチモーダルエージェント設計は始まりました。

Antigravity AI(Google の Gemma 4 ベースのエージェント基盤)を使ったマルチモーダルエージェントは、「テキストだけ」のエージェントとは別次元の可能性があります。画像を理解して行動を起こす、スクリーンショットを見てUIを操作する、文書の図表を解析してレポートを生成する——これらがすべてひとつのエージェントシステムで実現できます。

ただし、マルチモーダルとエージェント機能を組み合わせると、実装の複雑さが一段上がります。ここではAntigravity API を使ったマルチモーダルエージェントの設計と本番実装を、動くコードと共に解説します。

Antigravity APIのマルチモーダル入力の基本

まず、Antigravity API でテキストと画像を組み合わせた入力を処理する基本的な方法を確認します。

import google.generativeai as genai
from PIL import Image
import requests
from io import BytesIO
import base64
 
genai.configure(api_key="YOUR_ANTIGRAVITY_API_KEY")
 
model = genai.GenerativeModel("gemini-2.5-pro-preview-05-06")
 
def load_image_from_url(url: str) -> Image.Image:
    """URLから画像を読み込む"""
    response = requests.get(url, timeout=10)
    return Image.open(BytesIO(response.content))
 
def load_image_from_file(path: str) -> Image.Image:
    """ファイルから画像を読み込む"""
    return Image.open(path)
 
def analyze_image(image: Image.Image, prompt: str) -> str:
    """画像とテキストを組み合わせた分析"""
    response = model.generate_content([prompt, image])
    return response.text
 
# 使用例:商品画像の説明生成
product_image = load_image_from_file("product.jpg")
description = analyze_image(
    product_image,
    "この商品の特徴を3つの箇条書きで説明してください。EC サイトの商品説明として使えるよう、ターゲット顧客を意識した表現にしてください。"
)
print(description)

Function Calling(ツール使用)の実装

Antigravity API のエージェントが「考えて行動する」ために不可欠なのが Function Calling です。モデルが外部ツール(API・データベース・計算処理)を自律的に呼び出せるようにする機能です。

import json
from typing import Any, Callable
 
# ツール定義(モデルが利用できる外部機能を定義する)
tools = [
    {
        "function_declarations": [
            {
                "name": "search_product_database",
                "description": "商品データベースを検索する。商品名・カテゴリ・価格帯で絞り込める。",
                "parameters": {
                    "type": "OBJECT",
                    "properties": {
                        "query": {
                            "type": "STRING",
                            "description": "検索キーワード"
                        },
                        "category": {
                            "type": "STRING",
                            "description": "商品カテゴリ(electronics/clothing/food)",
                            "enum": ["electronics", "clothing", "food", "all"]
                        },
                        "max_price": {
                            "type": "NUMBER",
                            "description": "最大価格(円)"
                        }
                    },
                    "required": ["query"]
                }
            },
            {
                "name": "get_product_image",
                "description": "商品IDから商品画像URLを取得する",
                "parameters": {
                    "type": "OBJECT",
                    "properties": {
                        "product_id": {
                            "type": "STRING",
                            "description": "商品ID"
                        }
                    },
                    "required": ["product_id"]
                }
            },
            {
                "name": "add_to_cart",
                "description": "カートに商品を追加する",
                "parameters": {
                    "type": "OBJECT",
                    "properties": {
                        "product_id": {"type": "STRING"},
                        "quantity": {"type": "INTEGER", "description": "数量(デフォルト:1)"}
                    },
                    "required": ["product_id"]
                }
            }
        ]
    }
]
 
# ツールの実際の実装(モックデータ)
def search_product_database(query: str, category: str = "all", max_price: float = None) -> dict:
    """商品検索の実装"""
    products = [
        {"id": "P001", "name": "ワイヤレスイヤホン Pro", "category": "electronics", "price": 12800},
        {"id": "P002", "name": "ノイズキャンセリングヘッドホン", "category": "electronics", "price": 24000},
        {"id": "P003", "name": "Bluetoothスピーカー", "category": "electronics", "price": 6500},
    ]
    
    results = [
        p for p in products
        if query.lower() in p["name"].lower()
        and (category == "all" or p["category"] == category)
        and (max_price is None or p["price"] <= max_price)
    ]
    return {"products": results, "total": len(results)}
 
def get_product_image(product_id: str) -> dict:
    """商品画像URLの取得"""
    image_map = {
        "P001": "https://example.com/images/P001.jpg",
        "P002": "https://example.com/images/P002.jpg",
    }
    return {"image_url": image_map.get(product_id, ""), "product_id": product_id}
 
def add_to_cart(product_id: str, quantity: int = 1) -> dict:
    """カートへの追加"""
    return {"success": True, "product_id": product_id, "quantity": quantity, "cart_total": quantity}
 
# ツール名とその実装をマッピング
tool_implementations: dict[str, Callable] = {
    "search_product_database": search_product_database,
    "get_product_image": get_product_image,
    "add_to_cart": add_to_cart,
}
 
def execute_tool(tool_name: str, tool_args: dict) -> Any:
    """ツールを実行して結果を返す"""
    impl = tool_implementations.get(tool_name)
    if not impl:
        return {"error": f"Unknown tool: {tool_name}"}
    
    try:
        return impl(**tool_args)
    except Exception as e:
        return {"error": str(e)}

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
画像とFunction Callingを組み合わせたマルチモーダルエージェントの完全な実装コード
v2.2.1 の統一パーミッション体系を踏まえた「何を委ね、何を人が握るか」の権限設計
コスト推定・観測ログ・限定ロールアウトまで含めた本番運用の設計判断
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

連携・プラグイン2026-04-17
Google Antigravity Python SDK 本番実装マスターガイド — マルチモーダル・エージェント・RAGパイプラインの設計から運用まで
Google Antigravity Python SDKを本番環境で使い倒すための完全ガイド。マルチモーダル入力・ツール呼び出し・RAGパイプライン・ストリーミング・コスト最適化・Cloud Runデプロイまで、実動作するコード付きで解説します。
Agents & Manager2026-07-05
エージェント開発スタックの『既知の正常』を1枚のロックファイルで守る — 可動部が同時に動く時代の変更予算設計
IDEビルド・CLI・モデル・依存が同時に動くと、回帰の原因が特定できなくなります。既知の正常を1枚のロックファイルに固定し、一度に動かす軸を絞る変更予算の設計を、実装コードと運用ログで整理しました。
Agents & Manager2026-05-29
Antigravity 長時間実行エージェントの監視設計 — watchdog と段階的リカバリ
AdMob 収益最適化を 8 週間バックグラウンドエージェントに任せて見えた、長時間タスクが静かに停止する 3 つの故障モード。watchdog タイマーと段階的リカバリの実装メモを残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →