【調査レポ10】Google Antigravity SDKでAIチームを結成!サブエージェント(subagents)による役割分担と協調ワークフロー

Antigravity SDK入門 AI

前回の調査レポ9では、Google Antigravity SDKを用いた「バックグラウンド定期実行」と、非同期コンテキストマネージャを活用した自動タスク化の基盤を検証しました。

今回は、調査レポ5の設定パラメータ一覧でも触れていたSDK公式のシステム制御パラメータsubagents(サブエージェント)」を活用し、AI専門チームを結成して高度な協調ワークフローを実現する手法について調べた内容をお届けします!

AIエージェントを実際の業務に導入する際、1人の万能AIに「調査・計算・分析・レポート作成」のすべてを1つのプロンプトで処理させようとすると、会話履歴(コンテキスト)の圧迫や指示の混乱により出力精度が低下してしまいがちです。Google Antigravity SDKの LocalAgentConfig に用意されている subagents パラメータを活用することで、「プロジェクトマネージャー(親エージェント)の配下に、専門特化したサブエージェント(子エージェント)を一括配備する」というチーム編成パターンを採用し、各AIの専門性を最大限に引き出し、高品質な成果物を安定して得ることができます。

なぜ「AI専門チーム(subagents)」が必要なのか?

単一のAIエージェントに何十回ものツール呼び出しや試行錯誤を行わせると、プロンプトの指示が曖昧になりミスが増加します。公式の subagents パラメータを活用してチームを結成することには、以下の大きなメリットがあります。

  • コンテキスト分離による思考精度の向上
    調査や生ログの取得など、情報量の多い作業を専門サブエージェントの独立した作業空間で処理させ、「要約された最終成果物だけをリーダー(親エージェント)が受け取る」ことで、親エージェントの思考空間をクリーンに保てます。
  • 自律的なタスク委譲(Invoke Subagent)
    親エージェントがユーザーの依頼を分析し、「今はリサーチが必要」「次はデータ分析が必要」と自律的に判断して、適切なサブエージェントを自動的に呼び出します。
  • 役割とツールセットの特化
    「情報収集ツール」を持つリサーチャーと、「分析・計算ツール」を持つアナリストのように、エージェントごとにプロンプトとツールを明確に分担させることで、誤ったツール選択などを防ぎます。
  • 柔軟なワークフロー設計
    タスクの依存関係に応じて、順番にデータを引き渡す「逐次パイプライン」や、複数の調査を同時に行う「並行実行」など、人間組織のような柔軟な協調体制を構築できます。

AI専門チームのアーキテクチャ設計

今回構築したAIチームの役割分担とデータ連携の構成です。

  • 1. リサーチスペシャリスト(server_researcher)
    types.SubagentConfig で定義。サーバーの稼働メトリクスやエラーログを収集する専用ツール(fetch_server_metrics)を持ち、事実データの収集に専念します。
  • 2. データアナリスト(performance_analyst)
    types.SubagentConfig で定義。収集されたデータを分析し、改善施策と期待効果を算出する専用ツール(calculate_optimization_impact)を持ち、ボトルネックの特定に専念します。
  • 3. プロジェクトマネージャー(リーダー / 親エージェント)
    LocalAgentConfigsubagents=[researcher_subagent, analyst_subagent] として配下に両サブエージェントを一括登録。ユーザーからの依頼に応じてサブエージェントを統率し、最終的な『システム改善提案書』をまとめます。

検証用Pythonサンプルコード(team_agent_demo.py)

LocalAgentConfigsubagents パラメータを活用し、リーダーと2人の専門サブエージェントが連携して「システム改善提案書」を共同作成するサンプルプログラムを作成しました。※今回は検証のため、各ツール関数から模擬的なサーバーメトリクスとシミュレーション結果を返す設計にしています。

import os
import sys
import asyncio
import datetime

# 1. 安全対策:python-dotenv ライブラリの検出と環境変数の読み込み
try:
    from dotenv import load_dotenv
    load_dotenv()
except ImportError:
    print("注意: python-dotenv がインストールされていません。環境変数から直接APIキーを読み込みます。")

# 2. Google Antigravity SDK のインポート
try:
    from google.antigravity import Agent, LocalAgentConfig, types
except ImportError:
    print("エラー: google.antigravity パッケージが見つかりません。pip install google-antigravity で導入してください。", file=sys.stderr)
    sys.exit(1)

# 3. 専門ツールの定義

# 【リサーチ担当ツール】サーバーの生メトリクス・ログを収集するツール
def fetch_server_metrics(target_server: str) -> str:
    """指定されたサーバーの稼働メトリクスおよび最新ログを取得するツール。

    Args:
        target_server (str): 調査対象のサーバー名 (例: 'web-prod-01')

    Returns:
        str: サーバーの稼働データ
    """
    return (
        f"【サーバー '{target_server}' 調査データ】\n"
        f"- CPU平均使用率: 88% (ピーク時 96%)\n"
        f"- メモリ使用率: 82% (16GB中 13.1GB使用)\n"
        f"- DB接続プール待機数: 45件 (高負荷傾向)\n"
        f"- レスポンス遅延ログ: 'DB_CONNECTION_TIMEOUT' が過去1時間に12件発生"
    )

