Open in
ThunderPhone
OpenAI Realtime uyumlu bir sunucu istemcisini, kayıtlı bir yapay zeka ajanı veya satır içi oturum yapılandırması kullanarak ThunderPhone
ThunderPhone, OpenAI Realtime olay modelinin odaklanmış bir alt kümesini uygular. Mevcut bir sunucu tarafı istemcisi, ThunderPhone sesli AI ajanını kullanırken WebSocket, ses, oturum ve yanıt olay akışını koruyabilir.
Bağlanmadan önce
Bir ThunderPhone kuruluş gizli API anahtarına ve WebSocket açabilen bir sunucu çalışma zamanına ihtiyacınız vardır. Tarayıcı kodundan bağlanmayın veya anahtarı tarayıcıya göstermeyin. Kaydedilmiş bir ajanı kullanmak için önce yayına alın ve sayısal ajan kimliğini kopyalayın.
Şuraya bağlanın:
wss://api.thunderphone.com/v1/realtimeWebSocket yükseltmesini sunucunuzdan kimlik doğrulayın:
Authorization: Bearer sk_live_YOUR_API_KEYEl sıkışma başlıklarını ayarlayamayan istemciler için sorgu dizesiyle kimlik doğrulama mevcuttur, ancak URL'lerin günlük dosyalarına sızması daha kolaydır.
Yapılandırmanın sahibini seçin
| Mod | Şununla bağlanın | Yapılandırma kaynağı |
|---|---|---|
| Kaydedilmiş ajan | ?agent_id=12 | Yayına alınmış istem, ses, ürün, diller, bilgi ve uyumlu sunucuda çalıştırılan araçlar |
| Satır içi | agent_id yok | İstemcinizden kabul edilen ilk session.update |
Kaydedilmiş ajan
Yayına alınmış ajan kimliğiyle bağlanın:
wss://api.thunderphone.com/v1/realtime?agent_id=12Ajan, soket bağlanırken başlar. Karşılama mesajı kullanılabilir kalır,
ancak Realtime konuşmalı sessizlik kontrollerini devre dışı bırakır ve transfer_call
ile send_keypad_input öğelerini atlar. Diğer uyumlu araçlar ThunderPhone üzerinde çalışır.
Bu mod için satır içi talimatlar veya istemci tarafından yürütülen araçlar göndermeyin.
Ajan başlamadan önce input_audio_format,
output_audio_format, input_rate ve output_rate sorgu parametreleriyle hat sesini ayarlayın.
Bağlantıdan sonra kaydedilmiş yapılandırmayı veya ses biçimlerini değiştiremezsiniz.
Satır içi oturum
agent_id olmadan session.created öğesini bekleyin, ardından session.update gönderin:
{
"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"
}
}
}Kabul edilen ilk güncelleme çağrıyı hazırlar. session.updated, oturumun
etkin olduğu anlamına gelir. Bu noktadan sonra talimatlar, ses, ürün, araçlar ve ses biçimleri
değiştirilemez.
Satır içi oturumlarda otomatik karşılama veya konuşmalı sessizlik kontrolleri yoktur.
Ajanın önce konuşmasını sağlamak için bir sistem ya da kullanıcı mesajı ekleyin ve
response.create gönderin. Tamamen boşta kalan bir oturum yine de platformun
varsayılan olarak 600 saniye olan sessiz çağrı sınırında sona erer.
Resmi OpenAI SDK'sını kullanın
/v1 ile biten bir WebSocket temel URL'si iletin; SDK /realtime ekler.
model değeri bir uyumluluk adıdır ve ThunderPhone ürününü seçmez.
Ürünü oturum yapılandırmasında veya kaydedilmiş ajanda seçin.
Bu bağlantı kontrolü satır içi bir Bolt oturumu oluşturur, ilk session.updated
olayına kadar olayları yazdırır ve kapanır. Sesi akış olarak iletmek için
minimum Python istemcisini kullanın.
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())Giriş sesi ekleme, yanıt sesi deltaları, kesintiler, işlev çağrıları, hatalar ve temiz soket kapatma için mevcut işlemlerinizi koruyun. Satır içi özel işlevler istemcinizde çalışır; sonuçlarını Realtime protokolü üzerinden döndürün. Kaydedilmiş ajan araçları ThunderPhone üzerinde çalışır.
Oturum yaşam döngüsü ve hatalar
Bir WebSocket bir çağrıyı temsil eder. Geçersiz bir ajan kimliği veya reddedilen
satır içi yapılandırma bir error olayı üretir. Oturumu canlı olarak kabul
etmeden önce session.updated olayını bekleyin. Gerçek giriş ve çıkış
biçimlerini ve örnekleme hızlarını belirtin: PCM hızı uyuşmazlığı, doğrulama
hatası üretmek yerine sesin çok hızlı veya çok yavaş çalınmasına neden olur.
Oturum başladıktan sonra, uygulamanız tamamlandığında soketi temiz şekilde kapatın. Satır içi oturumlar istemcide çalıştırılan işlevleri kullanabilir. Kaydedilmiş ajan oturumları ThunderPhone tarafından çalıştırılan uyumlu araçları kullanır ve aktarma veya tuş takımı girişi sunmaz.
Entegrasyonu test edin
Minimum Python WAV istemcisi ve belirtilen hızında mono PCM16 WAV ile başlayın. Şunları doğrulayın:
- Sunucunun yapılandırmayı kabul ettiğini ve
session.updatedgönderdiğini. - Girdinin, beklenen hızda transkript ve yanıt sesi olayları ürettiğini.
- Kesintinin ve yanıt iptalinin kalan çıkış sesini durdurduğunu.
- Satır içi işlev sonuçlarının veya kaydedilmiş ajan araç sonuçlarının modele döndüğünü.
- Geçersiz girdinin, istemcinizin işlediği bir
errorolayı ürettiğini. - İstemcinizin soketi kapattığını ve çağrının Çağrı geçmişinde göründüğünü.
Realtime WebSocket referansı, kabul edilen olayları, ses biçimlerini, oturum alanlarını ve eksiksiz örnekleri listeler.
Maliyet
Realtime çağrıları, seçilen ürünün normal dakika başına ücretini kullanır. Canlı transkript deltalarını etkinleştirmek, oturumun tamamı için dakika başına ek ücret ekler; ücret için Canlı transkriptler ve ürün ücretleri için Fiyatlandırma bölümüne bakın.
POST /v1/realtime/sessions, ayrı bir yönetilen LiveKit yoludur. Bir oda ve
kapsamlı katılımcı belirteci oluşturur; doğrudan WebSocket bağlantısı için
gerekli değildir.
Çerçeve entegrasyonları için ThunderPhone'u Pipecat ile kullanın ve ThunderPhone'u LiveKit Agents ile kullanın bölümlerine bakın.