エージェントエンジン(Gemini Enterprise Agent Platform)

agent-engine機能により、ADK-Rustエージェントを、カスタムコンテナReasoningEngineとして Gemini Enterprise Agent Platform から操作できるようになります。serve_agent_engineを実行するコンテナは、reasoningEngines.queryreasoningEngines.streamQuery、コンソールの Playground、およびプラットフォームの SDKsに応答します。これは、同じランタイム契約をadk-pythonのAdkAppが実装しています。

概要

プラットフォームは、2つのコンテナエンドポイントを介してデプロイ済みエンジンを操作します:

エンドポイントモードレスポンス
POST /api/reasoning_engine単項{"output": ...}
POST /api/stream_reasoning_engineストリーミング1 行につき 1 つの JSON オブジェクト(Content-Type: application/json、SSE のフレーミングなし)

どちらもディスパッチエンベロープ {"class_method": "...", "input": {...}} を受け取ります。
エンベロープは snake_case です — プラットフォームは Python のメソッド名に基づいてディスパッチします。
完成済みアプリは、コンテナのヘルスチェック用に GET /health も提供します。

クイックスタート

この機能を有効にします(gemini-agent-platform メタ機能に含まれています)。

[dependencies]
adk-rust = { version = "2.1.0", features = ["minimal", "agent-engine"] }

プラットフォーム全体 — 管理対象セッション、Memory Bank、 Example Store、コード実行サンドボックス、RAG、評価、 Agent Registry と Skill Registry — を使用するエージェントの場合、1 つの機能ですべての統合を利用できます。

[dependencies]
adk-rust = { version = "2.1.0", features = ["minimal", "gemini-agent-platform"] }

serve_agent_engine は、デプロイ可能なエンジンの完全な main です。
0.0.0.0:$PORT(フォールバック 8080)をバインドし、停止されるまで提供を続けます。

use adk_rust::prelude::*;
use adk_server::agent_engine::{AgentEngineOptions, serve_agent_engine};
use std::sync::Arc;

#[tokio::main]
async fn main() -> Result<()> {
    let api_key = std::env::var("GOOGLE_API_KEY")?;
    let model = Arc::new(GeminiModel::new(&api_key, "gemini-3.7-flash")?);

    let agent = LlmAgentBuilder::new("weather_agent")
        .description("Answers weather questions")
        .instruction("You are a helpful weather assistant.")
        .model(model)
        .build()?;

    serve_agent_engine(Arc::new(agent), AgentEngineOptions::new()).await
}

codelab のペイロードで確認します。

curl -s -X POST localhost:8080/api/stream_reasoning_engine \
  -H 'Content-Type: application/json' \
  -d '{"class_method": "async_stream_query", "input": {"user_id": "u", "message": "hi"}}'

各レスポンス行は、JSON としての 1 つの ADK イベントです。

運用

エンジンは、adk-python の AdkApp が宣言する正確な操作セットを登録します。
同期/非同期の名前のペアは同じハンドラーにマッピングされます — この分割は、ワイヤーコントラクトが保持する Python のアーティファクトです。

class_methodAPI モード動作
create_sessionasync_create_session"" / asyncセッションを作成(呼び出し元が任意に選択した ID と初期状態)
get_sessionasync_get_session"" / asyncイベントを含むセッションを取得
list_sessions, async_list_sessions"" / asyncユーザーのセッションを一覧表示する
delete_session, async_delete_session"" / asyncセッションを削除する
stream_query, async_stream_querystream / async_streamエージェントを実行する。不在の場合、セッションは自動的に作成される
streaming_agent_run_with_eventsasync_streamAgentRunRequest JSON 文字列からエージェントを実行する(コンソールの Playground パス)
async_add_session_to_memoryasyncセッションのイベントを設定されたメモリサービスに抽出
async_search_memoryasync設定されたメモリサービスを検索
register_operations""このテーブルをホストに公開

不明なクラスメソッドは、problem-JSON本体を伴う400を返します。メモリサービスが設定されるまで、メモリメソッドはUnsupportedエラー(501)を返します。

注記: reasoningEngines:asyncQuery(永続クエリジョブ)は登録されません。この機能はエンジン作成時に宣言する必要があり、作成後に追加することはできません。また、adk-pythonのAdkAppでも登録されません。

管理対象バックエンド

ゼロ設定のデフォルトではセッションをメモリ内に保持します。これはクエリへの応答には十分ですが、コンテナを再起動すると会話は保持されません。デプロイされたエンジンでは、AgentEngineOptionsを通じて管理対象バックエンドを設定します。

管理対象セッション(Vertex AI Sessions)

