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 keyPlugin 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 firstThunderPhone 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
| Argumen | Makna |
|---|---|
api_key | Kunci rahasia (sk_live_...). Secara default menggunakan THUNDERPHONE_API_KEY. |
agent_id | Jalankan agen tersimpan. Saling eksklusif dengan product dan voice. |
product | Mesin untuk sesi inline: spark, bolt, atau storm. |
voice | Nama suara ThunderPhone untuk sesi inline. |
language | Petunjuk bahasa utama untuk sesi inline, misalnya es. |
from_number, to_number | Nomor yang akan direkam pada panggilan saat room mengelola saluran telepon. |
live_transcripts | Streaming fragmen transkrip penelepon di tengah ujaran (dikenakan biaya tambahan). |
base_url | Penggantian 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_detectionpadaAgentSession) 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.