Moteur d’agent (Gemini Enterprise Agent Platform)

La fonctionnalitĂ© agent-engine permet Ă  un agent ADK-Rust d’ĂȘtre pilotĂ© par la Gemini Enterprise Agent Platform en tant que ReasoningEngine dans un conteneur personnalisĂ©. Un conteneur exĂ©cutant serve_agent_engine rĂ©pond Ă  reasoningEngines.query, reasoningEngines.streamQuery, au Playground de la console et Ă  l’SDKs de la plateforme — le mĂȘme contrat d’exĂ©cution que adk-python's AdkApp implĂ©mente.

Vue d’ensemble

La plateforme pilote un moteur déployé via deux points de terminaison du conteneur :

Point de terminaisonModeRéponse
POST /api/reasoning_engineunaire{"output": ...}
POST /api/stream_reasoning_engineen fluxun objet JSON par ligne (Content-Type: application/json, sans encadrement SSE)

Les deux utilisent l’enveloppe de rĂ©partition {"class_method": "...", "input": {...}}.
L’enveloppe est snake_case — la plateforme effectue la rĂ©partition selon les noms des mĂ©thodes Python.
L’application clĂ© en main expose Ă©galement GET /health pour les vĂ©rifications de santĂ© du conteneur.

Démarrage rapide

Activez la fonctionnalité (elle est incluse dans la méta-fonctionnalité gemini-agent-platform) :

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

Pour un agent qui utilise la plateforme complĂšte — sessions gĂ©rĂ©es, Memory Bank, Example Store, bac Ă  sable d’exĂ©cution de code, RAG, Ă©valuation, ainsi que les registres Agent et Skill — une seule fonctionnalitĂ© fournit toutes les intĂ©grations :

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

serve_agent_engine constitue l’ensemble main d’un moteur dĂ©ployable. Il lie 0.0.0.0:$PORT (8080 de secours) et reste disponible jusqu’à son arrĂȘt :

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
}

Vérifiez avec la charge utile du 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"}}'

Chaque ligne de réponse correspond à un événement ADK tel que JSON.

Opérations

Le moteur enregistre l’ensemble exact d’opĂ©rations que adk-python de AdkApp annonce. Les paires de noms synchrones/asynchrones correspondent au mĂȘme gestionnaire — cette sĂ©paration est un artefact Python que le contrat filaire prĂ©serve.

class_methodMode APIComportement
create_session, async_create_session"" / asyncCrĂ©er une session (ID choisi facultativement par l’appelant et Ă©tat initial)
get_session, async_get_session"" / asyncRécupérer une session avec ses événements
list_sessions, async_list_sessions"" / asyncRĂ©pertorier les sessions d’un utilisateur
delete_session, async_delete_session"" / asyncSupprimer une session
stream_query, async_stream_querystream / async_streamExĂ©cuter l’agent ; la session est créée automatiquement si elle est absente
streaming_agent_run_with_eventsasync_streamExĂ©cuter l’agent Ă  partir d’une chaĂźne AgentRunRequest JSON (chemin Playground de la console)
async_add_session_to_memoryasyncExtraire les Ă©vĂ©nements d’une session vers le service de mĂ©moire configurĂ©
async_search_memoryasyncRechercher dans le service de mémoire configuré
register_operations""Annoncer cette table à l’hîte

Les mĂ©thodes de classe inconnues renvoient 400 avec un corps problem-JSON. Les mĂ©thodes de mĂ©moire renvoient une erreur Unsupported (501) jusqu’à ce qu’un service de mĂ©moire soit configurĂ©.

Remarque : reasoningEngines:asyncQuery (tĂąches de requĂȘte durables) n’est pas enregistrĂ© : la capacitĂ© doit ĂȘtre dĂ©clarĂ©e lors de la crĂ©ation du moteur, ne peut pas ĂȘtre ajoutĂ©e aprĂšs la crĂ©ation, et adk-python's AdkApp ne l’enregistre pas non plus.

Backends gérés

