Agents en temps réel et multimodaux
CrĂ©ez des agents qui parlent, Ă©coutent, voient et agissent en temps rĂ©el â via une connexion active Ă faible latence Ă OpenAI's Realtime API ou Ă Gemini Live API de Google.
Un agent en temps rĂ©el n'est pas un chatbot requĂȘte/rĂ©ponse. Il maintient une session ouverte : le microphone de l'utilisateur diffuse en continu, le modĂšle renvoie en continu de l'audio + une transcription en direct, dĂ©tecte quand l'utilisateur commence et arrĂȘte de parler, peut ĂȘtre interrompu au milieu d'une phrase (prise de parole), peut voir les images d'une camĂ©ra et peut appeler vos outils et Ă©noncer le rĂ©sultat â le tout sans jamais mettre fin à « l'appel ».
Vous découvrez ADK-Rust ? Lisez d'abord l'Introduction et le Démarrage rapide. Cette section suppose que vous savez ce que sont un agent, un outil et une session.
Ce que vous pouvez créer
| Fonctionnalité | Ce que cela signifie | Page |
|---|---|---|
| Conversations vocales | Audio PCM16 bidirectionnel avec VAD et interruption | Architecture |
| Deux fournisseurs, une seule API | OpenAI Realtime (GA) ou Gemini Live, interchangeables par session | Fournisseurs |
| Outils cĂŽtĂ© serveur | Le modĂšle appelle process_refund(...) ; votre code Rust lâexĂ©cute et le modĂšle Ă©nonce le rĂ©sultat | Outils |
| Vision multimodale | Diffusez les images de la camĂ©ra en continu â lâagent voit ce que lâutilisateur lui montre | Multimodal |
| Dialogue affectif | Lâagent interprĂšte le ton Ă©motionnel de lâutilisateur et sâadapte (audio natif de Gemini) | Dialogue affectif |
| MĂ©moire Ă long terme | Un graphe de connaissances que lâagent lit au dĂ©but de la session et enrichit Ă mesure quâil apprend | MĂ©moire |
| Applications web | Une interface front-end de navigateur (micro + caméra) reliée via votre serveur | Créer des applications web |
Consultez ensuite les quatre applications dâexemple exĂ©cutables.
ModĂšle mental
Il existe deux couches, et la plupart des applications utilisent la couche supérieure :
IntegratedRealtimeRunner â sessions, memory, tools, plugins (use this)
â wraps
RealtimeRunner â event loop + tool dispatch
â drives
RealtimeSession (a transport) â the live WebSocket to the provider
â created by
RealtimeModel (OpenAI | Gemini)
- Un
RealtimeModel(par ex.OpenAIRealtimeModel,GeminiRealtimeModel) saitconnect()et produire unRealtimeSessionâ le transport actif. RealtimeRunnerpossĂšde cette session : il traite les Ă©vĂ©nements et, lorsque le modĂšle demande un outil, il exĂ©cute le gestionnaire et renvoie le rĂ©sultat.IntegratedRealtimeRunnerencapsule le moteur dâexĂ©cution et le connecte au reste de ADK âSessionService(persistance de la transcription),MemoryService(rappel + stockage),EnhancedPluginManager(hooks), ainsi quâun pont qui permet Ă nâimporte queladk-coreToolde sâexĂ©cuter dans une session en temps rĂ©el. Câest ce quâutilisent les exemples.
(Il existe également un RealtimeAgent de niveau supérieur pour les agents
vocaux simples, ainsi que des transports directs â WebRTC, LiveKit, Vertex AI
Live â documentĂ©s Ă cet endroit.)
Installation
# Voice + tools + the integration layer (recommended)
adk-realtime = { version = "2.1.0", features = ["openai", "gemini", "integration"] }
| Fonctionnalité | Ajouts |
|---|---|
openai | OpenAI Realtime (WebSocket) |
gemini | Gemini Live (WebSocket) |
integration | IntegratedRealtimeRunner â sessions, mĂ©moire, plugins, pont dâoutils |
openai-webrtc | OpenAI sur WebRTC (nécessite cmake) |
vertex-live | Gemini via Vertex AI Live (OAuth2 / ADC) |
livekit | pont LiveKit WebRTC |
Démarrage rapide en 60 secondes
Un échange vocal sans interface : connectez-vous, posez une question par texte, puis diffusez la réponse au fur et à mesure.
use adk_realtime::config::{RealtimeConfig, VadConfig};
use adk_realtime::events::ServerEvent;
use adk_realtime::integration::{IntegratedRealtimeRunner, IntegrationConfig};
use adk_realtime::model::BoxedModel;
use adk_realtime::openai::OpenAIRealtimeModel;
use adk_session::{CreateRequest, InMemorySessionService, SessionService};
use std::sync::Arc;
# async fn run() -> anyhow::Result<()> {
let model: BoxedModel = Arc::new(OpenAIRealtimeModel::new(
std::env::var("OPENAI_API_KEY")?,
"gpt-realtime-2.1",
));
let config = RealtimeConfig::default()
.with_instruction("You are a friendly assistant. Keep replies short.")
.with_voice("marin")
.with_audio_only()
.with_vad(VadConfig::server_vad()) // model decides turn boundaries
.with_transcription(); // emit a text transcript too
let sessions = Arc::new(InMemorySessionService::new());
sessions.create(CreateRequest {
app_name: "demo".into(), user_id: "u1".into(),
session_id: Some("s1".into()), state: Default::default(),
}).await?;
let runner = IntegratedRealtimeRunner::builder()
.model(model)
.config(config)
.identity("demo", "u1", "s1")
.session_service(sessions)
.integration_config(IntegrationConfig::default())
.build()?;
runner.connect().await?;
runner.send_text("Say hello in one short sentence.").await?;
runner.create_response().await?; // text input needs an explicit trigger
while let Some(event) = runner.next_event().await {
match event? {
ServerEvent::TranscriptDelta { delta, .. } => print!("{delta}"),
ServerEvent::AudioDelta { .. } => { /* PCM16 to play */ }
ServerEvent::ResponseDone { .. } => break,
_ => {}
}
}
runner.close().await?;
# Ok(()) }
Dans une vĂ©ritable application, vous diffusez lâaudio du microphone avec runner.send_audio(base64_pcm16)
au lieu de send_text, et le VAD cĂŽtĂ© serveur dĂ©clenche automatiquement les rĂ©ponses â aucun
create_response() nâest nĂ©cessaire. Consultez CrĂ©er des applications web.
Pour aller plus loin
- Architecture â comment les Ă©lĂ©ments sâarticulent, la boucle dâĂ©vĂ©nements et le pipeline audio.
- Fournisseurs â OpenAI et modĂšles Gemini, voix, points de terminaison et authentification.
- Outils â appels de fonctions cĂŽtĂ© serveur.
- Multimodal â envoi dâimages vidĂ©o.
- Dialogue affectif â rĂ©ponses tenant compte des Ă©motions.
- MĂ©moire â mĂ©moire Ă long terme fondĂ©e sur un graphe de connaissances.
- CrĂ©er des applications web â le pont avec le navigateur.
- Exemples â quatre applications exĂ©cutables.