השתמשו ב-ThunderPhone מתוך LiveKit Agents
הפעילו סוכן קולי של ThunderPhone כמודל בזמן אמת (דיבור לדיבור) של הפעלת LiveKit Agents, עם חדרי LiveKit, SIP וטלפוניה סביבו.
LiveKit Agents היא מסגרת קוד פתוח לסוכנים קוליים בזמן אמת המבוססת על חדרי LiveKit. ThunderPhone משתלב כמודל בזמן אמת: המסגרת שולחת את האודיו של המשתתף, ThunderPhone מחזיר את קול הסוכן, תמלולים וקריאות פונקציה, והחדר, חיבורי ה-SIP והטלפוניה של LiveKit מעבירים את האודיו. זיהוי הדיבור, מודל השפה, הקול, ניהול התורות, 47 השפות והכלים פועלים כולם ב-ThunderPhone.
שיחות שמתבצעות בדרך זו מופיעות בהיסטוריית השיחות ומחויבות לפי התעריף לדקה של המוצר שלכם, כמו כל שיחה אחרת בזמן אמת. אין מנוי ואין צורך במספר טלפון של ThunderPhone.
התקינו
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyהתוסף עוטף את מודל OpenAI Realtime של LiveKit, משום ש-Realtime WebSocket
של ThunderPhone מדבר באותו פרוטוקול. נדרשת גרסה 1.8 או חדשה יותר של
livekit-agents.
הריצו סוכן שמור
כל מה שהסוכן עושה (הנחיה, קול, מנוע, שפות, כלים, ברכה, בדיקות שקט) מוגדר ב-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 קה״ץ בשני הכיוונים.
- מתעלמים ממסגרות וידאו.