ใช้ ThunderPhone จาก LiveKit Agents
เรียกใช้เอเจนต์เสียง ThunderPhone เป็นโมเดลแบบเรียลไทม์ (เสียงสู่เสียง) ของเซสชัน LiveKit Agents พร้อม LiveKit rooms, SIP และระบบโทรศัพท์โดยรอบ
LiveKit Agents เป็นเฟรมเวิร์กโอเพนซอร์ส สำหรับเอเจนต์เสียงแบบเรียลไทม์บนห้อง LiveKit ThunderPhone ทำงานเป็น โมเดลเรียลไทม์: เฟรมเวิร์กส่งเสียงของผู้เข้าร่วม ThunderPhone ส่งกลับเสียงของเอเจนต์ ทรานสคริปต์ และการเรียกใช้ฟังก์ชัน ขณะที่ห้อง LiveKit SIP trunk และระบบโทรศัพท์ทำหน้าที่ส่งผ่านเสียง ระบบรู้จำเสียง โมเดลภาษา เสียง การผลัดกันพูด 47 ภาษา และเครื่องมือทั้งหมดทำงานบน ThunderPhone
สายที่โทรด้วยวิธีนี้จะแสดงในประวัติการโทรและ คิดค่าบริการตามอัตราต่อนาทีของผลิตภัณฑ์คุณ เช่นเดียวกับสายเรียลไทม์อื่นๆ ไม่มีค่าสมัครสมาชิก และไม่เกี่ยวข้องกับหมายเลขโทรศัพท์ ThunderPhone
ติดตั้ง
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyปลั๊กอินนี้ครอบโมเดล OpenAI Realtime ของ LiveKit เนื่องจาก
Realtime WebSocketของ ThunderPhone ใช้โปรโตคอลเดียวกัน
ต้องใช้ livekit-agents เวอร์ชัน 1.8 หรือใหม่กว่า
เรียกใช้เอเจนต์ที่บันทึกไว้
ทุกสิ่งที่เอเจนต์ทำ ได้แก่ พรอมป์ต์ เสียง เอนจิน ภาษา เครื่องมือ ข้อความทักทาย และการตรวจสอบระหว่างเงียบ จะกำหนดค่าบน ThunderPhone เซสชันทำหน้าที่ส่งผ่านเสียงเท่านั้น
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))เอเจนต์ที่บันทึกไว้จะทักทายและเรียกใช้เครื่องมือของตัวเองบน ThunderPhone
โดยจะไม่ส่งคำสั่งและเครื่องมือของ Agent ใน LiveKit สายจะสิ้นสุดเมื่อ
เอเจนต์ ThunderPhone วางสาย และเซสชันจะปิดพร้อมกัน
กำหนดค่าเซสชันแบบอินไลน์
หากไม่มี agent_id คำสั่งและเครื่องมือจะมาจาก Agent ของ LiveKit
เช่นเดียวกับ OpenAI product ใช้เลือกเอนจิน และ voice ใช้เลือกเสียงของ
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 จะล็อกคำสั่งและเครื่องมือเมื่อสายเริ่มต้น จึงไม่รองรับ
update_instructions, update_tools และการส่งต่อเอเจนต์ที่เปลี่ยนสิ่งเหล่านี้
ระหว่างสาย เซสชันแบบอินไลน์ถูกควบคุมโดยไคลเอนต์: เอเจนต์จะพูดเมื่อคุณเรียก
generate_reply() หรือเมื่อผู้เข้าร่วมพูดจบหนึ่งรอบ
ตัวเลือก
| อาร์กิวเมนต์ | ความหมาย |
|---|---|
api_key | คีย์ลับ (sk_live_...) ค่าเริ่มต้นคือ THUNDERPHONE_API_KEY |
agent_id | เรียกใช้เอเจนต์ที่บันทึกไว้ ใช้ร่วมกับ product และ voice ไม่ได้ |
product | เอนจินสำหรับเซสชันแบบอินไลน์: spark, bolt หรือ storm |
voice | ชื่อเสียงของ ThunderPhone สำหรับเซสชันแบบอินไลน์ |
language | คำแนะนำภาษาหลักสำหรับเซสชันแบบอินไลน์ เช่น es |
from_number, to_number | หมายเลขที่จะบันทึกในการโทร เมื่อห้องทำหน้าที่รับสายสำหรับสายโทรศัพท์ |
live_transcripts | สตรีมส่วนย่อยของข้อความถอดเสียงผู้โทรระหว่างที่ยังพูดไม่จบ (คิดค่าบริการเพิ่ม) |
base_url | แทนที่ปลายทาง ค่าเริ่มต้นคือ wss://api.thunderphone.com/v1/realtime |
เหตุการณ์
ThunderPhone เพิ่มเหตุการณ์ของแพลตฟอร์มเหนือโปรโตคอลเรียลไทม์ เซสชัน จะส่งเหตุการณ์เหล่านี้:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])RealtimeSession จะแสดง call_id เมื่อเซสชันเริ่มใช้งาน ใช้ร่วมกับ
GET /v1/calls/{call_id} เพื่อดึงข้อมูลการบันทึกเสียง
ข้อความถอดเสียง และคะแนนประเมินหลังการโทร เหตุการณ์ call.* อื่นทั้งหมด (โอนสาย
แป้นกด ละเว้นเสียงพูด) จะมาถึงในรูปแบบ thunderphone_call_event
ข้อจำกัด
- การตรวจจับเทิร์นทำงานฝั่งเซิร์ฟเวอร์และเปิดใช้งานเสมอ ระบบจะละเว้นการตรวจจับเทิร์น
ฝั่งเฟรมเวิร์ก (
turn_detectionบนAgentSession) - ไม่สามารถเปลี่ยนคำสั่งและเครื่องมือได้เมื่อเริ่มการโทรแล้ว
- เสียงเป็น PCM โมโน 16 บิต ที่ 24 kHz ทั้งสองทิศทาง
- ระบบจะละเว้นเฟรมวิดีโอ