Utilizați ThunderPhone din LiveKit Agents
Rulați un agent vocal ThunderPhone ca model în timp real (vorbire-la-vorbire) într-o sesiune LiveKit Agents, cu camere LiveKit, SIP și telefonie în jurul acestuia.
LiveKit Agents este un cadru open-source pentru agenți vocali în timp real bazat pe camere LiveKit. ThunderPhone se integrează ca model în timp real: cadrul trimite sunetul participantului, ThunderPhone returnează vocea agentului, transcrierile și apelurile de funcții, iar camerele LiveKit, trunchiurile SIP și telefonia transportă sunetul. Recunoașterea vorbirii, modelul de limbaj, vocea, gestionarea schimburilor de replici, 47 de limbi și instrumentele rulează toate pe ThunderPhone.
Apelurile efectuate astfel apar în istoricul apelurilor și sunt facturate la tariful pe minut al produsului dumneavoastră, la fel ca orice alt apel în timp real. Nu există abonament și nu este implicat niciun număr de telefon ThunderPhone.
Instalare
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyPluginul încorporează modelul OpenAI Realtime al LiveKit, deoarece
Realtime WebSocket de la ThunderPhone utilizează același protocol. Acesta
necesită livekit-agents 1.8 sau o versiune mai nouă.
Rulați un agent salvat
Tot ce face agentul (prompt, voce, motor, limbi, instrumente, salut, verificări în perioadele de tăcere) este configurat în ThunderPhone. Sesiunea doar transportă sunetul.
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))Un agent salvat salută și își rulează propriile instrumente în ThunderPhone; instrucțiunile
și instrumentele Agent-ului LiveKit nu sunt trimise. Apelul se încheie când
agentul ThunderPhone închide apelul, iar sesiunea se închide odată cu acesta.
Configurați sesiunea inline
Fără agent_id, instrucțiunile și instrumentele provin de la Agent-ul LiveKit,
la fel ca pentru OpenAI. product selectează motorul, iar voice selectează vocea
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 fixează instrucțiunile și instrumentele când începe apelul, astfel încât
update_instructions, update_tools și transferurile către alți agenți care le modifică nu sunt
acceptate în timpul apelului. Sesiunile inline sunt controlate de client: agentul vorbește
când apelați generate_reply() sau când participantul termină un schimb de replici.
Opțiuni
| Argument | Semnificație |
|---|---|
api_key | Cheie secretă (sk_live_...). Valoarea implicită este THUNDERPHONE_API_KEY. |
agent_id | Rulați un agent salvat. Se exclude reciproc cu product și voice. |
product | Motor pentru sesiuni inline: spark, bolt sau storm. |
voice | Numele vocii ThunderPhone pentru sesiuni inline. |
language | Indiciu privind limba principală pentru sesiuni inline, de exemplu es. |
from_number, to_number | Numere de înregistrat pentru apel atunci când camera deservește o linie telefonică. |
live_transcripts | Transmiteți fragmente din transcrierea apelantului în timpul enunțului (facturate suplimentar). |
base_url | Suprascriere pentru endpoint; valoarea implicită este wss://api.thunderphone.com/v1/realtime. |
Evenimente
ThunderPhone adaugă evenimente de platformă peste protocolul în timp real. Sesiunea le emite:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])RealtimeSession expune call_id după ce sesiunea devine activă. Utilizați-l cu
GET /v1/calls/{call_id} pentru a prelua înregistrarea,
transcrierea și evaluarea după apel. Orice alt eveniment call.* (transfer,
tastatură, vorbire ignorată) sosește ca thunderphone_call_event.
Limite
- Detectarea schimbării rândului de vorbire este pe server și este mereu activă; detectarea schimbării rândului de vorbire din framework
(
turn_detectionpeAgentSession) este ignorată. - Instrucțiunile și instrumentele nu se pot modifica după începerea apelului.
- Sunetul este PCM mono pe 16 biți la 24 kHz în ambele direcții.
- Cadrele video sunt ignorate.