ThunderPhone
ThunderPhone sesli AI ajanını, LiveKit odaları, SIP ve telefon altyapısıyla çevrelenmiş bir LiveKit Agents oturumunun gerçek zamanlı (konuşmadan konuşmaya) modeli olarak çalıştırın.
LiveKit Agents, LiveKit odaları üzerinde çalışan gerçek zamanlı sesli AI ajanları için açık kaynaklı bir çerçevedir. ThunderPhone, gerçek zamanlı model olarak entegre edilir: çerçeve katılımcının sesini gönderir, ThunderPhone ajanın sesini, transkriptleri ve fonksiyon çağrılarını döndürür; LiveKit odası, SIP trunk'ları ve telefon altyapısı sesi iletir. Konuşma tanıma, dil modeli, ses, sıra alma, 47 dil ve araçların tümü ThunderPhone üzerinde çalışır.
Bu şekilde yapılan aramalar, diğer tüm gerçek zamanlı aramalar gibi arama geçmişinde görünür ve ürününüzün dakika başına ücreti üzerinden faturalandırılır. Abonelik veya ThunderPhone telefon numarası gerekmez.
Yükleme
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyEklenti, ThunderPhone'un Realtime WebSocket özelliği aynı protokolü kullandığı için LiveKit'in OpenAI Realtime modelini sarmalar. livekit-agents 1.8 veya daha yeni bir sürüm gerektirir.
Kaydedilmiş bir ajanı çalıştırma
Ajanın yaptığı her şey (istem, ses, motor, diller, araçlar, karşılama, sessizlik yoklamaları) ThunderPhone üzerinde yapılandırılır. Oturum yalnızca sesi iletir.
from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli
from livekit.plugins import thunderphone
async def entrypoint(ctx: JobContext):
session = AgentSession(llm=thunderphone.RealtimeModel(agent_id=12))
await session.start(agent=Agent(instructions=""), room=ctx.room)
if __name__ == "__main__":
cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))Kaydedilmiş bir yapay zeka ajanı ThunderPhone üzerinde karşılar ve kendi araçlarını çalıştırır; LiveKit Agent nesnesinin yönergeleri ve araçları gönderilmez. ThunderPhone ajanı aramayı kapattığında arama sona erer ve oturum da onunla birlikte kapanır.
Oturumu satır içinde yapılandırma
agent_id olmadan, yönergeler ve araçlar OpenAI'de olduğu gibi LiveKit Agent nesnesinden gelir. product motoru, voice ise ThunderPhone sesini seçer.
from livekit.agents import Agent, AgentSession, RunContext, function_tool
from livekit.plugins import thunderphone
class Receptionist(Agent):
def __init__(self):
super().__init__(instructions="You are Acme Dental's receptionist. Be brief.")
@function_tool
async def check_availability(self, context: RunContext, date: str) -> dict:
"""Free appointment slots on a date."""
return {"slots": await calendar.free_slots(date)}
async def entrypoint(ctx: JobContext):
session = AgentSession(
llm=thunderphone.RealtimeModel(product="bolt", voice="olivia", language="es"),
)
await session.start(agent=Receptionist(), room=ctx.room)
await session.generate_reply() # the agent speaks firstThunderPhone, arama başladığında yönergeleri ve araçları sabitler; bu nedenle update_instructions, update_tools ve bunları değiştiren ajan devirleri arama sırasında desteklenmez. Satır içi oturumlar istemci tarafından yönlendirilir: ajan, generate_reply() çağrıldığında veya katılımcı konuşma sırasını tamamladığında konuşur.
Seçenekler
| Bağımsız değişken | Anlamı |
|---|---|
api_key | Gizli anahtar (sk_live_...). Varsayılan olarak THUNDERPHONE_API_KEY kullanılır. |
agent_id | Kaydedilmiş bir ajanı çalıştırır. product ve voice ile birlikte kullanılamaz. |
product | Satır içi oturumlar için motor: spark, bolt veya storm. |
voice | Satır içi oturumlar için ThunderPhone ses adı. |
language | Satır içi oturumlar için birincil dil ipucu; örneğin es. |
from_number, to_number | Oda bir telefon hattı üzerinden çalıştığında çağrıda kaydedilecek numaralar. |
live_transcripts | Arayanın transkript parçalarını ifade sürerken akış olarak gönderir (ek ücretlendirilir). |
base_url | Uç nokta geçersiz kılma; varsayılan değer wss://api.thunderphone.com/v1/realtime. |
Olaylar
ThunderPhone, gerçek zamanlı protokolün üzerine platform olayları ekler. Oturum bu olayları gönderir:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])RealtimeSession, oturum etkin olduğunda call_id değerini sunar. Çağrıdan
sonra kaydı, transkripti ve değerlendirmeyi almak için bunu
GET /v1/calls/{call_id} ile kullanın. Diğer tüm
call.* olayları (aktarma, tuş takımı, konuşmanın yok sayılması)
thunderphone_call_event olarak gelir.
Sınırlar
- Sıra algılama sunucu tarafındadır ve her zaman etkindir; çerçeve tarafındaki
sıra algılama (
AgentSessionüzerindekiturn_detection) yok sayılır. - Çağrı başladıktan sonra talimatlar ve araçlar değiştirilemez.
- Ses, her iki yönde de 24 kHz'de 16 bit mono PCM'dir.
- Video kareleri yok sayılır.