Fournisseurs temps réel
ADK-Rust prend en charge deux backends temps rĂ©el derriĂšre la mĂȘme interface RealtimeModel,
afin quâune application puisse proposer les deux et basculer de lâun Ă lâautre par session. Cette page prĂ©sente les
modĂšles, les voix, les endpoints, lâauthentification et la maniĂšre de faire un choix.
OpenAI temps réel (GA)
use adk_realtime::openai::OpenAIRealtimeModel;
use adk_realtime::model::BoxedModel;
use std::sync::Arc;
let model: BoxedModel = Arc::new(OpenAIRealtimeModel::new(
std::env::var("OPENAI_API_KEY")?,
"gpt-realtime-2.1",
));
| ModĂšle | Utilisation |
|---|---|
gpt-realtime-2.1 | ModÚle de synthÚse vocale bidirectionnelle actuellement utilisé en production et choix par défaut. |
gpt-realtime-translate | InterprĂ©teur dĂ©diĂ© Ă la traduction (point de terminaison diffĂ©rent ; voir lâexemple de traduction en direct). |
- Transport : WebSocket (fonctionnalité
openai) ou WebRTC (openai-webrtc, nécessitecmake). - Audio : PCM16 à 24 kHz en entrée et en sortie.
- Voix :
marin(une voix GA naturelle),alloyet autres ; à définir avecRealtimeConfig::with_voice("marin"). - Authentification :
OPENAI_API_KEY. La clé se trouve sur votre serveur (jamais dans le navigateur).
Gemini Live
use adk_realtime::gemini::{GeminiLiveBackend, GeminiRealtimeModel};
let model: BoxedModel = Arc::new(GeminiRealtimeModel::new(
GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
"models/gemini-3.1-flash-live-preview",
));
| ModĂšle | Utilisation |
|---|---|
models/gemini-3.1-flash-live-preview | ModÚle live en demi-cascade. Appelle les outils de maniÚre fiable et accepte les images vidéo. Choix par défaut. |
models/gemini-live-2.5-flash-native-audio | ModĂšle audio natif â la voix la plus naturelle, et celui qui prend en charge le dialogue affectif. Appels dâoutils moins fiables. |
models/gemini-3.5-live-translate-preview | ModĂšle de traduction dĂ©diĂ© (voir lâexemple de traduction). |
- Transport : WebSocket (fonctionnalité
gemini, AI Studio) ou Vertex AI Live (vertex-live, OAuth2 / ADC â voir Agents temps rĂ©el). - Audio : PCM16 Ă 16 kHz en entrĂ©e, PCM16 Ă 24 kHz en sortie.
- Voix :
Koreet autres ;with_voice("Kore"). - Authentification :
GEMINI_API_KEY(ouGOOGLE_API_KEY).
Les noms de modÚles diffÚrent selon le point de terminaison. AI Studio (clé API) utilise des noms tels que
models/gemini-3.1-flash-live-preview; Vertex/Agent Platform utilise des noms différents. La crateGeminiLiveBackend::studio(...)cible AI Studio via le point de terminaisonv1alpha(qui est également celui requis par le dialogue affectif).
Choisir un modĂšle
- Voix gĂ©nĂ©rale + outils â
gpt-realtime-2.1ougemini-3.1-flash-live-preview. Tous deux appellent les outils de maniĂšre fiable. Gemini convient mieux Ă la vidĂ©o continue. - Voix la plus naturelle / sensible aux Ă©motions â Gemini native-audio
(
gemini-live-2.5-flash-native-audio) avec le dialogue affectif â au prix dâune moindre fiabilitĂ© des appels dâoutils. - Raisonnement intensif â
gpt-realtime-2.1. - Traduction â les modĂšles de traduction dĂ©diĂ©s (avec leur propre protocole).
Sélectionner un fournisseur par session
Les applications lisent gĂ©nĂ©ralement le fournisseur depuis une requĂȘte et construisent le modĂšle correspondant. Les frĂ©quences audio diffĂšrent, exposez-les donc Ă©galement :
#[derive(Clone, Copy)]
enum Provider { OpenAI, Gemini }
impl Provider {
fn audio_rates(self) -> (u32, u32) { // (input, output)
match self {
Provider::OpenAI => (24_000, 24_000),
Provider::Gemini => (16_000, 24_000),
}
}
}
fn build_model(p: Provider) -> anyhow::Result<(BoxedModel, &'static str)> {
Ok(match p {
Provider::OpenAI => (
Arc::new(OpenAIRealtimeModel::new(std::env::var("OPENAI_API_KEY")?, "gpt-realtime-2.1")),
"marin",
),
Provider::Gemini => (
Arc::new(GeminiRealtimeModel::new(
GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
"models/gemini-3.1-flash-live-preview",
)),
"Kore",
),
})
}
Les exemples permettent de remplacer toutes ces valeurs avec des variables
dâenvironnement (OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL), afin de pouvoir imposer un modĂšle sans
recompiler.
Matrice des fonctionnalités
OpenAI gpt-realtime-2.1 | Gemini 3.1-flash-live | Gemini audio natif | |
|---|---|---|---|
| Voix (audio entrant/sortant) | â | â | â |
| Transcriptions en direct | â | â | â |
| Outils cĂŽtĂ© serveur | â (fiables) | â (fiables) | â ïž (plus faibles) |
| Images vidĂ©o | â (Ă©lĂ©ments dâimage) | â (continues) | â (continues) |
| Dialogue affectif | â | â | â |
Suivant : Outils â
Diagnostics et confidentialité des données utiles
Les trames en temps rĂ©el transportent des transcriptions, des arguments dâoutils, des rĂ©sultats dâoutils et des identifiants. Lorsquâun Ă©vĂ©nement reconnu ne peut pas ĂȘtre dĂ©sĂ©rialisĂ© â en raison dâune Ă©volution du schĂ©ma du fournisseur â lâavertissement fournit un rĂ©sumĂ© nâexposant pas les champs sensibles et retient la trame :
| Champ | Contenu |
|---|---|
event_type | Le type dâĂ©vĂ©nement du fournisseur qui a Ă©chouĂ© |
error | Lâerreur de dĂ©sĂ©rialisation |
payload.bytes | Taille de la trame en octets |
payload.digest | RĂ©sumĂ© court, pour corrĂ©ler les rĂ©pĂ©titions de la mĂȘme dĂ©rive |
payload.raw | <redacted> sauf si lâenregistrement de la charge utile est compilĂ© |
Remarque : le condensĂ© regroupe les lignes de journal au sein dâune exĂ©cution. Il ne sâagit pas dâun condensĂ© cryptographique et il nâest pas stable dâun processus Ă lâautre.
Pour diagnostiquer la dérive avec la trame en main, compilez adk-realtime avec la fonctionnalité
record-payloads, qui enregistre les 300 premiers octets :
[dependencies]
adk-realtime = { version = "2.1.0", features = ["openai", "record-payloads"] }
La fonctionnalitĂ© est dĂ©sactivĂ©e par dĂ©faut et ce choix est dĂ©libĂ©rĂ© pour chaque compilation, car câest prĂ©cisĂ©ment lors dâune dĂ©rive de schĂ©ma que les opĂ©rateurs Ă©largissent la collecte et la conservation des journaux.