मल्टीमॉडल: वीडियो इनपुट
एक रीयलटाइम एजेंट देख सकता है। ऑडियो स्ट्रीम के साथ, आप कैमरे (या स्क्रीन) से इमेज फ़्रेम को मॉडल में भेज सकते हैं, ताकि उपयोगकर्ता एजेंट को कुछ दिखा सके — वापसी के लिए एक क्षतिग्रस्त उत्पाद, स्क्रीन पर एक त्रुटि, एक दस्तावेज़ — बजाय इसके कि वह उसका वर्णन करे।
द API
रनर पर एक विधि, जो send_audio को प्रतिबिंबित करती है:
runner.send_video_frame("image/jpeg", &base64_jpeg).await?;
यह निचले-स्तर के RealtimeRunner और RealtimeSession पर सीधे उपलब्ध है। डिफ़ॉल्ट ट्रेट इम्प्लीमेंटेशन एक नो-ऑप है, इसलिए जो प्रोवाइडर/मॉडल विज़ुअल इनपुट स्वीकार नहीं करते हैं, वे फ़्रेम को बस अनदेखा कर देते हैं।
प्रत्येक प्रोवाइडर फ़्रेम को कैसे हैंडल करता है
दो बैकएंड विजन को अलग-अलग तरीके से ट्रीट करते हैं, और इससे यह तय होना चाहिए कि आप कितनी बार फ़्रेम भेजते हैं:
| प्रदाता | तंत्र | ताल |
|---|---|---|
| Gemini Live | निरंतर realtimeInput मीडिया चंक्स | उन्हें स्ट्रीम करें — ~1–2 fps स्वाभाविक है |
| OpenAI Realtime | एक input_image वार्तालाप आइटम पर भाग | स्नैपशॉट — हर कुछ सेकंड में ~1 तक सीमित करें |
Gemini को निरंतर वीडियो के लिए बनाया गया है: फ़्रेम ऑडियो की तरह प्रवाहित होते हैं और मॉडल चलती हुई तस्वीर पर तर्क करता है। OpenAI का रीयलटाइम विजन इमेज-इन-कॉन्टेक्स्ट है: प्रत्येक फ़्रेम एक वार्तालाप आइटम बन जाता है, इसलिए प्रति सेकंड कई भेजने से कॉन्टेक्स्ट भर जाता है और लागत बढ़ जाती है। OpenAI को एक फ़्रेम तब भेजें जब यह उपयोगी हो (उदाहरण के लिए उपयोगकर्ता ने कहा "इसे देखो"), न कि हर टिक पर।
उदाहरण UI इसे एन्कोड करते हैं:
const intervalMs = provider === 'gemini' ? 700 : 2500; // ~1.4 fps vs ~0.4 fps
ब्राउज़र में फ़्रेम कैप्चर करना
कैमरा लें, <video> को एक कैनवास पर ड्रा करें, और अपने WebSocket पर JPEG फ़्रेम भेजें (सर्वर-साइड ब्रिज उन्हें send_video_frame को अग्रेषित करता है):
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 480 } });
video.srcObject = stream;
const canvas = document.createElement('canvas');
setInterval(() => {
if (ws.readyState !== WebSocket.OPEN) return;
canvas.width = 640; canvas.height = 480;
canvas.getContext('2d').drawImage(video, 0, 0, 640, 480);
const data = canvas.toDataURL('image/jpeg', 0.6).split(',')[1]; // strip data: prefix
ws.send(JSON.stringify({ type: 'video_frame', mime: 'image/jpeg', data }));
}, intervalMs);
सर्वर पर, मॉडल को अग्रेषित करें:
ClientMsg::VideoFrame { mime, data } => {
let _ = runner.send_video_frame(&mime, &data).await; // non-fatal on error
}
फ़्रेम को मामूली रखें (640×480, JPEG गुणवत्ता ~0.6) — विजन को पूर्ण रिज़ॉल्यूशन की आवश्यकता नहीं होती है, और छोटे फ़्रेम का मतलब कम विलंबता और लागत होता है।
विजन के लिए प्रॉम्प्ट करना
agent को बताएं कि वह देख सकता है, ताकि वह कैमरे का स्वाभाविक रूप से उपयोग करे:
You can hear the customer and SEE what they show their camera. When they show
you an item (e.g. a damaged product for a return), briefly describe what you see
and use it to help resolve the issue.
इसे आज़माएँ
customer_service उदाहरण में एक कैमरा पैनल है: कैमरा शुरू करें, एक वस्तु को ऊपर उठाएं, और कहें "मैं इसे वापस करना चाहता हूँ — क्या आप इसे देख सकते हैं?"। यह Gemini (निरंतर वीडियो) पर सबसे अच्छा काम करता है; OpenAI पर agent आवधिक स्नैपशॉट पर तर्क करता है।
अगला: भावनात्मक संवाद →