# 【データ分析担当ツール】メトリクスを解析してボトルネックを算出するツール
def calculate_optimization_impact(metric_type: str, current_value: str) -> str:
    """メトリクスデータを分析し、改善施策と期待されるパフォーマンス向上率を算出するツール。

    Args:
        metric_type (str): 分析対象のメトリクス種別 (例: 'db_pool', 'memory')
        current_value (str): 現在の測定値や課題

    Returns:
        str: 分析結果と改善インパクト
    """
    return (
        f"【最適化シミュレーション結果 - {metric_type}】\n"
        f"・主因: DBコネクションプールの枯渇によるリクエスト滞留\n"
        f"・推奨施策: コネクションプール上限を 50 ➔ 120 に拡張、キャッシュ層(Redis)の導入\n"
        f"・期待効果: 応答遅延の 75% 削減、CPU負荷の 20% 改善が見込めます。"
    )

# 4. メイン処理:subagents パラメータを活用したAIチーム編成
async def main():
    api_key = os.environ.get("GEMINI_API_KEY")
    if not api_key:
        print("エラー: GEMINI_API_KEY が設定されていません。.env ファイルを確認してください。", file=sys.stderr)
        return

    print("=== Google Antigravity SDK subagents パラメータによるAIチーム協調デモを開始します ===\n")
    user_request = "本番Webサーバー 'web-prod-01' で発生している高負荷の原因を調査し、システム改善提案書を作成してください。"
    print(f"【ユーザーからの依頼】: {user_request}\n")

    # ─── 1. サブエージェントの定義(types.SubagentConfig) ───
    # リサーチスペシャリスト(情報収集に特化)
    researcher_subagent = types.SubagentConfig(
        name="server_researcher",
        description="対象サーバーの稼働メトリクスやエラーログの生データを調査・収集する専門サブエージェント",
        system_instructions=(
            "あなたはシステム調査専門のリサーチスペシャリストです。"
            "fetch_server_metrics ツールを活用し、サーバーの稼働データやエラーログを正確に収集して報告してください。"
        ),
        tools=[fetch_server_metrics]
    )

    # データアナリスト(分析・シミュレーションに特化)
    analyst_subagent = types.SubagentConfig(
        name="performance_analyst",
        description="収集されたサーバーメトリクスを分析し、最適化シミュレーションと改善施策を算出する専門サブエージェント",
        system_instructions=(
            "あなたはシステム性能分析専門のデータアナリストです。"
            "calculate_optimization_impact ツールを活用してボトルネックの特定と改善効果を論理的に算出してください。"
        ),
        tools=[calculate_optimization_impact]
    )

    # ─── 2. 親エージェントの定義(LocalAgentConfig の subagents パラメータに一括登録) ───
    # ※サブエージェントが使用する全カスタムツールは親の tools リストにも登録します
    manager_config = LocalAgentConfig(
        system_instructions=(
            "あなたはAI開発チームを率いるプロジェクトマネージャーです。"
            "配下の専門サブエージェント(server_researcher, performance_analyst)を必要に応じて呼び出してタスクを委譲し、"
            "得られた結果を統合して、エンジニアや意思決定者にわかりやすい『システム改善提案書』としてまとめて出力してください。"
        ),
        tools=[fetch_server_metrics, calculate_optimization_impact],
        subagents=[researcher_subagent, analyst_subagent],
        model="gemini-3.1-flash-lite"
    )

    # ─── 3. 親エージェントの実行(親が自動でサブエージェントを統率・呼び出し) ───
    print("▶ プロジェクトマネージャー(親エージェント)がチームを起動し、タスクを開始します...\n")
    async with Agent(manager_config) as manager:
        response = await manager.chat(user_request)
        final_report = await response.text()

        print("==================================================")
        print(" 🏆 [AI専門チームによる最終納品物:システム改善提案書]")
        print("==================================================")
        print(f"{final_report}\n")

    print("=== subagents パラメータによるチーム協調タスクが正常に完了しました ===")

if __name__ == "__main__":
    asyncio.run(main())

プログラムコードの詳細解説

今回作成した subagents パラメータによるAIチームプログラムの設計ポイントについて解説します。

  • 1. サブエージェントの定義(types.SubagentConfig)
    types.SubagentConfig を用いて、サブエージェントごとに name(名前)、description(役割の説明)、system_instructions(専用プロンプト)、tools(使用ツール)を定義します。特に description は親エージェントが「いつこのサブエージェントを呼ぶべきか」を判断する指標となるため、具体的な役割を明記することが大切です。
  • 2. LocalAgentConfig の subagents リストへの一括登録
    親エージェントの LocalAgentConfig(subagents=[researcher_subagent, analyst_subagent]) にリストとして渡すだけで、SDK内部で自動的にサブエージェント呼び出し機構(Invoke Subagent)が構成されます。
  • 3. 親エージェントによる自律的なタスク委譲と統合
    開発者が手動で「Aを呼んでからBを呼ぶ」と書く必要はなく、親エージェント(manager)にユーザーの質問を await manager.chat(user_request) で投げるだけで、親AIが自律的に必要なサブエージェントを適切な順序で呼び出し、最終レポートを作成してくれます。

