ThunderPhone 2.0 באוויר.בשירות עצמי, החל מ-2¢/דקה.קראו את הודעת ההשקה

Connect tools & data

השתמשו ב-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 first

ThunderPhone מקבע את ההנחיות והכלים כשהשיחה מתחילה, לכן 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 קה״ץ בשני הכיוונים.
  • מתעלמים ממסגרות וידאו.