Serveur API
Le serveur ADK-Rust fournit un REST API pour exĂ©cuter des agents, gĂ©rer les sessions et accĂ©der aux artefacts. Lorsque vous dĂ©ployez votre agent Ă lâaide du Launcher en mode serveur, il expose ces points de terminaison ainsi quâune interface web.
Vue dâensemble
Le serveur repose sur Axum et fournit :
- REST API : points de terminaison HTTP pour lâexĂ©cution des agents et la gestion des sessions
- ĂvĂ©nements envoyĂ©s par le serveur (SSE) : diffusion en temps rĂ©el des rĂ©ponses de lâagent
- Interface web : interface interactive dans le navigateur
- Prise en charge de CORS : requĂȘtes interorigines activĂ©es
- Télémétrie : observabilité intégrée avec la journalisation de suivi
ServerConfig expose également un relais direct au niveau du lanceur pour les
déploiements de longue durée :
let config = ServerConfig::new(agent_loader, session_service)
.with_compaction(compaction_config)
.with_context_cache(context_cache_config, cache_capable_model);
Démarrage du serveur
Utilisez le Launcher pour démarrer le serveur :
use adk_rust::prelude::*;
use adk_rust::Launcher;
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("my_agent")
.description("A helpful assistant")
.instruction("You are a helpful assistant.")
.model(model)
.build()?;
Launcher::new(Arc::new(agent)).run().await
}
DĂ©marrez Ă partir de lâossature API validĂ©e :
cargo adk new my-api --template api
cd my-api
cargo run
Points de terminaison REST API
VĂ©rification de lâĂ©tat
Vérifiez si le serveur fonctionne :
GET /api/health
Réponse :
OK
ExĂ©cution dâun agent avec diffusion en continu
ExĂ©cutez un agent et diffusez les rĂ©ponses Ă lâaide des Ă©vĂ©nements envoyĂ©s par le serveur :
POST /api/run_sse
Corps de la requĂȘte :
{
"appName": "my_agent",
"userId": "user123",
"sessionId": "session456",
"newMessage": {
"role": "user",
"parts": [
{
"text": "What is the capital of France?"
}
]
},
"streaming": true
}
Réponse :
- Type de contenu :
text/event-stream - Diffuse les Ă©vĂ©nements sous forme dâobjets JSON
Format des événements :
{
"id": "evt_123",
"timestamp": 1234567890,
"author": "my_agent",
"content": {
"role": "model",
"parts": [
{
"text": "The capital of France is Paris."
}
]
},
"actions": {},
"llm_response": {
"content": {
"role": "model",
"parts": [
{
"text": "The capital of France is Paris."
}
]
}
}
}
ExĂ©cution dâun agent (sans diffusion en continu)
ExĂ©cutez un agent jusquâĂ son terme et recevez tous les Ă©vĂ©nements dans une seule rĂ©ponse JSON :
POST /api/run
Corps de la requĂȘte : mĂȘme structure que POST /api/run_sse (le champ streaming est ignorĂ©) :
{
"appName": "my_agent",
"userId": "user123",
"sessionId": "session456",
"newMessage": {
"role": "user",
"parts": [
{
"text": "What is the capital of France?"
}
]
}
}
Réponse :
- Type de contenu :
application/json - Un tableau JSON contenant chaque Ă©vĂ©nement produit par lâexĂ©cution, dans lâordre, en utilisant le mĂȘme format dâĂ©vĂ©nement que
/api/run_sse
Ce point de terminaison reproduit la route /run sans diffusion en continu de ADK de Google api_server.
Gestion des sessions
Créer une session
Créer une nouvelle session :
POST /api/sessions
Corps de la requĂȘte :
{
"appName": "my_agent",
"userId": "user123",
"sessionId": "session456"
}
Réponse :
{
"id": "session456",
"appName": "my_agent",
"userId": "user123",
"lastUpdateTime": 1234567890,
"events": [],
"state": {}
}
Obtenir une session
RĂ©cupĂ©rer les dĂ©tails dâune session :
GET /api/sessions/:app_name/:user_id/:session_id
Réponse :
{
"id": "session456",
"appName": "my_agent",
"userId": "user123",
"lastUpdateTime": 1234567890,
"events": [],
"state": {}
}
Supprimer une session
Supprimer une session :
DELETE /api/sessions/:app_name/:user_id/:session_id
Réponse :
- Statut :
204 No Content
Lister les sessions
Lister toutes les sessions dâun utilisateur :
GET /api/apps/:app_name/users/:user_id/sessions
Réponse :
[
{
"id": "session456",
"appName": "my_agent",
"userId": "user123",
"lastUpdateTime": 1234567890,
"events": [],
"state": {}
}
]
Gestion des artefacts
Lister les artefacts
Lister tous les artefacts dâune session :
GET /api/sessions/:app_name/:user_id/:session_id/artifacts
Réponse :
[
"image1.png",
"document.pdf",
"data.json"
]
Obtenir un artefact
Télécharger un artefact :
GET /api/sessions/:app_name/:user_id/:session_id/artifacts/:artifact_name
Réponse :
- Type de contenu : dĂ©terminĂ© par lâextension du fichier
- Corps : contenu binaire ou texte
Gestion des applications
Lister les applications
Lister tous les agents disponibles :
GET /api/apps
GET /api/list-apps (legacy compatibility)
Réponse :
{
"apps": [
{
"name": "my_agent",
"description": "A helpful assistant"
}
]
}
Interface web
Le serveur inclut une interface web intĂ©grĂ©e accessible Ă lâadresse :
http://localhost:8080/ui/