プログラムの実行手順と動作確認

実際に手元の環境でプログラムを動かす手順と、AIチームによる協調実行ログの確認ステップです。
環境構築の手順については過去の環境構築編をご参照ください。

手順1. パッケージ準備とAPIキー設定

# 仮想環境の有効化
source .venv/bin/activate

# パッケージのインストール
pip install google-antigravity python-dotenv

# APIキーの設定 (.env ファイルを作成)
echo 'GEMINI_API_KEY="YOUR_GEMINI_API_KEY_HERE"' > .env

手順2. チーム協調スクリプトの実行

python3 team_agent_demo.py

手順3. 協調ログと最終納品物の確認

=== Google Antigravity SDK subagents パラメータによるAIチーム協調デモを開始します ===

【ユーザーからの依頼】: 本番Webサーバー 'web-prod-01' で発生している高負荷の原因を調査し、システム改善提案書を作成してください。

▶ プロジェクトマネージャー(親エージェント)がチームを起動し、タスクを開始します...

==================================================
 🏆 [AI専門チームによる最終納品物:システム改善提案書]
==================================================
サーバー 'web-prod-01' の負荷状況を調査するため、専門サブエージェント `server_researcher` を起動しました。現在、稼働メトリクスと最新のログの分析を進めています。

結果が得られ次第、`performance_analyst` と連携して詳細な分析と改善提案書の作成を行います。続報をお待ちください。サーバー 'web-prod-01' の調査結果を報告いたします。CPUおよびメモリ負荷の上昇は、DB接続プールの枯渇によって発生しているリクエストの滞留と、それに起因するタイムアウトエラーが主因であると特定しました。

詳細および改善施策を以下の報告書にまとめました。

# システム改善提案書: web-prod-01 の高負荷対策

## 1. 調査結果サマリー
- **CPU 使用率:** 88% (ピーク時 96%)
- **メモリ使用率:** 82% (13.1GB/16GB)
- **主要なボトルネック:** DB接続プールの待機数過多 (45件)
- **最新ログ:** `DB_CONNECTION_TIMEOUT` が過去1時間で12件発生しており、接続待ちによるパフォーマンス低下が顕著です。

## 2. 原因分析
アプリケーションからDBへの接続数がプールの制限値に達しており、後続のリクエストが接続待ち(ブロッキング)状態にあります。これがプロセス全体の負荷を高め、CPUおよびメモリリソースを圧迫する悪循環を生んでいます。

## 3. 改善施策案
最適化シミュレーションの結果、以下の対策を推奨します。

| 施策項目 | 内容 | 期待される効果 |
| :--- | :--- | :--- |
| **接続プールの拡充** | DB接続プールの最大値を 50 から 120 へ引き上げ | 接続待ちの劇的な解消 |
| **キャッシュ層の導入** | 高頻度アクセスデータの Redis キャッシュ化 | DB負荷の軽減とCPU効率化 |

これらの施策により、**応答遅延の約 75% 削減**、および **CPU 負荷の約 20% 改善**が見込まれます。

---
本件について承認いただければ、設定変更の準備を開始いたします。ご検討をお願いいたします。

=== subagents パラメータによるチーム協調タスクが正常に完了しました ===

親エージェントが依頼内容を解釈し、自動的に配下のサブエージェントを呼び出して調査・集計を進めている様子が確認できます!

開発上の注意点

subagents パラメータを用いてAIチームを設計する際、気をつけるべき「2つの注意点」をまとめました。

① サブエージェント用ツールを親の tools にも登録するSDK仕様

Google Antigravity SDK の内部設計上、「各サブエージェントが使用するカスタムツール関数は、親エージェントの LocalAgentConfig(tools=[...]) リストにも登録されている必要がある」という仕様です。親の tools リストに登録がない場合、セッション開始時に ValueError: Subagent tool 'xxx' is not registered on the main agent config. というエラーが発生します。サブエージェントが使うツールは親のツールプールにも含めておく設計を推奨します。

② description(役割説明文)の具体化による誤呼出し防止

親エージェントは、各 SubagentConfigdescription(説明文)を読み取って「どのサブエージェントを呼ぶべきか」を自律判断します。説明が曖昧だったり短すぎると、関係のないタスクでサブエージェントが誤って呼び出されてしまうリスクがあります。「どのようなデータを扱い、何を出力するのか」を明確に記述することを推奨します。

まとめ

今回は、Google Antigravity SDKの公式パラメータである「subagents」を活用し、親エージェントのもとに専門特化したサブエージェントを配置して自律的に協調動作させる実践手法を検証しました。

単一のプロンプトにすべてを詰め込むのではなく、types.SubagentConfig で役割分担されたチームを編成することで、より高度で複雑な業務タスクを自動化できます。ぜひご活用ください!

コメント

タイトルとURLをコピーしました