【アップデート】Gemini Enterprise Agent Platform でエージェントのリビジョン管理とトラフィック分割が可能になりました

【アップデート】Gemini Enterprise Agent Platform でエージェントのリビジョン管理とトラフィック分割が可能になりました

2026.05.18

はじめに

こんにちは。
クラウド事業本部コンサルティング部の渡邉です。

2026年5月15日、Gemini Enterprise Agent Platform でエージェントのリビジョン管理とトラフィック分割機能が Public Preview として利用可能になりました。

https://docs.cloud.google.com/gemini-enterprise-agent-platform/release-notes#May_15_2026

https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/runtime/manage-revisions-and-traffic?hl=ja

AIエージェントを本番環境で運用していると、Webアプリケーションと同様に「新バージョンのエージェントを安全にリリースしたい」という要望は必ず出てくると思います。Web アプリケーション開発ではカナリアデプロイや Blue/Green デプロイが一般的ですが、AIエージェントにはこうした手法が整備されていませんでした。今回のアップデートにより、エージェントの複数バージョンを同時に稼働させ、トラフィックを段階的に移行できるようになりました。

本記事では、リビジョン管理とトラフィック分割機能の概要と、実際に試してみた手順をご紹介します。

Gemini Enterprise Agent Platform(旧 Vertex AI)とは

Gemini Enterprise Agent Platform は、2026年4月22日のリブランドにより「Vertex AI」から改称された統合プラットフォームです。AIエージェントのデプロイ・スケーリング・管理を担う基盤として、エージェント本体の実行環境である Agent Runtime(旧 Vertex AI Agent Engine)を提供します。

なお、APIエンドポイントやリソース名(reasoningEngines)は変更されていません。

リビジョン管理とトラフィック分割の概要

エージェントリビジョンとは

リビジョンは、エージェントのイミュータブルなスナップショットです。以下のいずれかのタイミングで自動的に新しいリビジョンが作成されます。

  • エージェントを新規作成したとき
  • バージョン管理フィールドを更新したとき
リビジョン状態 説明
Active クエリ可能な状態
Deprecated クエリ不可(無効化済み)

バージョン管理フィールド(更新すると新リビジョンが生成される)

カテゴリ フィールド例
PackageSpec pickleObjectGcsUri, dependencyFilesGcsUri, pythonVersion
DeploymentSpec env[], minInstances, maxInstances, resourceLimits
その他 classMethods[], agentFramework, agentCard[]

バージョン管理外のフィールドを更新した場合は新リビジョンは生成されず、すべてのリビジョンに即時反映されます。

トラフィック分割の仕組み

トラフィック分割は、ルート reasoningEngine リソースへのクエリに適用されます。設定方法は2種類です。

分割方式 説明
trafficSplitManual 各リビジョンへのトラフィック割合を整数パーセントで指定(合計100%)
trafficSplitAlwaysLatest 最新リビジョンへ自動的に100%転送(デフォルト動作)

代表的なユースケース

パターン 旧リビジョン 新リビジョン 用途
カナリアリリース 90% 10% 小規模ユーザーで新バージョン検証
Blue/Green 0% 100% 切り替え完了後の完全移行
ロールバック 100% 0% 問題発生時の旧バージョン復帰

実際に試してみる

