Open in
OpenAI Realtime क्लाइंट्स के साथ ThunderPhone का उपयोग करें
सेव किए गए एजेंट या इनलाइन सेशन कॉन्फ़िगरेशन का उपयोग करके, OpenAI Realtime-संगत सर्वर क्लाइंट को ThunderPhone पर पॉइंट करें।
ThunderPhone, OpenAI Realtime इवेंट मॉडल का एक केंद्रित सबसेट लागू करता है। मौजूदा सर्वर-साइड क्लाइंट, ThunderPhone वॉइस एजेंट का उपयोग करते हुए अपना WebSocket, ऑडियो, सेशन और रिस्पॉन्स इवेंट फ्लो बनाए रख सकता है।
कनेक्ट करने से पहले
आपको ThunderPhone संगठन की सीक्रेट API key और ऐसा सर्वर रनटाइम चाहिए जो WebSockets खोल सके। ब्राउज़र कोड से कनेक्ट न करें और key को ब्राउज़र में एक्सपोज़ न करें। सेव किए हुए एजेंट का उपयोग करने के लिए, पहले उसे डिप्लॉय करें और उसका न्यूमेरिक एजेंट ID कॉपी करें।
इससे कनेक्ट करें:
wss://api.thunderphone.com/v1/realtimeअपने सर्वर से WebSocket अपग्रेड को ऑथेंटिकेट करें:
Authorization: Bearer sk_live_YOUR_API_KEYउन क्लाइंट के लिए क्वेरी-स्ट्रिंग ऑथेंटिकेशन उपलब्ध है जो हैंडशेक हेडर्स सेट नहीं कर सकते, लेकिन URLs के लॉग में लीक होने की संभावना अधिक होती है।
तय करें कि कॉन्फ़िगरेशन का स्वामित्व किसके पास है
| मोड | इसके साथ कनेक्ट करें | कॉन्फ़िगरेशन स्रोत |
|---|---|---|
| सेव किया हुआ एजेंट | ?agent_id=12 | डिप्लॉय किया गया प्रॉम्प्ट, वॉइस, प्रोडक्ट, भाषाएँ, नॉलेज और संगत सर्वर-रन टूल्स |
| इनलाइन | कोई agent_id नहीं | आपके क्लाइंट से स्वीकार किया गया पहला session.update |
सेव किया हुआ एजेंट
डिप्लॉय किए गए एजेंट ID के साथ कनेक्ट करें:
wss://api.thunderphone.com/v1/realtime?agent_id=12सॉकेट कनेक्ट होते समय एजेंट शुरू हो जाता है। उसका अभिवादन उपलब्ध रहता है,
लेकिन Realtime उसके बोले गए साइलेंस चेक-इन्स को अक्षम करता है और transfer_call
तथा send_keypad_input को छोड़ देता है। अन्य संगत टूल्स ThunderPhone पर चलते हैं। इस मोड के लिए
इनलाइन निर्देश या क्लाइंट-एक्ज़ीक्यूटेड टूल्स न भेजें।
एजेंट शुरू होने से पहले input_audio_format,
output_audio_format, input_rate, और output_rate क्वेरी पैरामीटर्स के साथ वायर ऑडियो सेट करें। आप
कनेक्शन के बाद सेव किए गए कॉन्फ़िगरेशन या ऑडियो फॉर्मैट नहीं बदल सकते।
इनलाइन सेशन
agent_id के बिना, session.created की प्रतीक्षा करें, फिर session.update भेजें:
{
"type": "session.update",
"session": {
"type": "realtime",
"instructions": "Answer questions clearly and keep responses brief.",
"audio": {
"input": {
"format": { "type": "audio/pcm", "rate": 24000 }
},
"output": {
"format": { "type": "audio/pcm", "rate": 24000 },
"voice": "olivia"
}
},
"config": {
"product": "bolt"
}
}
}पहला स्वीकार किया गया अपडेट कॉल को प्रोविज़न करता है। session.updated का अर्थ है कि
सेशन लाइव है। इसके बाद निर्देश, वॉइस, प्रोडक्ट, टूल्स और ऑडियो फॉर्मैट नहीं
बदल सकते।
इनलाइन सेशन में कोई ऑटोमैटिक अभिवादन या बोले गए साइलेंस चेक-इन्स नहीं होते। एजेंट को
पहले बोलने के लिए, एक सिस्टम या यूज़र मैसेज जोड़ें और
response.create भेजें। पूरी तरह निष्क्रिय सेशन फिर भी प्लेटफ़ॉर्म की
साइलेंट-कॉल सीमा पर समाप्त हो जाता है, जो डिफ़ॉल्ट रूप से 600 सेकंड है।
आधिकारिक OpenAI SDK का उपयोग करें
/v1 पर समाप्त होने वाला WebSocket बेस URL पास करें; SDK /realtime जोड़ता है।
model वैल्यू एक कंपैटिबिलिटी नाम है और ThunderPhone प्रोडक्ट को नहीं चुनती। प्रोडक्ट को सेशन कॉन्फ़िगरेशन या सेव किए गए एजेंट में चुनें।
यह कनेक्शन जांच एक इनलाइन Bolt सेशन बनाती है, पहले session.updated तक इवेंट प्रिंट करती है, और फिर बंद हो जाती है। ऑडियो स्ट्रीम करने के लिए न्यूनतम Python
क्लाइंट का उपयोग करें।
import asyncio
import os
from openai import AsyncOpenAI
async def main():
client = AsyncOpenAI(
api_key=os.environ["THUNDERPHONE_API_KEY"],
websocket_base_url="wss://api.thunderphone.com/v1",
)
async with client.realtime.connect(
model="thunderphone-realtime"
) as connection:
await connection.session.update(session={
"type": "realtime",
"instructions": "Listen to the caller and help them complete the call.",
"config": {"product": "bolt"},
})
async for event in connection:
print(event.type)
if event.type == "session.updated":
break
if __name__ == "__main__":
asyncio.run(main())इनपुट-ऑडियो जोड़ने, रिस्पॉन्स ऑडियो डेल्टा, इंटरप्शन, फंक्शन कॉल, त्रुटियों और साफ़ सॉकेट बंद करने के लिए अपनी मौजूदा हैंडलिंग रखें। इनलाइन कस्टम फंक्शन आपके क्लाइंट में निष्पादित होते हैं; उनके परिणाम Realtime प्रोटोकॉल के माध्यम से लौटाएं। सेव किए गए एजेंट टूल ThunderPhone पर निष्पादित होते हैं।
सेशन लाइफ़साइकल और विफलताएं
एक WebSocket एक कॉल का प्रतिनिधित्व करता है। अमान्य एजेंट ID या अस्वीकृत इनलाइन कॉन्फ़िगरेशन से error इवेंट बनता है। सेशन को लाइव मानने से पहले session.updated की प्रतीक्षा करें। वास्तविक इनपुट और आउटपुट फॉर्मेट तथा सैंपल रेट घोषित करें: PCM रेट मिसमैच से वैलिडेशन त्रुटि बनने के बजाय ऑडियो बहुत तेज़ या बहुत धीमा चलता है।
सेशन शुरू होने के बाद, आपका एप्लिकेशन पूरा होने पर सॉकेट को साफ़ तरीके से बंद करें। इनलाइन सेशन क्लाइंट द्वारा निष्पादित फंक्शन का उपयोग कर सकते हैं। सेव किए गए एजेंट सेशन कंपैटिबल ThunderPhone-रन टूल का उपयोग करते हैं और ट्रांसफर या कीपैड इनपुट उपलब्ध नहीं कराते।
इंटीग्रेशन का परीक्षण करें
न्यूनतम Python WAV क्लाइंट और उसकी घोषित रेट पर मोनो PCM16 WAV से शुरू करें। सत्यापित करें:
- सर्वर कॉन्फ़िगरेशन स्वीकार करता है और
session.updatedभेजता है। - इनपुट अपेक्षित गति पर ट्रांसक्रिप्ट और रिस्पॉन्स-ऑडियो इवेंट बनाता है।
- इंटरप्शन और रिस्पॉन्स रद्द करना शेष आउटपुट ऑडियो को रोकता है।
- इनलाइन फंक्शन परिणाम या सेव किए गए एजेंट टूल परिणाम मॉडल को लौटते हैं।
- अमान्य इनपुट से
errorइवेंट बनता है जिसे आपका क्लाइंट हैंडल करता है। - आपका क्लाइंट सॉकेट बंद करता है और कॉल कॉल हिस्ट्री में दिखाई देती है।
Realtime WebSocket रेफरेंस स्वीकृत इवेंट, ऑडियो फॉर्मेट, सेशन फ़ील्ड और पूर्ण उदाहरण सूचीबद्ध करता है।
लागत
Realtime कॉल चुने गए प्रोडक्ट की सामान्य प्रति-मिनट दर का उपयोग करती हैं। लाइव ट्रांसक्रिप्ट डेल्टा सक्षम करने पर पूरे सेशन के लिए प्रति-मिनट अधिभार जुड़ता है; दर के लिए लाइव ट्रांसक्रिप्ट और प्रोडक्ट दरों के लिए मूल्य निर्धारण देखें।
POST /v1/realtime/sessions एक अलग प्रबंधित LiveKit पाथ है। यह एक रूम और स्कोप्ड प्रतिभागी टोकन बनाता है; प्रत्यक्ष WebSocket कनेक्शन के लिए इसकी आवश्यकता नहीं है।
फ्रेमवर्क इंटीग्रेशन के लिए, Pipecat से ThunderPhone का उपयोग करें और LiveKit Agents से ThunderPhone का उपयोग करें देखें।