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",
));
| Modelo | Uso |
|---|---|
gpt-realtime-2.1 | Modelo actual de producción de voz a voz y opción predeterminada. |
gpt-realtime-translate | Inté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, necesitacmake). - Audio: PCM16 de 24 kHz de entrada y salida.
- Voces:
marin(una voz GA natural),alloyy otras; se configuran conRealtimeConfig::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",
));
| Modelo | Uso |
|---|---|
models/gemini-3.1-flash-live-preview | Modelo 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-audio | Modelo 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-preview | Modelo 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:
Korey otras;with_voice("Kore"). - Autenticación:
GEMINI_API_KEY(oGOOGLE_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 crateGeminiLiveBackend::studio(...)se dirige a AI Studio a través del endpointv1alpha(que también es el que requiere el diálogo afectivo).
Elegir un modelo
- Voz general + herramientas →
gpt-realtime-2.1ogemini-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 intensivo →
gpt-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.1 | Gemini 3.1-flash-live | Gemini 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:
| Campo | Contenido |
|---|---|
event_type | El tipo de evento del proveedor que falló |
error | El error de deserialización |
payload.bytes | Tamaño de trama en bytes |
payload.digest | Resumen 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.