Integración de LLM personalizado
Integración de LLM personalizado
Impulsa un agente telefónico de Twilio con tu propio LLM mediante el SDK de Speech Engine.
Resumen
La integración nativa con Twilio de ElevenAgents cubre el caso en el que ElevenLabs aloja el LLM. Usa esta guía cuando necesites tener control total sobre el cerebro del LLM en tu propio servidor —tu propio modelo, pipeline de RAG, enrutamiento de llamadas a funciones u otro razonamiento del lado del servidor— y el agente siga estando en un número de teléfono de Twilio.
La parte del LLM personalizado se ofrece mediante el SDK de Speech Engine, que abre un WebSocket entre ElevenLabs y tu servidor para que tu LLM pueda transmitir respuestas a medida que transcurre la llamada. La parte de Twilio utiliza Media Streams para transmitir el audio de la llamada al agente.
Arquitectura
El SDK de Speech Engine expone dos rutas de WebSocket en el sistema de conversación del agente:
- El WebSocket del cerebro se ejecuta en tu servidor. ElevenLabs se conecta a él para enviar transcripciones y recibir texto generado por el LLM.
- El WebSocket de conversación se ejecuta en ElevenLabs. Los clientes se conectan a él para enviar audio y recibir audio sintetizado. El puente de Twilio se conecta mediante una URL firmada y retransmite audio μ-law en ambas direcciones.
Como Twilio Media Streams y Speech Engine utilizan ulaw_8000, el puente retransmite audio codificado en base64 sin transcodificación.
El puente y el servidor del cerebro pueden ejecutarse en el mismo proceso si te resulta práctico; el ejemplo siguiente los combina.
Cuándo usar este patrón
Tanto esta guía como la integración nativa con Twilio colocan un agente en un número de teléfono de Twilio. La diferencia está en quién se encarga del LLM:
- Integración nativa: ElevenLabs aloja el LLM y tú lo configuras a través del agente. Más sencillo.
- LLM personalizado mediante el SDK de Speech Engine (esta guía): alojas el LLM en tu propio servidor. Control total sobre el modelo, RAG, llamadas a funciones y lógica de negocio. Más componentes.
Si la lógica de tu LLM se ajusta a la configuración estándar del agente, prioriza la integración nativa. Usa esta guía cuando tu cerebro necesite ejecutar código en tu propia infraestructura.
Este patrón utiliza el SDK de Speech Engine, que emplea una conexión WebSocket para comunicarse entre tu servidor y la API de ElevenLabs. También puedes usar la guía de LLM personalizado, que utiliza una ruta HTTP compatible con OpenAI en lugar del SDK de Speech Engine.
La principal diferencia entre ambos son los WebSockets frente a las solicitudes HTTP. Usar WebSockets implica mantener una única conexión en lugar de establecer una nueva conexión HTTP en cada turno, lo que puede reducir la latencia.
Requisitos previos
- Una cuenta de Twilio y un número de teléfono con capacidad de voz.
- Un recurso de Speech Engine. Sigue la guía de inicio rápido de Speech Engine para crear uno y conocer el patrón de servidor del cerebro.
- Un túnel HTTPS público (por ejemplo, ngrok). Twilio llama a tu puente a través de Internet público.
- Python 3.9+ o Node.js 18+.
Configura el agente para audio μ-law
Twilio Media Streams utiliza audio μ-law de 8 kHz. Configura Speech Engine para aceptar y emitir el mismo formato, de modo que el puente no tenga que transcodificar.
eleven_flash_v2 mantiene baja la latencia de texto a voz, algo importante en una llamada telefónica. El bloque request_headers indica a ElevenLabs que incluya x-api-key: <shared-secret> en cada conexión WebSocket del cerebro; el servidor del cerebro comprueba la cabecera para asegurar que solo tu Speech Engine pueda acceder a él.
Crea el servidor puente
El puente ofrece tres rutas:
POST /incoming-call— Webhook de Twilio. Devuelve TwiML que indica a Twilio que abra un Media Stream hacia/media-stream.GET /media-stream— WebSocket de Twilio Media Streams. Retransmite audio desde y hacia el WebSocket de conversación de Speech Engine.GET /ws— WebSocket del cerebro. ElevenLabs se conecta aquí cuando empieza una conversación. Ejecuta el servidor estándarengine.serve()/engine.attach().
Genera una URL firmada para Speech Engine
El puente solicita una URL firmada cada vez que llega una llamada nueva. La URL incorpora el ID de Speech Engine y una firma de un solo uso, por lo que el puente nunca necesita la clave de API sin procesar.
Sirve la respuesta de TwiML
Cuando llega una llamada, Twilio envía un POST a /incoming-call. La respuesta es TwiML que abre un Media Stream hacia el WebSocket /media-stream del propio puente.
RequestValidator (Python) y twilio.webhook({ validate: true }) (Node) comprueban la cabecera X-Twilio-Signature con TWILIO_AUTH_TOKEN. Sin validación, cualquiera en Internet público podría enviar un POST a /incoming-call y cargar llamadas a tu cuenta.
Conecta el Media Stream
El Media Stream es un WebSocket que envía una secuencia de eventos JSON: connected, start, media (la carga de audio) y stop. El puente abre un WebSocket de conversación de Speech Engine en start y retransmite audio en ambas direcciones hasta que se cierra el stream.
El evento interruption de Speech Engine activa un evento clear en el stream de Twilio, que descarta cualquier audio almacenado en búfer para que la interrupción funcione correctamente. El evento ping se responde con pong para mantener activo el WebSocket de conversación.
Ejecuta el servidor del cerebro en paralelo
El servidor del cerebro es el servidor estándar de Speech Engine mostrado en la guía de inicio rápido. La única incorporación es la comprobación del secreto compartido durante la actualización del WebSocket: acepta la conexión solo si x-api-key coincide con el valor que configuraste en Speech Engine.
Consulta la guía de inicio rápido de Speech Engine para ver la implementación completa de on_transcript, incluida una llamada al LLM y una respuesta transmitida.
Dirige Twilio al puente
Inicia el puente y un túnel público
Anota la URL https:// que muestra ngrok: Twilio le enviará un POST.
Actualiza el ws_url de Speech Engine
Configura speech_engine.ws_url con la URL pública de WebSocket de la ruta de tu cerebro para que ElevenLabs sepa dónde conectarse.
Configura el número de Twilio
En la consola de Twilio, abre la configuración de voz de tu número de teléfono:
- Cuando entra una llamada: Webhook
- URL:
https://abc123.ngrok.io/incoming-call - Método HTTP: POST
Si el número está vinculado a un Elastic SIP Trunk, desvincúlalo primero: un número de Twilio se enruta a un trunk o a un webhook, pero no a ambos.
Consideraciones para producción
- Validación de webhooks: valida siempre
X-Twilio-Signatureen/incoming-call. El ejemplo anterior usa la biblioteca auxiliar de Twilio; no omitas este paso. - Secreto compartido: aplica el secreto compartido en el WebSocket del cerebro. Sin él, cualquiera que adivine tu URL de ngrok puede conectarse y hacerse pasar por ElevenLabs.
- Host estable: las URL del nivel gratuito de ngrok cambian con cada reinicio. Usa un dominio de ngrok reservado o un nombre de host real para no tener que actualizar
ws_urlde Speech Engine y el webhook de Twilio después de cada reinicio. - Latencia: cada llamada añade dos saltos de red además del tiempo hasta el primer token del LLM. Usa un modelo de baja latencia y transmite las respuestas en streaming para mantener baja la latencia percibida.
- Un proceso o dos: el ejemplo ubica el puente y el cerebro en el mismo puerto, de modo que un único túnel de ngrok cubre todo. En producción, puedes dividirlos en dos servicios siempre que cada uno tenga una URL pública.
- Inyección de prompts: la entrada de voz de una llamada telefónica es una entrada de usuario no fiable. Valida las transcripciones antes de que influyan en llamadas a herramientas o escrituras en la base de datos.