La valeur par dĂ©faut sans configuration conserve les sessions en mĂ©moire — ce qui suffit pour rĂ©pondre aux requĂȘtes, mais les conversations ne survivent pas au redĂ©marrage d’un conteneur. Les moteurs dĂ©ployĂ©s configurent les backends gĂ©rĂ©s via AgentEngineOptions.

Sessions gérées (Vertex AI Sessions)

Avec la fonctionnalitĂ© vertex-session, VertexAiSessionConfig::from_env() lit les variables dĂ©finies par la plateforme Ă  l’intĂ©rieur des conteneurs dĂ©ployĂ©s (GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION et GOOGLE_CLOUD_AGENT_ENGINE_ID — l’ID numĂ©rique brut du moteur) :

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))
}

En dehors d’un conteneur dĂ©ployĂ©, construisez explicitement la configuration avec VertexAiSessionConfig::new(project, location).with_reasoning_engine(id).

Artefacts (Google Cloud Storage)

Avec la fonctionnalitĂ© gcs-artifacts, GcsArtifactService stocke les artefacts dans la structure de blobs lue par la console Gemini Enterprise (paritĂ© octet par octet avec adk-python). RĂ©cupĂ©rez le bucket depuis une variable d’environnement ou une option :

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))
}

Le service d’artefacts est intĂ©grĂ© Ă  la fois au runner (enregistrements et chargements destinĂ©s aux outils) et Ă  l’état de dispatch.

Mémoire

AgentEngineOptions::with_memory_service accepte n’importe quel adk_memory::MemoryService et active les deux mĂ©thodes de classe de mĂ©moire. Le backend Memory Bank de la plateforme sera fourni avec la fonctionnalitĂ© vertex-memory dans une version ultĂ©rieure.

Intégration de ServerBuilder

Un serveur ADK existant peut exposer la surface de dispatch aux cĂŽtĂ©s de ses routes REST, d’interface utilisateur et A2A :

use adk_server::{ServerBuilder, ServerConfig};

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

Les routes de rĂ©partition servent l’agent racine du chargeur avec les services de session et d’artefacts configurĂ©s. Elles ne transportent pas le middleware d’authentification du serveur : un moteur dĂ©ployĂ© est placĂ© derriĂšre la plateforme, qui authentifie les appelants avant qu’ils n’atteignent le conteneur. N’exposez pas directement ces points de terminaison Ă  des rĂ©seaux non fiables.

Déploiement depuis CLI

Avec adk-cli installĂ© avec la fonctionnalitĂ© gcp-deploy (cargo install adk-cli --features gcp-deploy), une commande crĂ©e le moteur Ă  partir d’une image de conteneur envoyĂ©e :

# 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

Indicateurs facultatifs : --display-name (la valeur par dĂ©faut est le nom de l’image) et --kms-key pour CMEK. La commande dĂ©clare le contrat complet entre classe et mĂ©thode Ă  partir de la table des opĂ©rations, attend la fin de l’opĂ©ration de crĂ©ation et affiche le nom de la ressource du moteur. Le mĂȘme client est disponible par programmation sous la forme adk_deploy::gcp::GcpDeployClient (fonctionnalitĂ© globale gcp-deploy).

Variables d’environnement

VariableSignification
PORTPort de service attribuĂ© par la plateforme (valeur de repli 8080 ; une valeur non valide empĂȘche le dĂ©marrage)
GOOGLE_CLOUD_PROJECTProjet GCP du déploiement
GOOGLE_CLOUD_LOCATIONEmplacement GCP du déploiement
GOOGLE_CLOUD_AGENT_ENGINE_IDID de moteur numĂ©rique brut, dĂ©fini Ă  l’intĂ©rieur des conteneurs dĂ©ployĂ©s

Lorsque GOOGLE_CLOUD_AGENT_ENGINE_ID est prĂ©sent et que le service de session est le service par dĂ©faut en mĂ©moire, le point d’entrĂ©e consigne un avertissement : les moteurs dĂ©ployĂ©s doivent utiliser des sessions gĂ©rĂ©es.

Moteur d’agent (Gemini Enterprise Agent Platform) - Documentation ADK-Rust | ADK-Rust