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/

Inviter un agent, suivre le transfert animĂ© entre Ă©quipes et inspecter la tĂ©lĂ©mĂ©trie dans l’interface d’exĂ©cution intĂ©grĂ©e

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’étatCatĂ©gorieSignification
200—RĂ©ussite
204—RĂ©ussite (aucun contenu)
400invalid_inputRequĂȘte incorrecte — paramĂštres ou configuration non valides
401unauthorizedIdentifiants manquants ou non valides
403forbiddenIdentifiants valides, permissions insuffisantes
404not_foundRessource introuvable
408timeoutL’opĂ©ration a expirĂ©
429rate_limitedLimite de débit du service en amont dépassée
500internalErreur interne du serveur
501unsupportedFonctionnalité non prise en charge
503unavailableService 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 critiques
  • WARN : Avertissements
  • INFO : 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

  1. Gestion des sessions : CrĂ©ez toujours une session avant d’exĂ©cuter un agent
  2. Gestion des erreurs : VĂ©rifiez les codes d’état HTTP et gĂ©rez les erreurs de maniĂšre appropriĂ©e
  3. Diffusion en continu : Utilisez SSE pour les réponses en temps réel ; analysez les événements ligne par ligne
  4. Sécurité : En production, mettez en place une authentification et restreignez CORS
  5. Persistance : Utilisez SqliteSessionService ou PostgresSessionService pour les déploiements en production
  6. 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

PrĂ©cĂ©dent : ← Lanceur | Suivant : Protocole A2A →

Serveur API - Documentation ADK-Rust | ADK-Rust