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ĂšleUtilisation
gpt-realtime-2.1ModÚle de synthÚse vocale bidirectionnelle actuellement utilisé en production et choix par défaut.
gpt-realtime-translateInterprĂ©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Ă©cessite cmake).
  • Audio : PCM16 Ă  24 kHz en entrĂ©e et en sortie.
  • Voix : marin (une voix GA naturelle), alloy et autres ; Ă  dĂ©finir avec RealtimeConfig::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ĂšleUtilisation
models/gemini-3.1-flash-live-previewModÚ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-audioModù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-previewModĂš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 : Kore et autres ; with_voice("Kore").
  • Authentification : GEMINI_API_KEY (ou GOOGLE_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 crate GeminiLiveBackend::studio(...) cible AI Studio via le point de terminaison v1alpha (qui est également celui requis par le dialogue affectif).

Choisir un modĂšle

  • Voix gĂ©nĂ©rale + outils → gpt-realtime-2.1 ou gemini-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.1Gemini 3.1-flash-liveGemini 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 :

ChampContenu
event_typeLe type d’évĂ©nement du fournisseur qui a Ă©chouĂ©
errorL’erreur de dĂ©sĂ©rialisation
payload.bytesTaille de la trame en octets
payload.digestRĂ©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.

Fournisseurs temps réel - Documentation ADK-Rust | ADK-Rust