エージェントエンジン(Gemini Enterprise Agent Platform)
agent-engine機能により、ADK-Rustエージェントを、カスタムコンテナReasoningEngineとして Gemini
Enterprise Agent Platform から操作できるようになります。serve_agent_engineを実行するコンテナは、reasoningEngines.query、
reasoningEngines.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_method | API モード | 動作 |
|---|---|---|
create_session、async_create_session | "" / async | セッションを作成(呼び出し元が任意に選択した ID と初期状態) |
get_session、async_get_session | "" / async | イベントを含むセッションを取得 |
list_sessions, async_list_sessions | "" / async | ユーザーのセッションを一覧表示する |
delete_session, async_delete_session | "" / async | セッションを削除する |
stream_query, async_stream_query | stream / async_stream | エージェントを実行する。不在の場合、セッションは自動的に作成される |
streaming_agent_run_with_events | async_stream | AgentRunRequest JSON 文字列からエージェントを実行する(コンソールの Playground パス) |
async_add_session_to_memory | async | セッションのイベントを設定されたメモリサービスに抽出 |
async_search_memory | async | 設定されたメモリサービスを検索 |
register_operations | "" | このテーブルをホストに公開 |
不明なクラスメソッドは、problem-JSON本体を伴う400を返します。メモリサービスが設定されるまで、メモリメソッドはUnsupportedエラー(501)を返します。
注記:
reasoningEngines:asyncQuery(永続クエリジョブ)は登録されません。この機能はエンジン作成時に宣言する必要があり、作成後に追加することはできません。また、adk-pythonのAdkAppでも登録されません。
管理対象バックエンド
ゼロ設定のデフォルトではセッションをメモリ内に保持します。これはクエリへの応答には十分ですが、コンテナを再起動すると会話は保持されません。デプロイされたエンジンでは、AgentEngineOptionsを通じて管理対象バックエンドを設定します。
管理対象セッション(Vertex AI Sessions)
vertex-session機能を使用すると、VertexAiSessionConfig::from_env()は、デプロイされたコンテナ内でプラットフォームが設定する変数(GOOGLE_CLOUD_PROJECT、GOOGLE_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 が存在し、セッションサービスがインメモリのデフォルトである場合、エントリポイントは警告をログに記録します。デプロイされたエンジンでは、管理されたセッションを使用してください。