Usa ThunderPhone desde LiveKit Agents
Ejecuta un agente de voz de ThunderPhone como el modelo en tiempo real (de voz a voz) de una sesión de LiveKit Agents, con salas de LiveKit, SIP y telefonía a su alrededor.
LiveKit Agents es un framework de código abierto para agentes de voz en tiempo real sobre salas de LiveKit. ThunderPhone se integra como el modelo en tiempo real: el framework envía el audio del participante, ThunderPhone devuelve la voz, las transcripciones y las llamadas a funciones del agente, y la sala de LiveKit, los trunks SIP y la telefonía transportan el audio. El reconocimiento de voz, el modelo de lenguaje, la voz, la gestión de turnos, 47 idiomas y las herramientas se ejecutan en ThunderPhone.
Las llamadas realizadas de esta forma aparecen en el historial de llamadas y se facturan según la tarifa por minuto de tu producto, como cualquier otra llamada en tiempo real. No hay suscripción ni ningún número telefónico de ThunderPhone involucrado.
Instalar
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyEl plugin encapsula el modelo OpenAI Realtime de LiveKit, porque el
WebSocket Realtime de ThunderPhone habla el mismo protocolo. Requiere
livekit-agents 1.8 o una versión posterior.
Ejecutar un agente guardado
Todo lo que hace el agente (prompt, voz, motor, idiomas, herramientas, saludo, verificaciones durante el silencio) se configura en ThunderPhone. La sesión solo transporta 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 guardado saluda y ejecuta sus propias herramientas en ThunderPhone; las
instrucciones y herramientas del Agent de LiveKit no se envían. La llamada termina cuando el
agente de ThunderPhone cuelga y la sesión se cierra con él.
Configurar la sesión en línea
Sin agent_id, las instrucciones y herramientas provienen del Agent de LiveKit, de la
misma forma que con OpenAI. product selecciona el motor y voice selecciona la voz de
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 fija las instrucciones y herramientas cuando inicia la llamada, por lo que
update_instructions, update_tools y las transferencias de agentes que las cambian no son
compatibles durante la llamada. Las sesiones en línea son controladas por el cliente: el agente habla
cuando llamas a generate_reply() o cuando el participante termina un turno.
Opciones
| Argumento | Significado |
|---|---|
api_key | Clave secreta (sk_live_...). De forma predeterminada, usa THUNDERPHONE_API_KEY. |
agent_id | Ejecuta un agente guardado. Es mutuamente excluyente con product y voice. |
product | Motor para sesiones en línea: spark, bolt o storm. |
voice | Nombre de voz de ThunderPhone para sesiones en línea. |
language | Indicación del idioma principal para sesiones en línea, por ejemplo, es. |
from_number, to_number | Números que se registrarán en la llamada cuando la sala se conecte a una línea telefónica. |
live_transcripts | Transmite fragmentos de la transcripción de quien llama durante la intervención (se factura aparte). |
base_url | Anulación de endpoint; el valor predeterminado es wss://api.thunderphone.com/v1/realtime. |
Eventos
ThunderPhone agrega eventos de plataforma al protocolo en tiempo real. La sesión los emite:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])La RealtimeSession expone call_id una vez que la sesión está activa. Úsalo con
GET /v1/calls/{call_id} para obtener la grabación,
la transcripción y la calificación después de la llamada. Cualquier otro evento call.* (transferencia,
teclado, voz ignorada) llega como thunderphone_call_event.
Límites
- La detección de turnos se realiza en el servidor y siempre está activada; se ignora
la detección de turnos del framework (
turn_detectionenAgentSession). - Las instrucciones y las herramientas no pueden cambiar una vez que inicia la llamada.
- El audio es PCM mono de 16 bits a 24 kHz en ambas direcciones.
- Los fotogramas de video se ignoran.