Proveedores en tiempo real

ADK-Rust expone dos backends en tiempo real detrás de la misma interfaz RealtimeModel, de modo que una aplicación puede ofrecer ambos y cambiar por sesión. Esta página cubre los modelos, voces, endpoints, autenticación y cómo elegir.

OpenAI en tiempo real (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",        // or "gpt-realtime-2" (reasoning)
));
ModeloUso
gpt-realtimeEl modelo de voz a voz GA. Rápido, fuerte en el uso de herramientas. Opción predeterminada.
gpt-realtime-2Variante de razonamiento — mejor para solicitudes complejas de varios pasos.
gpt-realtime-translateIntérprete de traducción dedicado (endpoint diferente; véase ejemplo de Traducción en vivo).
  • Transporte: WebSocket (característica openai) o WebRTC (openai-webrtc, necesita cmake).
  • Audio: PCM16 de 24 kHz de entrada y salida.
  • Voces: marin (una voz natural GA), alloy, y otras; se establece con RealtimeConfig::with_voice("marin").
  • Autenticación: OPENAI_API_KEY. La clave vive en tu servidor (nunca en el navegador).

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",
));
ModeloUso
models/gemini-3.1-flash-live-previewModelo en vivo de medio cascada. Llama a herramientas de forma fiable y acepta fotogramas de vídeo. Opción predeterminada.
models/gemini-2.5-flash-native-audio-preview-12-2025Modelo de audio nativo — la voz más natural, y el que admite diálogo afectivo. Llamada a herramientas más débil.
models/gemini-3.5-live-translate-previewModelo de traducción dedicado (vea el ejemplo de traducción).
  • Transporte: WebSocket (característica de gemini, AI Studio) o Vertex AI Live (vertex-live, OAuth2 / ADC — consulta Realtime Agents).
  • Audio: 16 kHz PCM16 entrada, 24 kHz PCM16 salida.
  • Voces: Kore y otras; with_voice("Kore").
  • Autenticación: GEMINI_API_KEY (o GOOGLE_API_KEY).

Los nombres de los modelos difieren según el endpoint. AI Studio (clave API) usa nombres como models/gemini-3.1-flash-live-preview; Vertex/Agent Platform usa nombres diferentes. El GeminiLiveBackend::studio(...) del crate apunta a AI Studio sobre el endpoint v1alpha (que es también lo que requiere el diálogo afectivo).

Elegir un modelo

  • Voz general + herramientasgpt-realtime o gemini-3.1-flash-live-preview. Ambos llaman a herramientas de forma fiable. Gemini es la mejor opción para video continuo.
  • Voz más natural / sensible a emociones → audio nativo de Gemini (gemini-2.5-flash-native-audio-*) con affective dialogue — con cierto coste en la fiabilidad de la llamada a herramientas.
  • Mucho razonamientogpt-realtime-2.
  • Traducción → los modelos de traducción dedicados (su propio protocolo).

Seleccionar un proveedor por sesión

Las aplicaciones normalmente leen el proveedor desde una solicitud y construyen el modelo correspondiente. Las tasas de audio difieren, así que expónlas también:

#[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")),
            "marin",
        ),
        Provider::Gemini => (
            Arc::new(GeminiRealtimeModel::new(
                GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
                "models/gemini-3.1-flash-live-preview",
            )),
            "Kore",
        ),
    })
}

Los ejemplos hacen que todo esto sea configurable mediante variables de entorno (OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL) para que puedas fijar un modelo sin recompilar.

Matriz de capacidades

OpenAI gpt-realtimeGemini 3.1-flash-liveGemini native-audio
Voz (audio de entrada/salida)
Transcripciones en vivo
Herramientas del lado del servidor✅ (reliable)✅ (reliable)⚠️ (weaker)
Cuadros de video✅ (image items)✅ (continuous)✅ (continuous)
Diálogo afectivo

Siguiente: Herramientas →

Diagnósticos y privacidad de la carga útil

Los marcos en tiempo real llevan transcripciones, argumentos de herramientas, resultados de herramientas e identificadores. Cuando un evento reconocido no se puede deserializar — desviación del esquema del proveedor — la advertencia informa un resumen seguro para el campo y retiene el marco:

CampoContenido
event_typeEl tipo de evento del proveedor que falló
errorEl error de deserialización
payload.bytesTamaño de fotograma en bytes
payload.digestResumen breve, para correlacionar repeticiones de la misma deriva
payload.raw<redacted> a menos que la grabación de cargas útiles esté compilada

Nota: el digest agrupa las líneas de registro dentro de una ejecución. No es un digest criptográfico y no es estable entre procesos.

Para diagnosticar la desviación con el frame en mano, compile adk-realtime con la función record-payloads, que registra los primeros 300 bytes:

[dependencies]
adk-realtime = { version = "2.0.0", features = ["openai", "record-payloads"] }

La función está desactivada por defecto y es una elección deliberada por compilación, porque la desviación de esquema es exactamente cuando los operadores amplían la recopilación y la retención de registros.