前提条件

  • Google Cloud プロジェクト
  • Gemini Enterprise Agent Platform(Agent Runtime)が利用可能なリージョン(例: asia-northeast1
  • gcloud CLI・Python 3.9 以上がセットアップ済み
  • 以下の IAM ロールが付与済み
    • roles/aiplatform.user(Agent Platform の使用)
    • roles/storage.admin(アーティファクトのステージング)
  • Cloud Storage バケット(gs://STAGING_BUCKET)を作成済み

サンプルエージェントをデプロイする

まずはトラフィック分割の動作確認に使うシンプルなエージェントを Agent Platform にデプロイします。ここでは、公式クイックスタートと同じ 為替レートエージェント(ADK) を使用します。

SDK のインストールと認証

pip install --upgrade "google-cloud-aiplatform[agent_engines,adk]>=1.112" requests
gcloud auth application-default login

エージェントのコード(ローカルテスト)

import vertexai
from vertexai import agent_engines
from google.adk.agents import Agent

vertexai.init(
    project="PROJECT_ID",
    location="asia-northeast1",
)

def get_exchange_rate(
    currency_from: str = "USD",
    currency_to: str = "EUR",
    currency_date: str = "latest",
):
    """Retrieves the exchange rate between two currencies on a specified date."""
    import requests
    response = requests.get(
        f"https://api.frankfurter.app/{currency_date}",
        params={"from": currency_from, "to": currency_to},
    )
    return response.json()

agent = Agent(
    model="gemini-2.5-flash",
    name="currency_exchange_agent",
    tools=[get_exchange_rate],
)
app = agent_engines.AdkApp(agent=agent)

# ローカルテスト
import asyncio
async def test_local():
    async for event in app.async_stream_query(
        user_id="test-user",
        message="今日の USD から SEK への為替レートは?",
    ):
        print(event)

asyncio.run(test_local())

実行結果(イベントストリーム)

# イベント1: エージェントがツール呼び出しを決定
{'model_version': 'gemini-2.5-flash',
 'content': {'parts': [{'function_call': {
     'name': 'get_exchange_rate',
     'args': {'currency_from': 'USD', 'currency_to': 'SEK', 'currency_date': 'latest'}
 }}], 'role': 'model'},
 'author': 'currency_exchange_agent', ...}

# イベント2: ツール実行結果
{'content': {'parts': [{'function_response': {
     'name': 'get_exchange_rate',
     'response': {'amount': 1.0, 'base': 'USD', 'date': '2026-05-15', 'rates': {'SEK': 9.4444}}
 }}], 'role': 'user'},
 'author': 'currency_exchange_agent', ...}

# イベント3: 最終回答
{'model_version': 'gemini-2.5-flash',
 'content': {'parts': [{'text': '2026年5月15日のUSDからSEKへの為替レートは9.4444です。'}], 'role': 'model'},
 'author': 'currency_exchange_agent', ...}

Agent Platform へのデプロイ

import vertexai
from vertexai import types

client = vertexai.Client(
    project="PROJECT_ID",
    location="asia-northeast1",
)

remote_agent = client.agent_engines.create(
    agent=app,
    config={
        "display_name": "currency-exchange-agent",
        "requirements": ["google-cloud-aiplatform[agent_engines,adk]"],
        "staging_bucket": "gs://STAGING_BUCKET",
        "identity_type": types.IdentityType.AGENT_IDENTITY,
    },
)

print(remote_agent.api_resource.name)
# → projects/PROJECT_ID/locations/asia-northeast1/reasoningEngines/RESOURCE_ID

実行結果:

デプロイ中...
resource_name: projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID

デプロイには数分かかります。完了後、出力されたリソース名の末尾の数値が RESOURCE_ID です。以降のステップではこの値を使用します。

コンソールの「エージェント ランタイムへのデプロイ」画面に currency-exchange-agentが登録されていることを確認できます。

コンソールのエージェント一覧に currency-exchange-agent が登録された状態
エージェント一覧:currency-exchange-agentがデプロイ済み

デプロイ後の動作確認

import asyncio
async def test_remote():
    async for event in remote_agent.async_stream_query(
        user_id="test-user",
        message="今日の USD から SEK への為替レートは?",
    ):
        print(event)

asyncio.run(test_remote())

実行結果

2026-05-15 の USD から SEK への為替レートは 9.4444 です。

コンソールのプレイグラウンドからも同様に動作確認できます。ツール呼び出し(get_exchange_rate)→ レスポンス取得 → 最終回答の各ステップが可視化されます。

プレイグラウンドでクエリ実行。ツール呼び出しと最終回答の流れが確認できる
プレイグラウンド

ステップ1: 既存リビジョンの一覧確認

# リビジョン一覧を取得
curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions"

実行結果(初回デプロイ直後)

{
  "reasoningEngineRuntimeRevisions": [
    {
      "name": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/1",
      "spec": {
        "packageSpec": { ... },
        "agentFramework": "google-adk",
        "identityType": "AGENT_IDENTITY"
      },
      "createTime": "2026-05-18T11:41:21.752444Z"
    }
  ]
}

コンソールの「リビジョン」タブでは、Split mode(常に最新)、Active revisions(1 of 1)、リビジョン1がトラフィック100%を保持していることが確認できます。

初回デプロイ直後のリビジョン画面。Split mode=常に最新、リビジョン1が100%
リビジョンタブ:Split mode=常に最新、Active revisions=1 of 1、リビジョン1が100%

ステップ2: エージェントの更新(新リビジョン作成)

バージョン管理フィールドを更新すると、自動的に新しいリビジョンが作成されます(例: 環境変数の変更)。

# バージョン管理フィールドを更新して新リビジョンを生成(例: env 変更)
curl -X PATCH \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{
    "spec": {
      "deploymentSpec": {
        "env": [{"name": "APP_VERSION", "value": "v2"}]
      }
    }
  }' \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/?update_mask=spec.deployment_spec.env"

実行結果:

{
  "name": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/operations/721476715280334848",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.UpdateReasoningEngineOperationMetadata",
    "genericMetadata": {
      "createTime": "2026-05-18T11:50:48.944948Z",
      "updateTime": "2026-05-18T11:50:48.944948Z"
    }
  }
}

オペレーションの完了(約3分)後、runtimeRevisions に新リビジョン(2)が追加されます。

実行結果(新リビジョン作成後のリビジョン一覧、リビジョン2のみ抜粋)

{
  "reasoningEngineRuntimeRevisions": [
    {
      "name": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/2",
      "spec": {
        "packageSpec": { ... },
        "agentFramework": "google-adk",
        "identityType": "AGENT_IDENTITY"
      },
      "createTime": "2026-05-18T11:54:40.616369Z"
    }
  ]
}

コンソールでは Split mode が引き続き常に最新のため、新しいリビジョン2が自動的に Latest/Primary revision となり 100% のトラフィックを受け取っています(Active revisions: 1 of 2)。ステップ3以降で手動分割に切り替えます。

新リビジョン作成後。Split mode=常に最新のままリビジョン2が自動的に100%へ
リビジョンタブ:Split mode=常に最新、Active revisions=1 of 2、リビジョン2が自動的に100%

ステップ3: カナリアリリース(90:10 でトラフィック分割)

# REVISION_ID_1: 既存リビジョン(90%)、REVISION_ID_2: 新リビジョン(10%)
curl -X PATCH \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{
    "trafficConfig": {
      "trafficSplitManual": {
        "targets": [
          {
            "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/1",
            "percent": 90
          },
          {
            "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/2",
            "percent": 10
          }
        ]
      }
    }
  }' \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID?update_mask=traffic_config"

PATCH の応答はオペレーション ID のみです。オペレーション完了後、GET でエージェントリソースを取得して trafficConfig を確認します。

# trafficConfig を確認
curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps(d.get('trafficConfig', {}), indent=2))"

