रियलटाइम प्रदाता

ADK-Rust एक ही RealtimeModel इंटरफ़ेस के पीछे दो रियलटाइम बैकएंड्स का समर्थन करता है, ताकि एक एप्लिकेशन दोनों की पेशकश कर सके और प्रति session स्विच कर सके। यह पेज models, voices, endpoints, auth, और चयन करने के तरीके को कवर करता है।

OpenAI रियलटाइम (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)
));
मॉडलउपयोग
gpt-realtimeGA speech-to-speech model। तेज, मजबूत tool use। डिफ़ॉल्ट विकल्प।
gpt-realtime-2Reasoning variant — जटिल बहु-चरणीय requests के लिए बेहतर।
gpt-realtime-translateसमर्पित अनुवाद दुभाषिया (अलग endpoint; लाइव अनुवाद उदाहरण देखें)।
  • ट्रांसपोर्ट: WebSocket (openai feature) या WebRTC (openai-webrtc, needs cmake).
  • ऑडियो: 24 kHz PCM16 in और out.
  • वॉइसेज़: marin (एक प्राकृतिक GA voice), alloy, और अन्य; इसे RealtimeConfig::with_voice("marin") के साथ सेट करें।
  • Auth: OPENAI_API_KEY. की आपके server पर रहती है (कभी भी browser पर नहीं).

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",
));
मॉडलउपयोग
models/gemini-3.1-flash-live-previewहाफ-कैस्केड लाइव मॉडल। टूल्स को विश्वसनीय रूप से कॉल करता है और वीडियो फ़्रेम स्वीकार करता है। डिफ़ॉल्ट विकल्प।
models/gemini-2.5-flash-native-audio-preview-12-2025नेटिव-ऑडियो मॉडल — सबसे प्राकृतिक आवाज़, और वही जो भावात्मक संवाद का समर्थन करता है। टूल कॉलिंग कमज़ोर है।
models/gemini-3.5-live-translate-previewसमर्पित अनुवाद मॉडल (देखें अनुवाद उदाहरण).
  • ट्रांसपोर्ट: WebSocket (gemini सुविधा, AI Studio) या Vertex AI Live (vertex-live, OAuth2 / ADC — देखें Realtime Agents).
  • ऑडियो: 16 kHz PCM16 in, 24 kHz PCM16 out.
  • वॉयस: Kore और अन्य; with_voice("Kore").
  • प्रमाणीकरण: GEMINI_API_KEY (या GOOGLE_API_KEY).

मॉडल नाम endpoint के अनुसार अलग होते हैं। AI Studio (API-key) models/gemini-3.1-flash-live-preview जैसे नामों का उपयोग करता है; Vertex/Agent Platform अलग नामों का उपयोग करता है। क्रेट का GeminiLiveBackend::studio(...) AI Studio को v1alpha endpoint के माध्यम से लक्षित करता है (यही वह भी है जिसकी affective dialogue को आवश्यकता होती है)।

मॉडल चुनना

  • सामान्य वॉयस + टूल्सgpt-realtime या gemini-3.1-flash-live-preview। दोनों भरोसेमंद तरीके से tools कॉल करते हैं। Gemini continuous video के लिए बेहतर विकल्प है।
  • सबसे प्राकृतिक वॉयस / भावना-सचेत → Gemini native-audio (gemini-2.5-flash-native-audio-*) के साथ affective dialogue — हालांकि इससे tool-calling की विश्वसनीयता कुछ कम हो सकती है।
  • रीज़निंग-भारीgpt-realtime-2.
  • अनुवाद → समर्पित translate models (अपना protocol)।

प्रति session provider चुनना

Applications आम तौर पर request से provider पढ़ते हैं और मिलान करने वाला model बनाते हैं। audio rates अलग होती हैं, इसलिए उन्हें भी expose करें:

#[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",
        ),
    })
}

उदाहरण इन सभी को env vars (OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL) के साथ overridable बनाते हैं ताकि आप बिना recompiling किए model pin कर सकें।

क्षमता matrix

OpenAI gpt-realtimeGemini 3.1-flash-liveGemini native-audio
आवाज़ (ऑडियो इन/आउट)
लाइव प्रतिलिपियाँ
सर्वर-पक्षी टूल्स✅ (विश्वसनीय)✅ (विश्वसनीय)⚠️ (कमज़ोर)
वीडियो फ़्रेम✅ (छवि आइटम)✅ (निरंतर)✅ (निरंतर)
भावात्मक संवाद

अगला: टूल्स →

डायग्नोस्टिक्स और पेलोड गोपनीयता

रीयलटाइम फ़्रेम्स में ट्रांसक्रिप्ट, टूल आर्ग्युमेंट्स, टूल परिणाम, और पहचानकर्ता होते हैं। जब कोई पहचाना गया इवेंट deserialize होने में विफल होता है — provider schema drift — तो चेतावनी एक field-safe सारांश रिपोर्ट करती है और फ़्रेम को रोक देती है:

फ़ील्डसामग्री
event_typeविफल हुआ प्रदाता इवेंट प्रकार
errorडिसीरियलाइज़ेशन त्रुटि
payload.bytesबाइट्स में फ़्रेम आकार
payload.digestएक छोटा डाइजेस्ट, समान ड्रिफ्ट की पुनरावृत्तियों को सहसंबद्ध करने के लिए
payload.raw<redacted> जब तक payload recording संकलित न हो

नोट: digest एक run के भीतर log lines को समूहित करता है। यह cryptographic digest नहीं है और processes के बीच स्थिर नहीं रहता।

frame in hand के साथ drift का निदान करने के लिए, adk-realtime को record-payloads feature के साथ compile करें, जो पहले 300 bytes रिकॉर्ड करता है:

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

यह feature डिफ़ॉल्ट रूप से बंद रहता है और प्रति build एक जानबूझकर किया गया विकल्प है, क्योंकि schema drift वही समय होता है जब operators log collection और retention को बढ़ाते हैं।