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 terminaison | Mode | Réponse |
|---|---|---|
POST /api/reasoning_engine | unaire | {"output": ...} |
POST /api/stream_reasoning_engine | en flux | un 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_method | Mode API | Comportement |
|---|---|---|
create_session, async_create_session | "" / async | CrĂ©er une session (ID choisi facultativement par lâappelant et Ă©tat initial) |
get_session, async_get_session | "" / async | Récupérer une session avec ses événements |
list_sessions, async_list_sessions | "" / async | RĂ©pertorier les sessions dâun utilisateur |
delete_session, async_delete_session | "" / async | Supprimer une session |
stream_query, async_stream_query | stream / async_stream | ExĂ©cuter lâagent ; la session est créée automatiquement si elle est absente |
streaming_agent_run_with_events | async_stream | ExĂ©cuter lâagent Ă partir dâune chaĂźne AgentRunRequest JSON (chemin Playground de la console) |
async_add_session_to_memory | async | Extraire les Ă©vĂ©nements dâune session vers le service de mĂ©moire configurĂ© |
async_search_memory | async | Rechercher 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'sAdkAppne 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
| Variable | Signification |
|---|---|
PORT | Port de service attribuĂ© par la plateforme (valeur de repli 8080 ; une valeur non valide empĂȘche le dĂ©marrage) |
GOOGLE_CLOUD_PROJECT | Projet GCP du déploiement |
GOOGLE_CLOUD_LOCATION | Emplacement GCP du déploiement |
GOOGLE_CLOUD_AGENT_ENGINE_ID | ID 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.