Proveedores en tiempo real

ADK-Rust ofrece dos backends en tiempo real detrás de la misma interfaz RealtimeModel, por lo que una aplicación puede ofrecer ambos y cambiar entre ellos por sesión. Esta página cubre los modelos, las voces, los endpoints, la 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-2.1",
));
ModeloUso
gpt-realtime-2.1Modelo actual de producción de voz a voz y opción predeterminada.
gpt-realtime-translateIntérprete de traducción dedicado (punto de conexión diferente; consulta el ejemplo de traducción en vivo).
  • Transporte: WebSocket (función openai) o WebRTC (openai-webrtc, necesita cmake).
  • Audio: PCM16 de 24 kHz de entrada y salida.
  • Voces: marin (una voz GA natural), alloy y otras; se configuran con RealtimeConfig::with_voice("marin").
  • Autenticación: OPENAI_API_KEY. La clave reside 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 semicapa. Llama a herramientas de forma fiable y acepta fotogramas de vídeo. Opción predeterminada.
models/gemini-live-2.5-flash-native-audioModelo de audio nativo: la voz más natural y el que admite diálogo afectivo. Menor capacidad para llamar a herramientas.
models/gemini-3.5-live-translate-previewModelo de traducción dedicado (consulta el ejemplo de traducción).
  • Transporte: WebSocket (función de gemini, AI Studio) o Vertex AI Live (vertex-live, OAuth2 / ADC; consulta Agentes en tiempo real).
  • Audio: PCM16 de 16 kHz de entrada, PCM16 de 24 kHz de salida.
  • Voces: Kore y otras; with_voice("Kore").
  • Autenticación: GEMINI_API_KEY (o GOOGLE_API_KEY).

Los nombres de los modelos varían según el endpoint. AI Studio (clave de API) utiliza nombres como models/gemini-3.1-flash-live-preview; Vertex/Agent Platform utiliza otros nombres. El crate GeminiLiveBackend::studio(...) se dirige a AI Studio a través del endpoint v1alpha (que también es el que requiere el diálogo afectivo).

Elegir un modelo

  • Voz general + herramientasgpt-realtime-2.1 o gemini-3.1-flash-live-preview. Ambos invocan herramientas de forma fiable. Gemini es la opción más adecuada para vídeo continuo.
  • Voz más natural / consciente de las emociones → Gemini native-audio (gemini-live-2.5-flash-native-audio) con diálogo afectivo; con cierto coste en la fiabilidad de la invocación de herramientas.
  • Razonamiento intensivogpt-realtime-2.1.
  • Traducción → los modelos de traducción dedicados (con su propio protocolo).

Seleccionar un proveedor por sesión

Las aplicaciones normalmente leen el proveedor de una solicitud y crean el modelo correspondiente. Las frecuencias de audio difieren, así que expóngalas 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-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",
        ),
    })
}

Los ejemplos permiten sobrescribir todos estos valores mediante variables de entorno (OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL), para que puedas fijar un modelo sin volver a compilar.

Matriz de capacidades

OpenAI gpt-realtime-2.1Gemini 3.1-flash-liveGemini con audio nativo
Voz (audio de entrada/salida)
Transcripciones en directo
Herramientas del lado del servidor✅ (fiable)✅ (fiable)⚠️ (más débil)
Fotogramas de vídeo✅ (elementos de imagen)✅ (continuo)✅ (continuo)
Diálogo afectivo

Siguiente: Herramientas →

Diagnósticos y privacidad de la carga útil

Los marcos en tiempo real contienen transcripciones, argumentos de herramientas, resultados de herramientas e identificadores. Cuando un evento reconocido no se puede deserializar —debido a una divergencia del esquema del proveedor—, la advertencia informa de un resumen seguro respecto a los campos y retiene el marco:

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

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

Para diagnosticar la divergencia con el frame disponible, compila adk-realtime con la funcionalidad record-payloads, que registra los primeros 300 bytes:

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

La funcionalidad está desactivada de forma predeterminada y es una elección deliberada para cada compilación, porque la divergencia del esquema es precisamente cuando los operadores amplían la recopilación y la retención de registros.