Provedores em tempo real
ADK-Rust oferece dois backends em tempo real por trás da mesma interface RealtimeModel,
para que uma aplicação possa oferecer ambos e alternar por sessão. Esta página aborda os
modelos, as vozes, os endpoints, a autenticação e como escolher.
OpenAI em tempo 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 de produção atual de fala para fala e opção padrão. |
gpt-realtime-translate | Interpretador dedicado de tradução (endpoint diferente; consulte o exemplo de tradução ao vivo). |
- Transporte: WebSocket (recurso
openai) ou WebRTC (openai-webrtc, requercmake). - Áudio: PCM16 de 24 kHz na entrada e na saída.
- Vozes:
marin(uma voz GA natural),alloye outras; definidas comRealtimeConfig::with_voice("marin"). - Autenticação:
OPENAI_API_KEY. A chave fica no seu servidor (nunca no 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 live half-cascade. Chama ferramentas de forma confiável e aceita quadros de vídeo. Escolha padrão. |
models/gemini-live-2.5-flash-native-audio | Modelo de áudio nativo — a voz mais natural e o que oferece suporte ao diálogo afetivo. Chamada de ferramentas mais fraca. |
models/gemini-3.5-live-translate-preview | Modelo dedicado de tradução (consulte o exemplo de tradução). |
- Transporte: WebSocket (recurso
gemini, AI Studio) ou Vertex AI Live (vertex-live, OAuth2 / ADC — consulte Agentes em tempo real). - Áudio: PCM16 de 16 kHz entrada, PCM16 de 24 kHz saída.
- Vozes:
Koree outras;with_voice("Kore"). - Autenticação:
GEMINI_API_KEY(ouGOOGLE_API_KEY).
Os nomes dos modelos variam de acordo com o endpoint. O AI Studio (chave API) usa nomes como
models/gemini-3.1-flash-live-preview; o Vertex/Agent Platform usa nomes diferentes. O crateGeminiLiveBackend::studio(...)tem como destino o AI Studio por meio do endpointv1alpha(que também é o usado pelo diálogo afetivo).
Escolhendo um modelo
- Voz geral + ferramentas →
gpt-realtime-2.1ougemini-3.1-flash-live-preview. Ambos chamam ferramentas de forma confiável. Gemini é mais adequado para vídeo contínuo. - Voz mais natural / consciente das emoções → áudio nativo do Gemini
(
gemini-live-2.5-flash-native-audio) com diálogo afetivo — com alguma redução na confiabilidade das chamadas de ferramentas. - Foco intenso em raciocínio →
gpt-realtime-2.1. - Tradução → os modelos dedicados de tradução (com protocolo próprio).
Selecionando um provedor por sessão
Os aplicativos normalmente leem o provedor de uma solicitação e criam o modelo correspondente. As taxas de áudio são diferentes, portanto, exponha-as também:
#[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",
),
})
}
Os exemplos permitem substituir todos esses valores por variáveis de ambiente
(OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL), para que você possa fixar um modelo sem
recompilar.
Matriz de recursos
OpenAI gpt-realtime-2.1 | Gemini 3.1-flash-live | Gemini native-audio | |
|---|---|---|---|
| Voz (áudio de entrada/saída) | ✅ | ✅ | ✅ |
| Transcrições ao vivo | ✅ | ✅ | ✅ |
| Ferramentas do lado do servidor | ✅ (confiável) | ✅ (confiável) | ⚠️ (mais fraco) |
| Quadros de vídeo | ✅ (itens de imagem) | ✅ (contínuo) | ✅ (contínuo) |
| Diálogo afetivo | ❌ | ❌ | ✅ |
Próximo: Ferramentas →
Diagnósticos e privacidade de payloads
Os frames em tempo real contêm transcrições, argumentos de ferramentas, resultados de ferramentas e identificadores. Quando um evento reconhecido não pode ser desserializado — divergência no esquema do provedor — o aviso relata um resumo seguro quanto aos campos e omite o frame:
| Campo | Conteúdo |
|---|---|
event_type | O tipo de evento do provedor que falhou |
error | O erro de desserialização |
payload.bytes | Tamanho do quadro em bytes |
payload.digest | Resumo curto, para correlacionar repetições do mesmo desvio |
payload.raw | <redacted> a menos que o registro de payload esteja compilado |
Nota: o resumo agrupa as linhas de log dentro de uma execução. Ele não é um resumo criptográfico e não é estável entre processos.
Para diagnosticar a divergência com o frame em mãos, compile adk-realtime com o
recurso record-payloads, que registra os primeiros 300 bytes:
[dependencies]
adk-realtime = { version = "2.1.0", features = ["openai", "record-payloads"] }
O recurso fica desativado por padrão e essa é uma escolha deliberada por build, porque a divergência de esquema é exatamente o momento em que os operadores ampliam a coleta e a retenção de logs.