実行結果

{
  "trafficSplitManual": {
    "targets": [
      {
        "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/1",
        "percent": 90
      },
      {
        "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/2",
        "percent": 10
      }
    ]
  }
}

Split mode が手動に変わり、リビジョン1(90%)とリビジョン2(10%)の2つが Active revisions として並んでいます。Primary revision はリビジョン1(90%)です。

カナリアリリース設定後。Split mode=手動、rev1=90% / rev2=10%
リビジョンタブ:Split mode=手動、Active revisions=2 of 2、リビジョン1=90% / リビジョン2=10%

ステップ4: 新リビジョンへ完全移行

問題がなければ新リビジョンへ100%切り替えます。

curl -X PATCH \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{
    "trafficConfig": {
      "trafficSplitManual": {
        "targets": [
          {
            "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/2",
            "percent": 100
          }
        ]
      }
    }
  }' \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID?update_mask=traffic_config"

オペレーション完了後、同様に GET で確認します。

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps(d.get('trafficConfig', {}), indent=2))"

実行結果

{
  "trafficSplitManual": {
    "targets": [
      {
        "runtimeRevisionName": "projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/2",
        "percent": 100
      }
    ]
  }
}

リビジョン2が Primary revision(100%)となり、リビジョン1はトラフィック0%になりました。Active revisions は 1 of 2 で、リビジョン1の削除ボタンが有効になっています。

完全移行後。rev2=100%、rev1=0%で削除可能な状態
リビジョンタブ:Split mode=手動、リビジョン2=100%。リビジョン1はトラフィック0%で削除可能な状態

ステップ5: 旧リビジョンの削除

不要になったリビジョンは削除します。トラフィックが割り当てられているリビジョンは削除できません。

curl -X DELETE \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://asia-northeast1-aiplatform.googleapis.com/v1beta1/projects/PROJECT_NUMBER/locations/asia-northeast1/reasoningEngines/RESOURCE_ID/runtimeRevisions/1"

実行結果

{
  "name": "projects/PROJECT_NUMBER/locations/asia-northeast1/operations/4527018400408403968",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeleteReasoningEngineRuntimeRevisionOperationMetadata",
    "genericMetadata": {
      "createTime": "2026-05-18T12:14:33.034375Z",
      "updateTime": "2026-05-18T12:14:33.034375Z"
    }
  }
}

削除オペレーション完了後、リビジョン一覧にはリビジョン 2 のみが残ります。Active revisions が 1 of 1 になり、リビジョン2がトラフィック100%を保持したクリーンな状態になりました。

旧リビジョン削除後。Active revisions=1 of 1、リビジョン2のみ残存
リビジョンタブ:Active revisions=1 of 1、リビジョン2のみ残存

まとめ

今回は Gemini Enterprise Agent Platform のリビジョン管理とトラフィック分割機能を実際に試してみました。

機能面では、バージョン管理フィールドを更新するだけで自動的に新リビジョンが作成され、trafficSplitManual でカナリアリリース・Blue/Green デプロイ・ロールバックといった Web アプリと同様の安全なリリース戦略を AIエージェントにも適用できることを確認しました。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部コンサルティング部の渡邉でした!

この記事をシェアする

関連記事