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)
));
| Modelo | Uso |
|---|---|
gpt-realtime | El modelo de voz a voz GA. Rápido, fuerte en el uso de herramientas. Opción predeterminada. |
gpt-realtime-2 | Variante de razonamiento — mejor para solicitudes complejas de varios pasos. |
gpt-realtime-translate | Intérprete de traducción dedicado (endpoint diferente; véase ejemplo de Traducción en vivo). |
- Transporte: WebSocket (característica
openai) o WebRTC (openai-webrtc, necesitacmake). - Audio: PCM16 de 24 kHz de entrada y salida.
- Voces:
marin(una voz natural GA),alloy, y otras; se establece conRealtimeConfig::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",
));
| Modelo | Uso |
|---|---|
models/gemini-3.1-flash-live-preview | Modelo 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-2025 | Modelo 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-preview | Modelo 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:
Korey otras;with_voice("Kore"). - Autenticación:
GEMINI_API_KEY(oGOOGLE_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. ElGeminiLiveBackend::studio(...)del crate apunta a AI Studio sobre el endpointv1alpha(que es también lo que requiere el diálogo afectivo).
Elegir un modelo
- Voz general + herramientas →
gpt-realtimeogemini-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 razonamiento →
gpt-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-realtime | Gemini 3.1-flash-live | Gemini 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:
| Campo | Contenido |
|---|---|
event_type | El tipo de evento del proveedor que falló |
error | El error de deserialización |
payload.bytes | Tamaño de fotograma en bytes |
payload.digest | Resumen 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.