Používanie ThunderPhone z LiveKit Agents
Spustite hlasového agenta ThunderPhone ako model v reálnom čase (z reči na reč) relácie LiveKit Agents s miestnosťami LiveKit, protokolom SIP a telefóniou okolo neho.
LiveKit Agents je open-source framework pre hlasových agentov v reálnom čase nad miestnosťami LiveKit. ThunderPhone sa pripája ako model v reálnom čase: framework odosiela zvuk účastníka, ThunderPhone vracia hlas agenta, prepisy a volania funkcií a miestnosť LiveKit, SIP trunky a telefónia prenášajú zvuk. Rozpoznávanie reči, jazykový model, hlas, striedanie v hovore, 47 jazykov a nástroje bežia v ThunderPhone.
Hovory uskutočnené týmto spôsobom sa zobrazujú v histórii hovorov a účtujú sa podľa sadzby za minútu vášho produktu ako každý iný hovor v reálnom čase. Nie je potrebné predplatné ani telefónne číslo ThunderPhone.
Inštalácia
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyDoplnok používa model OpenAI Realtime od LiveKit, pretože Realtime WebSocket
ThunderPhone používa rovnaký protokol. Vyžaduje livekit-agents vo verzii 1.8 alebo novšej.
Spustenie uloženého agenta
Všetko, čo agent robí (výzva, hlas, engine, jazyky, nástroje, uvítanie, kontroly ticha), sa konfiguruje v ThunderPhone. Relácia iba prenáša zvuk.
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))Uložený agent sa pozdraví a spúšťa vlastné nástroje v ThunderPhone; pokyny a
nástroje Agent v LiveKit sa neodosielajú. Hovor sa skončí, keď agent
ThunderPhone zavesí, a relácia sa spolu s ním ukončí.
Konfigurácia relácie priamo v kóde
Bez agent_id pochádzajú pokyny a nástroje z Agent v LiveKit rovnako ako pri
OpenAI. product vyberá engine a voice vyberá hlas 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 pri začatí hovoru zafixuje pokyny a nástroje, takže
update_instructions, update_tools a odovzdania agentovi, ktoré ich menia,
nie sú počas hovoru podporované. Relácie v kóde sú riadené klientom: agent hovorí,
keď zavoláte generate_reply() alebo keď účastník dokončí svoju repliku.
Možnosti
| Argument | Význam |
|---|---|
api_key | Tajný kľúč (sk_live_...). Predvolene sa používa THUNDERPHONE_API_KEY. |
agent_id | Spustenie uloženého agenta. Vzájomne sa vylučuje s product a voice. |
product | Modul pre relácie vytvorené priamo v kóde: spark, bolt alebo storm. |
voice | Názov hlasu ThunderPhone pre relácie vytvorené priamo v kóde. |
language | Primárna jazyková nápoveda pre relácie vytvorené priamo v kóde, napr. es. |
from_number, to_number | Čísla, ktoré sa majú zaznamenať v hovore, keď miestnosť obsluhuje telefónnu linku. |
live_transcripts | Streamovanie fragmentov prepisu volajúceho počas prejavu (účtuje sa navyše). |
base_url | Prepísanie koncového bodu, predvolene wss://api.thunderphone.com/v1/realtime. |
Udalosti
ThunderPhone pridáva k protokolu realtime udalosti platformy. Relácia ich vysiela:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])Objekt RealtimeSession sprístupní call_id, keď je relácia aktívna. Použite ho s
GET /v1/calls/{call_id} na získanie nahrávky,
prepisu a hodnotenia po hovore. Každá ďalšia udalosť call.* (presmerovanie,
klávesnica, ignorovaná reč) prichádza ako thunderphone_call_event.
Obmedzenia
- Detekcia striedania replík prebieha na strane servera a je vždy aktívna; detekcia striedania replík
na strane frameworku (
turn_detectionvAgentSession) sa ignoruje. - Pokyny a nástroje po začatí hovoru nemožno zmeniť.
- Zvuk je 16-bitové mono PCM pri 24 kHz v oboch smeroch.
- Videorámce sa ignorujú.