रीयलटाइम और मल्टीमॉडल एजेंट
ऐसे एजेंट बनाएं जो वास्तविक समय में बात करते हैं, सुनते हैं, देखते हैं और कार्य करते हैं — लाइव, कम-विलंबता वाले कनेक्शन पर OpenAI के Realtime API या Google के Gemini Live API से।
एक रीयलटाइम एजेंट अनुरोध/प्रतिक्रिया चैटबॉट नहीं है। यह एक खुला सेशन रखता है: उपयोगकर्ता का माइक्रोफ़ोन लगातार स्ट्रीम करता है, मॉडल ऑडियो + एक लाइव प्रतिलेख वापस स्ट्रीम करता है, यह पता लगाता है कि उपयोगकर्ता कब बोलना शुरू और बंद करता है, इसे वाक्य के बीच में बाधित किया जा सकता है (बार्ज-इन), यह कैमरे से फ़्रेम देख सकता है, और यह आपके टूल को कॉल कर सकता है और परिणाम बोल सकता है — यह सब "कॉल" समाप्त किए बिना।
ADK-Rust में नए हैं? पहले परिचय और त्वरित शुरुआत पढ़ें। यह अनुभाग मानता है कि आप जानते हैं कि एक agent, tool और session क्या हैं।
आप क्या बना सकते हैं
| क्षमता | इसका क्या मतलब है | पृष्ठ |
|---|---|---|
| ध्वनि वार्तालाप | VAD और बार्ज-इन के साथ द्विदिशीय PCM16 ऑडियो | आर्किटेक्चर |
| दो प्रदाता, एक API | OpenAI रियलटाइम (GA) या Gemini Live, प्रति सत्र विनिमेय | प्रदाता |
| सर्वर-साइड टूल | मॉडल process_refund(...) को कॉल करता है; आपका Rust इसे चलाता है और मॉडल परिणाम बोलता है | टूल |
| मल्टीमॉडल विजन | कैमरा फ़्रेम स्ट्रीम करें — एजेंट देखता है कि उपयोगकर्ता उसे क्या दिखाता है | मल्टीमॉडल |
| भावनात्मक संवाद | एजेंट उपयोगकर्ता के भावनात्मक स्वर को पढ़ता है और अनुकूलन करता है (Gemini native-audio) | भावनात्मक संवाद |
| दीर्घकालिक स्मृति | एक ज्ञान ग्राफ जिसे एजेंट सत्र की शुरुआत में पढ़ता है और सीखने के साथ-साथ उसे क्यूरेट करता है | स्मृति |
| वेब ऐप्स | एक ब्राउज़र फ्रंट-एंड (माइक + कैमरा) जो आपके सर्वर के माध्यम से जुड़ा हुआ है | वेब ऐप्स बनाना |
फिर चार चलाने योग्य उदाहरण ऐप्स देखें।
मानसिक मॉडल
इसमें दो परतें हैं, और अधिकांश एप्लिकेशन शीर्ष वाली का उपयोग करते हैं:
IntegratedRealtimeRunner ← sessions, memory, tools, plugins (use this)
│ wraps
RealtimeRunner ← event loop + tool dispatch
│ drives
RealtimeSession (a transport) ← the live WebSocket to the provider
│ created by
RealtimeModel (OpenAI | Gemini)
- एक
RealtimeModel(जैसेOpenAIRealtimeModel,GeminiRealtimeModel) जानता है कि कैसेconnect()और एकRealtimeSession— लाइव transport — उत्पन्न करे। RealtimeRunnerउस session का मालिक है: यह events को पंप करता है, और जब model किसी tool के लिए पूछता है तो यह handler को निष्पादित करता है और परिणाम वापस भेजता है।IntegratedRealtimeRunnerrunner को रैप करता है और इसे ADK के बाकी हिस्सों से जोड़ता है —SessionService(transcript persistence),MemoryService(recall + storage),EnhancedPluginManager(hooks), और एक ब्रिज जो किसी भीadk-coreToolको realtime session में चलाने देता है। उदाहरण इसी का उपयोग करते हैं।
(एक उच्च-स्तरीय RealtimeAgent भी है जो सरल केवल-वॉयस agents और सीधे transports — WebRTC, LiveKit, Vertex AI Live — के लिए है, जो वहाँ प्रलेखित है।)
स्थापित करें
# Voice + tools + the integration layer (recommended)
adk-realtime = { version = "2.0.0", features = ["openai", "gemini", "integration"] }
| विशेषता | जोड़ता है |
|---|---|
openai | OpenAI वास्तविक समय (WebSocket) |
gemini | Gemini Live (WebSocket) |
integration | IntegratedRealtimeRunner — सत्र, मेमोरी, प्लगइन्स, टूल ब्रिज |
openai-webrtc | OpenAI WebRTC पर (cmake की आवश्यकता है) |
vertex-live | Gemini via Vertex AI Live (OAuth2 / ADC) |
livekit | LiveKit WebRTC ब्रिज |
60-सेकंड की त्वरित शुरुआत
एक हेडलेस वॉयस टर्न: कनेक्ट करें, टेक्स्ट द्वारा पूछें, और स्ट्रीम किए गए उत्तर को पंप करें।
use adk_realtime::config::{RealtimeConfig, VadConfig};
use adk_realtime::events::ServerEvent;
use adk_realtime::integration::{IntegratedRealtimeRunner, IntegrationConfig};
use adk_realtime::model::BoxedModel;
use adk_realtime::openai::OpenAIRealtimeModel;
use adk_session::{CreateRequest, InMemorySessionService, SessionService};
use std::sync::Arc;
# async fn run() -> anyhow::Result<()> {
let model: BoxedModel = Arc::new(OpenAIRealtimeModel::new(
std::env::var("OPENAI_API_KEY")?,
"gpt-realtime",
));
let config = RealtimeConfig::default()
.with_instruction("You are a friendly assistant. Keep replies short.")
.with_voice("marin")
.with_audio_only()
.with_vad(VadConfig::server_vad()) // model decides turn boundaries
.with_transcription(); // emit a text transcript too
let sessions = Arc::new(InMemorySessionService::new());
sessions.create(CreateRequest {
app_name: "demo".into(), user_id: "u1".into(),
session_id: Some("s1".into()), state: Default::default(),
}).await?;
let runner = IntegratedRealtimeRunner::builder()
.model(model)
.config(config)
.identity("demo", "u1", "s1")
.session_service(sessions)
.integration_config(IntegrationConfig::default())
.build()?;
runner.connect().await?;
runner.send_text("Say hello in one short sentence.").await?;
runner.create_response().await?; // text input needs an explicit trigger
while let Some(event) = runner.next_event().await {
match event? {
ServerEvent::TranscriptDelta { delta, .. } => print!("{delta}"),
ServerEvent::AudioDelta { .. } => { /* PCM16 to play */ }
ServerEvent::ResponseDone { .. } => break,
_ => {}
}
}
runner.close().await?;
# Ok(()) }
एक वास्तविक ऐप में आप माइक्रोफ़ोन ऑडियो को runner.send_audio(base64_pcm16) के बजाय send_text के साथ स्ट्रीम करते हैं, और सर्वर VAD स्वचालित रूप से प्रतिक्रियाओं को संचालित करता है — किसी create_response() की आवश्यकता नहीं है। देखें वेब ऐप्स बनाना।
आगे कहाँ जाएँ
- आर्किटेक्चर — कैसे टुकड़े फिट होते हैं, इवेंट लूप, ऑडियो पाइपलाइन।
- प्रदाता — OpenAI बनाम Gemini models, आवाज़ें, एंडपॉइंट्स, प्रमाणीकरण।
- टूल्स — सर्वर-साइड फ़ंक्शन कॉलिंग।
- मल्टीमॉडल — वीडियो फ़्रेम भेजना।
- भावनात्मक संवाद — भावना-जागरूक प्रतिक्रियाएँ।
- मेमोरी — नॉलेज-ग्राफ दीर्घकालिक मेमोरी।
- वेब ऐप्स बनाना — ब्राउज़र ब्रिज।
- उदाहरण — चार चलाने योग्य ऐप्स।