ThunderPhone 2.0 kini resmi hadir.Layanan mandiri, mulai dari 2¢/menit.Baca pengumumannya

Connect tools & data

Gunakan ThunderPhone dari LiveKit Agents

Jalankan agen suara ThunderPhone sebagai model realtime (ucapan-ke-ucapan) dalam sesi LiveKit Agents, dengan room LiveKit, SIP, dan teleponi di sekelilingnya.

LiveKit Agents adalah framework sumber terbuka untuk agen suara realtime di atas ruang LiveKit. ThunderPhone terintegrasi sebagai model realtime: framework mengirim audio peserta, ThunderPhone mengembalikan suara agen, transkrip, dan panggilan fungsi, sementara ruang LiveKit, trunk SIP, dan teleponi meneruskan audio. Pengenalan suara, model bahasa, suara, pengaturan giliran, 47 bahasa, dan alat semuanya berjalan di ThunderPhone.

Panggilan yang dilakukan dengan cara ini muncul di riwayat panggilan dan ditagihkan berdasarkan tarif per menit produk Anda seperti panggilan realtime lainnya. Tidak ada langganan dan tidak ada nomor telepon ThunderPhone yang digunakan.

Instal

pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_...   # a secret API key

Plugin ini membungkus model OpenAI Realtime LiveKit, karena Realtime WebSocket ThunderPhone menggunakan protokol yang sama. Plugin ini memerlukan livekit-agents versi 1.8 atau yang lebih baru.

Jalankan agen tersimpan

Semua yang dilakukan agen (Prompt, suara, mesin, bahasa, alat, sapaan, check-in saat hening) dikonfigurasi di ThunderPhone. Sesi hanya meneruskan audio.

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))

Agen tersimpan menyapa dan menjalankan alatnya sendiri di ThunderPhone; instruksi dan alat Agent LiveKit tidak dikirim. Panggilan berakhir saat agen ThunderPhone menutup panggilan, dan sesi ditutup bersamanya.

Konfigurasikan sesi secara inline

Tanpa agent_id, instruksi dan alat berasal dari Agent LiveKit, sama seperti untuk OpenAI. product memilih mesin dan voice memilih suara ThunderPhone.

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 mengunci instruksi dan alat saat panggilan dimulai, sehingga update_instructions, update_tools, dan pengalihan agen yang mengubahnya tidak didukung di tengah panggilan. Sesi inline dikendalikan oleh klien: agen berbicara saat Anda memanggil generate_reply() atau saat peserta menyelesaikan satu giliran.

Opsi

ArgumenMakna
api_keyKunci rahasia (sk_live_...). Secara default menggunakan THUNDERPHONE_API_KEY.
agent_idJalankan agen tersimpan. Saling eksklusif dengan product dan voice.
productMesin untuk sesi inline: spark, bolt, atau storm.
voiceNama suara ThunderPhone untuk sesi inline.
languagePetunjuk bahasa utama untuk sesi inline, misalnya es.
from_number, to_numberNomor yang akan direkam pada panggilan saat room mengelola saluran telepon.
live_transcriptsStreaming fragmen transkrip penelepon di tengah ujaran (dikenakan biaya tambahan).
base_urlPenggantian endpoint, default wss://api.thunderphone.com/v1/realtime.

Peristiwa

ThunderPhone menambahkan peristiwa platform di atas protokol realtime. Sesi mengeluarkannya:

@session.llm.session.on("thunderphone_call_ended")  # or on the RealtimeSession you hold
def on_call_ended(event):
    print("call ended:", event["reason"])

RealtimeSession mengekspos call_id setelah sesi aktif. Gunakan dengan GET /v1/calls/{call_id} untuk mengambil rekaman, transkrip, dan nilai setelah panggilan. Setiap peristiwa call.* lainnya (transfer, keypad, ucapan diabaikan) tiba sebagai thunderphone_call_event.

Batasan

  • Deteksi giliran dilakukan di sisi server dan selalu aktif; deteksi giliran di sisi framework (turn_detection pada AgentSession) diabaikan.
  • Instruksi dan tools tidak dapat diubah setelah panggilan dimulai.
  • Audio menggunakan PCM mono 16-bit pada 24 kHz di kedua arah.
  • Frame video diabaikan.