Le guide de dĂ©marrage rapide en cinq minutes met en place un serveur basĂ© sur OpenAI et ouvre cette interface avec quatre commandes. Lâenregistrement utilise une Ă©quipe pour rendre visible lâarĂȘte de topologie active ; les agents feuilles, les outils, les graphes, les workflows, les agents en temps rĂ©el et les agents distants utilisent la mĂȘme interface.
Fonctionnalités
- ExĂ©cutions interactives : Envoyer des messages et des piĂšces jointes, et inspecter un Markdown rendu de maniĂšre sĂ©curisĂ©e, le texte en streaming, les appels dâoutils, les Ă©checs et les transferts
- Gestion des sessions : Créer, consulter et basculer entre les sessions
- Topologie dâĂ©quipe portable : Distinguer les liens exacts de dĂ©lĂ©gation et de retour des transferts de contrĂŽle, avec une animation de type Studio Next pour le membre actif et le lien entrant
- Inspecteur du runtime : Inspecter les Ă©vĂ©nements ordonnĂ©s, les spans de tĂ©lĂ©mĂ©trie dĂ©diĂ©s, lâĂ©tat partagĂ©/de session, les services du runtime configurĂ©s, la dĂ©couverte de A2A et la prise en charge du protocole UI/MCP Apps
- Lecture en temps réel : Identifier les agents en temps réel, fusionner les deltas de transcription et lire la sortie PCM terminée au format audio WAV
- Visionneuse dâartefacts : Consulter et tĂ©lĂ©charger les artefacts de session
- ThĂšmes adaptatifs : Dispositions systĂšme, claire et sombre accessibles au clavier, sans ressources externes
Routes de lâinterface
/- Redirige vers/ui//ui/- Interface principale de discussion/ui/assets/*- Ressources statiques (CSS, JS, images)/ui/assets/config/runtime-config.json- Configuration du runtime/api/ui/agents/{name}- CapacitĂ©s de lâagent, hiĂ©rarchie et mĂ©tadonnĂ©es de topologie portable
Lâinterface est maintenue dans adk-server/webui et sa build de production est
intégrée au crate serveur, de sorte que les projets générés et les déploiements utilisent la
mĂȘme interface runtime sans service frontend sĂ©parĂ©.
La vitrine dâinterface utilisateur du runtime exĂ©cutable
comprend des tutoriels et des captures dâĂ©cran distincts basĂ©s sur OpenAI pour un agent appelant des outils, un workflow de graphe dĂ©terministe et une Ă©quipe de transfert portable. La galerie dâagents avancĂ©s ajoute un planning ambiant, la lecture vocale en temps rĂ©el de OpenAI, la dĂ©couverte de A2A, la dĂ©couverte de MCP 2026-07-28 avec des tĂąches SEP-2663, ainsi que des services de tĂ©lĂ©mĂ©trie, dâartefacts et de mĂ©moire configurĂ©s sur un mĂȘme serveur. La marque ADK Runtime renvoie vers adk-rust.com dans un nouvel onglet.
Exemples client
JavaScript/TypeScript
Utilisation de Fetch API avec SSEÂ :
async function runAgent(message) {
const response = await fetch('http://localhost:8080/api/run_sse', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
appName: 'my_agent',
userId: 'user123',
sessionId: 'session456',
newMessage: {
role: 'user',
parts: [{ text: message }]
},
streaming: true
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const event = JSON.parse(line.slice(6));
console.log('Event:', event);
}
}
}
}
Python
Utilisation de la bibliothÚque requests :
import requests
import json
def run_agent(message):
url = 'http://localhost:8080/api/run_sse'
payload = {
'appName': 'my_agent',
'userId': 'user123',
'sessionId': 'session456',
'newMessage': {
'role': 'user',
'parts': [{'text': message}]
},
'streaming': True
}
response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
if line_str.startswith('data: '):
event = json.loads(line_str[6:])
print('Event:', event)
run_agent('What is the capital of France?')
cURL
# Create session
curl -X POST http://localhost:8080/api/sessions \
-H "Content-Type: application/json" \
-d '{
"appName": "my_agent",
"userId": "user123",
"sessionId": "session456"
}'
# Run agent with streaming
curl -X POST http://localhost:8080/api/run_sse \
-H "Content-Type: application/json" \
-d '{
"appName": "my_agent",
"userId": "user123",
"sessionId": "session456",
"newMessage": {
"role": "user",
"parts": [{"text": "What is the capital of France?"}]
},
"streaming": true
}'
Configuration du serveur
Port personnalisé
Pour utiliser un port personnalisé, définissez PORT avant de démarrer le serveur généré :
PORT=3000 cargo run
Service dâartefacts personnalisĂ©
Fournissez votre propre service dâartefacts :
use adk_artifact::InMemoryArtifactService;
let artifact_service = Arc::new(InMemoryArtifactService::new());
Launcher::new(Arc::new(agent))
.with_artifact_service(artifact_service)
.run()
.await
Service de sessions personnalisé
Pour les déploiements en production, utilisez un service de sessions persistant :
use adk_session::SqliteSessionService;
// Note: This requires implementing a custom server setup
// The Launcher uses InMemorySessionService by default
Gestion des erreurs
API utilise des rĂ©ponses dâerreur structurĂ©es avec des codes dâĂ©tat HTTP dĂ©rivĂ©s de la catĂ©gorie dâerreur :
| Code dâĂ©tat | CatĂ©gorie | Signification |
|---|---|---|
| 200 | â | RĂ©ussite |
| 204 | â | RĂ©ussite (aucun contenu) |
| 400 | invalid_input | RequĂȘte incorrecte â paramĂštres ou configuration non valides |
| 401 | unauthorized | Identifiants manquants ou non valides |
| 403 | forbidden | Identifiants valides, permissions insuffisantes |
| 404 | not_found | Ressource introuvable |
| 408 | timeout | LâopĂ©ration a expirĂ© |
| 429 | rate_limited | Limite de débit du service en amont dépassée |
| 500 | internal | Erreur interne du serveur |
| 501 | unsupported | Fonctionnalité non prise en charge |
| 503 | unavailable | Service en amont indisponible |
Format de rĂ©ponse dâerreur (problĂšme JSON) :
{
"error": {
"code": "model.openai.rate_limited",
"message": "OpenAI rate limit exceeded",
"component": "model",
"category": "rate_limited",
"requestId": "req-abc123",
"retryAfter": 5000,
"upstreamStatusCode": 429
}
}
Les champs requestId, retryAfter et upstreamStatusCode sont inclus lorsquâils sont disponibles (null dans le cas contraire).
Configuration de CORS
Le serveur active par dĂ©faut CORS permissif, ce qui autorise les requĂȘtes provenant de nâimporte quelle origine. Cette configuration convient au dĂ©veloppement, mais doit ĂȘtre restreinte en production.
Télémétrie
Le serveur initialise automatiquement la télémétrie lors de son démarrage. Les journaux sont affichés sur la sortie standard dans un format structuré.
Niveaux de journalisation :
ERROR: Erreurs critiquesWARN: AvertissementsINFO: Informations générales (par défaut)DEBUG: Débogage détailléTRACE: Traçage trÚs détaillé
DĂ©finissez le niveau de journalisation avec la variable dâenvironnement RUST_LOG :
RUST_LOG=debug cargo run
Bonnes pratiques
- Gestion des sessions : CrĂ©ez toujours une session avant dâexĂ©cuter un agent
- Gestion des erreurs : VĂ©rifiez les codes dâĂ©tat HTTP et gĂ©rez les erreurs de maniĂšre appropriĂ©e
- Diffusion en continu : Utilisez SSE pour les réponses en temps réel ; analysez les événements ligne par ligne
- Sécurité : En production, mettez en place une authentification et restreignez CORS
- Persistance : Utilisez
SqliteSessionServiceouPostgresSessionServicepour les déploiements en production - Surveillance : Activez la télémétrie et surveillez les journaux pour détecter les problÚmes
Exemple full-stack
Pour obtenir une structure complÚte de serveur fonctionnelle, utilisez le modÚle API validé de cargo-adk. Celui-ci présente :
- Frontend : client HTML/JavaScript avec diffusion en continu en temps réel
- Backend : agent ADK avec des outils personnalisés de recherche et de génération PDF
- Intégration : utilisation complÚte de REST API avec diffusion en continu SSE
- Artefacts : génération et téléchargement de PDF
- Gestion des sessions : création et gestion automatiques des sessions
Lâexemple prĂ©sente un modĂšle prĂȘt pour la production destinĂ© Ă crĂ©er des applications web alimentĂ©es par lâIA avec ADK-Rust.
Démarrage rapide :
cargo adk new my-api --template api
cd my-api
cargo run
Fichiers :
- Backend :
adk-rust-guide/examples/deployment/full_stack_research.rs - Frontend :
examples/research_paper/frontend.html - Documentation :
examples/research_paper/README.md - Architecture :
examples/research_paper/architecture.md
Rubriques connexes
- Lanceur - Démarrage du serveur
- Sessions - Gestion des sessions
- Artefacts - Stockage des artefacts
- Observabilité - Télémétrie et journalisation
PrĂ©cĂ©dent : â Lanceur | Suivant : Protocole A2A â