Usa ThunderPhone da LiveKit Agents
Esegui un agente vocale ThunderPhone come modello in tempo reale (da voce a voce) di una sessione LiveKit Agents, con stanze LiveKit, SIP e telefonia attorno ad esso.
LiveKit Agents è un framework open source per agenti vocali in tempo reale basato sulle stanze LiveKit. ThunderPhone si integra come modello in tempo reale: il framework invia l'audio del partecipante, ThunderPhone restituisce la voce dell'agente, le trascrizioni e le chiamate di funzione, mentre le stanze, i trunk SIP e la telefonia di LiveKit trasportano l'audio. Il riconoscimento vocale, il modello linguistico, la voce, la gestione dei turni, 47 lingue e gli strumenti vengono tutti eseguiti su ThunderPhone.
Le chiamate effettuate in questo modo vengono visualizzate nella cronologia chiamate e sono fatturate alla tariffa al minuto del tuo prodotto come qualsiasi altra chiamata in tempo reale. Non sono previsti abbonamenti né numeri di telefono ThunderPhone.
Installa
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyIl plugin include il modello OpenAI Realtime di LiveKit, poiché il
WebSocket Realtime di ThunderPhone utilizza lo stesso protocollo. Richiede
livekit-agents 1.8 o una versione successiva.
Esegui un agente salvato
Tutto ciò che l'agente fa (prompt, voce, motore, lingue, strumenti, saluto, verifiche del silenzio) è configurato su ThunderPhone. La sessione trasferisce solo l'audio.
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 agente salvato saluta ed esegue i propri strumenti su ThunderPhone; le istruzioni e gli strumenti dell'Agent
di LiveKit non vengono inviati. La chiamata termina quando l'agente ThunderPhone riaggancia e la sessione si chiude con esso.
Configura la sessione inline
Senza agent_id, le istruzioni e gli strumenti provengono dall'Agent di LiveKit,
come avviene per OpenAI. product seleziona il motore e voice seleziona la voce
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 blocca istruzioni e strumenti all'avvio della chiamata, quindi
update_instructions, update_tools e i passaggi ad altri agenti che li modificano non sono
supportati durante la chiamata. Le sessioni inline sono controllate dal client: l'agente parla
quando chiami generate_reply() o quando il partecipante conclude un turno.
Opzioni
| Argomento | Significato |
|---|---|
api_key | Chiave segreta (sk_live_...). Il valore predefinito è THUNDERPHONE_API_KEY. |
agent_id | Esegui un agente salvato. Si esclude a vicenda con product e voice. |
product | Motore per sessioni inline: spark, bolt o storm. |
voice | Nome della voce ThunderPhone per sessioni inline. |
language | Suggerimento sulla lingua principale per sessioni inline, ad esempio es. |
from_number, to_number | Numeri da registrare nella chiamata quando la stanza è collegata a una linea telefonica. |
live_transcripts | Trasmetti frammenti della trascrizione del chiamante durante l'enunciato (fatturati a parte). |
base_url | Override dell'endpoint, predefinito wss://api.thunderphone.com/v1/realtime. |
Eventi
ThunderPhone aggiunge eventi della piattaforma al protocollo realtime. La sessione li emette:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])RealtimeSession espone call_id una volta che la sessione è attiva. Usalo con
GET /v1/calls/{call_id} per recuperare la registrazione,
la trascrizione e la valutazione dopo la chiamata. Ogni altro evento call.* (trasferimento,
tastierino, parlato ignorato) arriva come thunderphone_call_event.
Limiti
- Il rilevamento dei turni è lato server ed è sempre attivo; il rilevamento dei turni lato framework
(
turn_detectionsuAgentSession) viene ignorato. - Le istruzioni e gli strumenti non possono cambiare dopo l'inizio della chiamata.
- L'audio è PCM mono a 16 bit e 24 kHz in entrambe le direzioni.
- I fotogrammi video vengono ignorati.