ThunderPhone 2.0 ya está disponible.Empieza por tu cuenta desde 2¢/min.Lee el anuncio

Connect tools & data

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 key

El 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 first

ThunderPhone 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

ArgumentoSignificado
api_keyClave secreta (sk_live_...). De forma predeterminada, usa THUNDERPHONE_API_KEY.
agent_idEjecuta un agente guardado. Es mutuamente excluyente con product y voice.
productMotor para sesiones en línea: spark, bolt o storm.
voiceNombre de voz de ThunderPhone para sesiones en línea.
languageIndicación del idioma principal para sesiones en línea, por ejemplo, es.
from_number, to_numberNúmeros que se registrarán en la llamada cuando la sala se conecte a una línea telefónica.
live_transcriptsTransmite fragmentos de la transcripción de quien llama durante la intervención (se factura aparte).
base_urlAnulació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_detection en AgentSession).
  • 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.