El canal de telefonía permite que un pipeline de betool responda llamadas y las realice. Se admiten audio en tiempo real, transcripción en streaming, síntesis de voz en streaming e interrupción (barge-in).
Arquitectura
Internamente:
- LiveKit gestiona el transporte de audio en tiempo real.
- LiveKit-SIP conecta LiveKit con el trunk SIP de tu operador.
- Un worker dedicado orquesta la llamada: transcripción (STT), LLM, síntesis de voz (TTS).
Este stack se ejecuta como un proceso separado del backend principal. No lo configuras directamente — el operador de tu instancia configura el puente SIP.
Proveedores de voz
| Función | Proveedores | Por defecto |
|---|---|---|
| Transcripción (STT) | Deepgram, faster-whisper (ejecutado localmente) | Deepgram |
| Síntesis (TTS) | ElevenLabs, Cartesia, OpenAI, Deepgram Aura | ElevenLabs |
El catálogo de voces de cada proveedor de TTS se puede consultar en el panel de administración, con escucha de una muestra antes de elegir. El LLM es el que tú elijas (modelo gestionado, BYOK o modelo privado — consulta Conectar una clave LLM).
Requisitos previos
- Un trunk SIP de un operador.
- Un número entrante y / o la capacidad de realizar llamadas salientes.
- Acceso a los proveedores de STT / TTS elegidos.
En la oferta gestionada, betool puede aprovisionar el trunk SIP y los proveedores de voz por ti.
Diseñar un pipeline de voz (llamada entrante)
Un pipeline de voz empieza con un nodo Start que lleva el receptor phone_gateway. En cada turno de habla transcrito, el pipeline recibe en particular:
user_messageyphone.transcript— el turno de habla transcritophone.call— la llamada: identificador, números llamante / llamado, sentido (inbound/outbound), líneaphone.from— el número de quien llamaphone.caller_timezone— la zona horaria deducida del prefijo (vacía cuando el prefijo abarca varias zonas horarias)
El texto que produce el pipeline lo lee en voz alta el TTS.
Ajustes del receptor
El receptor phone_gateway regula el comportamiento de la llamada, sin código:
- Bienvenida — varias variantes del mensaje de bienvenida (se elige una al azar), una bienvenida distinta para las llamadas salientes, un retardo antes de la bienvenida.
- Silencio — recordatorio tras un silencio prolongado, luego mensaje de despedida y colgado si el silencio persiste; duración máxima de la llamada.
- Interrupción (barge-in) — activada por defecto: quien llama puede interrumpir al agente. Duración y número mínimo de palabras para que una interrupción cuente.
- Detección de fin de turno — modo de detección y retardos de fin de habla.
- Fillers — frases de espera pronunciadas cuando la respuesta tarda, frases específicas durante la ejecución de un tool, o sonido de fondo de espera (teclado, oficina, música de espera). Desactivados por defecto.
- Voz — proveedor, modelo, idioma y voz de STT / TTS, con los ajustes finos de la voz (estabilidad, velocidad…).
- Calificaciones de llamada — una lista cerrada de códigos de resultado que el agente puede asignar a la llamada.
Lo que el agente puede hacer durante la llamada
Los tools telefónicos están disponibles para los agentes de un pipeline que tiene phone_gateway aguas arriba:
phone_gateway.transfer_call— transferir la llamada a otro número (SIP REFER). El número se valida en formato E.164; la transferencia tiene lugar después de pronunciar la respuesta en curso.phone_gateway.hangup_call— colgar, después del mensaje de despedida.phone_gateway.set_call_disposition— calificar la llamada con uno de los códigos configurados.
Un agente también puede enviar un SMS durante la llamada (tool allmysms.send_sms, consulta SMS): en este canal, el destinatario queda bloqueado en el interlocutor de la llamada. Si el número está oculto, el envío se rechaza.
Proponer franjas horarias
El cálculo de disponibilidades (operación free_slots del nodo compute) produce franjas listas para ser pronunciadas, en la zona horaria de quien llama. Combinado con la lectura del calendario (Google o Microsoft), un agente de voz puede enunciar algunas franjas libres y después fijar la cita.
Llamadas salientes
Un pipeline puede realizar una llamada con el nodo phone_call: por ejemplo, llamar a un lead en cuanto llega, o hacer seguimiento de una lista.
| Campo | Función |
|---|---|
trunk_id | Línea utilizada para llamar |
voice_model | El modelo que lleva la conversación (su Start debe llevar el receptor phone_gateway) |
to_number | Número al que llamar (con plantilla), normalizado al formato E.164 |
call_vars | Variables transmitidas a la conversación (phone.outbound.vars) — por ejemplo el nombre, utilizable en la bienvenida saliente |
allowed_days / allowed_hours / timezone | Ventana horaria autorizada: fuera de la ventana, la llamada no se realiza |
max_in_flight / max_per_day | Límites de llamadas simultáneas (3 por defecto) y diarias (100 por defecto) |
output_key | Clave de salida (por defecto phone.call_result) |
Salvaguardas:
- Exactly-once — una repetición nunca vuelve a marcar un número ya llamado.
- Rechazo antes de marcar si la organización no tiene créditos.
- Sin llamada en simulación — el nodo se omite durante una ejecución de prueba (dry-run).
El nodo devuelve el control en cuanto la llamada suena: ok significa «llamada lanzada», no «descolgada». Para conocer el resultado, añade al Start del modelo el receptor phone_call_outcome: dispara el pipeline una vez terminada la llamada, con phone.outcome — descolgada o no (answered, no_answer, rejected, unknown), duración, número de turnos, calificación asignada por el agente.
Buenas prácticas
- Mantén las misiones concisas. La latencia de respuesta importa: un agente que duda durante 4 segundos suena congelado en una llamada. Prefiere modelos rápidos salvo para los turnos críticos de decisión.
- Deja el barge-in activo. Quienes llaman deben poder interrumpir al agente. Es el ajuste por defecto.
- Configura fillers para los turnos que llaman a tools: un silencio largo inquieta a quien llama.
Costes
Consulta Precios. Una llamada no tiene precio por minuto en sí: se factura por sus componentes — transcripción (según la duración del audio), síntesis de voz (según el número de caracteres) y LLM (según los tokens, salvo en BYOK).
Limitaciones conocidas
- El canal telefónico es solo audio. El vídeo pasa por otros bloques (generación y doblaje de vídeo con HeyGen), no por la llamada.
- La transferencia a un humano requiere un trunk SIP que admita REFER.
- El agente no puede adivinar la identidad de quien llama sin una integración con un CRM: solo conoce el número presentado.