vertex-session機能を使用すると、VertexAiSessionConfig::from_env()は、デプロイされたコンテナ内でプラットフォームが設定する変数(GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION、およびGOOGLE_CLOUD_AGENT_ENGINE_ID — 数値のみのエンジンID)を読み取ります。

use adk_server::agent_engine::AgentEngineOptions;
use adk_session::{VertexAiSessionConfig, VertexAiSessionService};
use std::sync::Arc;

fn managed_sessions() -> adk_core::Result<AgentEngineOptions> {
    let config = VertexAiSessionConfig::from_env()?;
    let sessions = Arc::new(VertexAiSessionService::new_with_adc(config)?);
    Ok(AgentEngineOptions::new().with_session_service(sessions))
}

デプロイされたコンテナの外部では、VertexAiSessionConfig::new(project, location).with_reasoning_engine(id)を使用して設定を明示的に構築します。

アーティファクト(Google Cloud Storage)

gcs-artifacts機能を使用すると、GcsArtifactServiceはGemini Enterpriseコンソールが読み取るblobレイアウト(adk-pythonとのバイト単位の同一性)でアーティファクトを保存します。バケットは環境変数またはフラグから取得します。

use adk_artifact::GcsArtifactService;
use adk_server::agent_engine::AgentEngineOptions;
use std::sync::Arc;

fn gcs_artifacts() -> adk_core::Result<AgentEngineOptions> {
    let bucket = std::env::var("ADK_ARTIFACT_BUCKET").unwrap_or_else(|_| "my-bucket".to_string());
    let artifacts = Arc::new(GcsArtifactService::new_with_adc(bucket)?);
    Ok(AgentEngineOptions::new().with_artifact_service(artifacts))
}

アーティファクトサービスは、runner(ツールから利用される保存と読み込み)とdispatch stateの両方に組み込まれます。

メモリ

AgentEngineOptions::with_memory_serviceは任意のadk_memory::MemoryServiceを受け入れ、2つのメモリクラスメソッドを有効にします。プラットフォームのMemory Bankバックエンドは、後続のリリースでvertex-memory機能とともに提供されます。

ServerBuilder統合

既存のADKサーバーは、REST、UI、およびA2Aルートと併せてdispatch surfaceを公開できます。

use adk_server::{ServerBuilder, ServerConfig};

fn build_app(config: ServerConfig) -> axum::Router {
    ServerBuilder::new(config).with_agent_engine(true).build()
}

ディスパッチルートは、構成済みのセッションサービスおよびアーティファクトサービスを備えたローダーのルートエージェントにリクエストを転送します。これらはサーバーの認証ミドルウェアを通過しません。デプロイされたエンジンはプラットフォームによって前段に配置され、コンテナに到達する前に呼び出し元を認証します。これらのエンドポイントを信頼できないネットワークに直接公開しないでください。

CLIからのデプロイ

gcp-deploy機能(cargo install adk-cli --features gcp-deploy)付きでadk-cliをインストールすると、1つのコマンドでプッシュ済みコンテナイメージからエンジンを作成できます。

# 1. Build and push the image
gcloud builds submit --tag us-central1-docker.pkg.dev/PROJECT/agents/my-agent:latest

# 2. Deploy it as a ReasoningEngine
adk-rust deploy agent-engine \
  --image-uri us-central1-docker.pkg.dev/PROJECT/agents/my-agent:latest \
  --project PROJECT \
  --location us-central1 \
  --service-account agent-runner@PROJECT.iam.gserviceaccount.com

オプションのフラグ: --display-name(デフォルトではイメージ名)および CMEK 用の--kms-key。このコマンドは、操作テーブルに記載されたクラスメソッドの完全な契約を宣言し、作成操作を待機して、エンジンのリソース名を出力します。同じクライアントは、adk_deploy::gcp::GcpDeployClient(アンブレラ機能 gcp-deploy)としてプログラムからも利用できます。

環境変数

変数意味
PORTプラットフォームによって割り当てられたサービス提供ポート(フォールバック 8080。無効な値の場合は起動に失敗します)
GOOGLE_CLOUD_PROJECTデプロイメントの GCP プロジェクト
GOOGLE_CLOUD_LOCATIONデプロイメントの GCP ロケーション
GOOGLE_CLOUD_AGENT_ENGINE_IDデプロイされたコンテナ内で設定される、数値のみのエンジン ID

GOOGLE_CLOUD_AGENT_ENGINE_ID が存在し、セッションサービスがインメモリのデフォルトである場合、エントリポイントは警告をログに記録します。デプロイされたエンジンでは、管理されたセッションを使用してください。