Integração com LLM personalizado
Integração com LLM personalizado
Use seu próprio LLM para potencializar um agente telefônico da Twilio com o SDK Speech Engine.
Visão geral
A integração nativa com a Twilio do ElevenAgents abrange o caso em que a ElevenLabs hospeda o LLM. Use este guia quando precisar de controle total sobre o cérebro do LLM no seu próprio servidor — seu próprio modelo, pipeline de RAG, roteamento de chamadas de função ou outro raciocínio no servidor — e o agente ainda estiver em um número de telefone da Twilio.
A parte do LLM personalizado é fornecida pelo SDK Speech Engine, que abre um WebSocket entre a ElevenLabs e seu servidor para que seu LLM possa transmitir respostas conforme a chamada acontece. A parte da Twilio usa o Media Streams para encaminhar o áudio da chamada para o agente.
Arquitetura
O SDK Speech Engine expõe dois endpoints WebSocket no sistema de conversação do agente:
- O WebSocket do cérebro é executado no seu servidor. A ElevenLabs se conecta a ele para enviar transcrições e receber texto gerado pelo LLM.
- O WebSocket de conversação é executado na ElevenLabs. Os clientes se conectam a ele para enviar áudio e receber áudio sintetizado de volta. A ponte da Twilio se conecta por uma URL assinada e encaminha áudio μ-law em ambas as direções.
Como o Twilio Media Streams e o Speech Engine usam ulaw_8000, a ponte encaminha áudio codificado em base64 sem transcodificação.
A ponte e o servidor do cérebro podem ser executados no mesmo processo, se for conveniente — o exemplo abaixo os combina.
Quando usar este padrão
Tanto este guia quanto a integração nativa com a Twilio colocam um agente em um número de telefone da Twilio. A diferença é quem hospeda o LLM:
- Integração nativa: a ElevenLabs hospeda o LLM, e você o configura pelo agente. Mais simples.
- LLM personalizado via SDK Speech Engine (este guia): você hospeda o LLM no seu próprio servidor. Controle total sobre o modelo, RAG, chamadas de função e lógica de negócios. Mais componentes envolvidos.
Se a lógica do seu LLM couber na configuração padrão do agente, prefira a integração nativa. Use este guia quando seu cérebro precisar executar código na sua própria infraestrutura.
Este padrão usa o SDK Speech Engine, que usa uma conexão WebSocket para se comunicar entre seu servidor e a API da ElevenLabs. Você também pode usar o guia de LLM personalizado, que usa um endpoint HTTP compatível com OpenAI em vez do SDK Speech Engine.
A principal diferença entre os dois são WebSockets em vez de solicitações HTTP. Usar WebSockets significa manter uma única conexão, em vez de estabelecer uma nova conexão HTTP a cada turno, o que pode melhorar a latência.
Pré-requisitos
- Uma conta Twilio e um número de telefone com suporte a voz.
- Um recurso do Speech Engine. Siga o início rápido do Speech Engine para criar um e conhecer o padrão de servidor do cérebro.
- Um túnel HTTPS público (por exemplo, ngrok). A Twilio disca para sua ponte pela internet pública.
- Python 3.9+ ou Node.js 18+.
Configure o agente para áudio μ-law
O Twilio Media Streams usa áudio μ-law de 8 kHz. Configure o Speech Engine para aceitar e emitir o mesmo formato, para que a ponte não precise transcodificar.
eleven_flash_v2 mantém baixa a latência de conversão de texto em voz, algo importante em uma chamada telefônica. O bloco request_headers instrui a ElevenLabs a incluir x-api-key: <shared-secret> em toda conexão WebSocket do cérebro — o servidor do cérebro verifica o cabeçalho para garantir que somente seu Speech Engine possa acessá-lo.
Crie o servidor de ponte
A ponte disponibiliza três rotas:
POST /incoming-call— webhook da Twilio. Retorna TwiML instruindo a Twilio a abrir um Media Stream para/media-stream.GET /media-stream— WebSocket do Twilio Media Streams. Encaminha áudio de e para o WebSocket de conversação do Speech Engine.GET /ws— WebSocket do cérebro. A ElevenLabs se conecta aqui quando uma conversa começa. Executa o servidor padrãoengine.serve()/engine.attach().
Gere uma URL assinada para o Speech Engine
A ponte solicita uma URL assinada sempre que uma nova chamada chega. A URL incorpora o ID do Speech Engine e uma assinatura de uso único, para que a ponte nunca precise da chave de API bruta.
Disponibilize a resposta TwiML
Quando uma chamada chega, a Twilio envia um POST para /incoming-call. A resposta é um TwiML que abre um Media Stream para o próprio WebSocket /media-stream da ponte.
RequestValidator (Python) e twilio.webhook({ validate: true }) (Node) verificam o cabeçalho X-Twilio-Signature em relação a TWILIO_AUTH_TOKEN. Sem validação, qualquer pessoa na internet pública poderia enviar um POST para /incoming-call e cobrar chamadas da sua conta.
Faça a ponte do Media Stream
O Media Stream é um WebSocket que envia uma sequência de eventos JSON: connected, start, media (a carga de áudio) e stop. A ponte abre um WebSocket de conversação do Speech Engine em start e encaminha o áudio em ambas as direções até o stream ser fechado.
O evento interruption do Speech Engine dispara um evento clear no stream da Twilio, que descarta qualquer áudio em buffer para que a interrupção funcione corretamente. O evento ping é respondido com pong para manter o WebSocket de conversação ativo.
Execute o servidor do cérebro junto
O servidor do cérebro é o servidor padrão do Speech Engine exibido no início rápido. A única adição é a verificação do segredo compartilhado no upgrade do WebSocket — aceite a conexão apenas se x-api-key corresponder ao valor definido no Speech Engine.
Consulte o início rápido do Speech Engine para ver a implementação completa de on_transcript, incluindo uma chamada ao LLM e resposta transmitida.
Direcione a Twilio para a ponte
Inicie a ponte e um túnel público
Anote a URL https:// exibida pelo ngrok — a Twilio enviará POSTs para ela.
Atualize o ws_url do Speech Engine
Defina speech_engine.ws_url como a URL pública do WebSocket do endpoint do seu cérebro para que a ElevenLabs saiba onde se conectar.
Configure o número da Twilio
No console da Twilio, abra a Configuração de voz do seu número de telefone:
- Uma chamada é recebida: Webhook
- URL:
https://abc123.ngrok.io/incoming-call - Método HTTP: POST
Se o número estiver vinculado a um Elastic SIP Trunk, desvincule-o primeiro — um número da Twilio é direcionado para um tronco ou para um webhook, não para ambos.
Considerações para produção
- Validação de webhook: sempre valide o
X-Twilio-Signatureem/incoming-call. O exemplo acima usa a biblioteca auxiliar da Twilio; não pule esta etapa. - Segredo compartilhado: exija o segredo compartilhado no WebSocket do cérebro. Sem ele, qualquer pessoa que adivinhar sua URL do ngrok poderá se conectar e se passar pela ElevenLabs.
- Host estável: as URLs do plano gratuito do ngrok mudam a cada reinicialização. Use um domínio ngrok reservado ou um hostname real para não precisar atualizar o
ws_urldo Speech Engine e o webhook da Twilio após cada reinicialização. - Latência: cada chamada adiciona dois saltos de rede além do tempo até o primeiro token do LLM. Use um modelo de baixa latência e transmita as respostas por streaming para manter baixa a latência percebida.
- Um processo ou dois: o exemplo coloca a ponte e o cérebro na mesma porta, para que um único túnel do ngrok cubra tudo. Em produção, você pode separá-los em dois serviços, desde que cada um tenha uma URL pública.
- Injeção de prompt: a entrada falada de uma chamada telefônica é uma entrada de usuário não confiável. Valide as transcrições antes que influenciem chamadas de ferramentas ou gravações no banco de dados.