ThunderPhone 2.0 yayında.Kendi başınıza kullanmaya başlayın; dakikada 2¢'den başlayan fiyatlarla.Duyuruyu okuyun

Connect tools & data

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 key

Eklenti, 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 first

ThunderPhone, 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şkenAnlamı
api_keyGizli anahtar (sk_live_...). Varsayılan olarak THUNDERPHONE_API_KEY kullanılır.
agent_idKaydedilmiş bir ajanı çalıştırır. product ve voice ile birlikte kullanılamaz.
productSatır içi oturumlar için motor: spark, bolt veya storm.
voiceSatır içi oturumlar için ThunderPhone ses adı.
languageSatır içi oturumlar için birincil dil ipucu; örneğin es.
from_number, to_numberOda bir telefon hattı üzerinden çalıştığında çağrıda kaydedilecek numaralar.
live_transcriptsArayanın transkript parçalarını ifade sürerken akış olarak gönderir (ek ücretlendirilir).
base_urlUç 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 üzerindeki turn_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.