Integration eines benutzerdefinierten LLM
Betreiben Sie einen Twilio-Telefonagenten mit Ihrem eigenen LLM über das Speech Engine SDK.
Überblick
Die native Twilio-Integration von ElevenAgents deckt den Fall ab, in dem ElevenLabs das LLM hostet. Nutzen Sie diesen Leitfaden, wenn Sie die volle Kontrolle über das LLM-Gehirn auf Ihrem eigenen Server benötigen — mit Ihrem eigenen Modell, einer RAG-Pipeline, dem Routing von Funktionsaufrufen oder anderer serverseitiger Logik — und der Agent weiterhin über eine Twilio-Telefonnummer erreichbar ist.
Der Teil mit dem benutzerdefinierten LLM wird über das Speech Engine SDK bereitgestellt. Es öffnet einen WebSocket zwischen ElevenLabs und Ihrem Server, sodass Ihr LLM Antworten während des Gesprächs streamen kann. Der Twilio-Teil nutzt Media Streams, um Gesprächsaudio an den Agenten weiterzuleiten.
Architektur
Das Speech Engine SDK stellt im Gesprächssystem des Agenten zwei WebSocket-Endpunkte bereit:
- Der Brain-WebSocket läuft auf Ihrem Server. ElevenLabs verbindet sich damit, um Transkripte zu übermitteln und vom LLM generierten Text zu empfangen.
- Der Gesprächs-WebSocket läuft bei ElevenLabs. Clients verbinden sich damit, um Audio zu senden und synthetisiertes Audio zurückzuerhalten. Die Twilio-Bridge verbindet sich über eine signierte URL und leitet μ-law-Audio in beide Richtungen weiter.
Da Twilio Media Streams und die Speech Engine beide ulaw_8000 verwenden, leitet die Bridge base64-kodiertes Audio ohne Transkodierung weiter.
Bridge und Brain-Server können im selben Prozess laufen, falls das praktischer ist — das folgende Beispiel kombiniert beide.
Wann Sie dieses Muster verwenden sollten
Sowohl dieser Leitfaden als auch die native Twilio-Integration stellen einen Agenten über eine Twilio-Telefonnummer bereit. Der Unterschied besteht darin, wer das LLM betreibt:
- Native Integration: ElevenLabs hostet das LLM, Sie konfigurieren es über den Agenten. Einfacher.
- Benutzerdefiniertes LLM über das Speech Engine SDK (dieser Leitfaden): Sie hosten das LLM auf Ihrem eigenen Server. Volle Kontrolle über Modell, RAG, Funktionsaufrufe und Geschäftslogik. Mehr Komponenten.
Wenn Ihre LLM-Logik in die Standard-Agentenkonfiguration passt, nutzen Sie die native Integration. Verwenden Sie diesen Leitfaden, wenn Ihr Gehirn Code auf Ihrer eigenen Infrastruktur ausführen muss.
Dieses Muster verwendet das Speech Engine SDK, das über eine WebSocket-Verbindung zwischen Ihrem Server und der ElevenLabs API kommuniziert. Sie können auch den Leitfaden Benutzerdefiniertes LLM verwenden, der statt des Speech Engine SDK einen OpenAI-kompatiblen HTTP-Endpunkt nutzt.
Der Hauptunterschied zwischen beiden sind WebSockets gegenüber HTTP-Anfragen. WebSockets halten eine einzelne Verbindung aufrecht, statt für jeden Gesprächszug eine neue HTTP-Verbindung aufzubauen. Das kann die Latenz verringern.
Voraussetzungen
- Ein Twilio-Konto und eine sprachfähige Telefonnummer.
- Eine Speech-Engine-Ressource. Folgen Sie dem Speech-Engine-Schnellstart, um eine zu erstellen und das Brain-Server-Muster kennenzulernen.
- Einen öffentlichen HTTPS-Tunnel, zum Beispiel ngrok. Twilio ruft Ihre Bridge über das öffentliche Internet auf.
- Python 3.9+ oder Node.js 18+.
Agenten für μ-law-Audio konfigurieren
Twilio Media Streams verwendet μ-law-Audio mit 8 kHz. Konfigurieren Sie die Speech Engine so, dass sie dasselbe Format akzeptiert und ausgibt, damit die Bridge nicht transkodieren muss.
eleven_flash_v2 hält die Text-to-Speech-Latenz niedrig, was bei einem Telefongespräch wichtig ist. Der Block request_headers weist ElevenLabs an, bei jeder Brain-WebSocket-Verbindung x-api-key: <shared-secret> einzuschließen — der Brain-Server prüft den Header, damit nur Ihre Speech Engine ihn erreichen kann.
Bridge-Server erstellen
Die Bridge stellt drei Routen bereit:
POST /incoming-call— Twilio-Webhook. Gibt TwiML zurück, das Twilio anweist, einen Media Stream zu/media-streamzu öffnen.GET /media-stream— Twilio-Media-Streams-WebSocket. Leitet Audio zum und vom Speech-Engine-Gesprächs-WebSocket weiter.GET /ws— Brain-WebSocket. ElevenLabs verbindet sich hier, wenn ein Gespräch startet. Führt den Standardserverengine.serve()/engine.attach()aus.
Signierte URL für die Speech Engine erstellen
Die Bridge fordert jedes Mal eine signierte URL an, wenn ein neuer Anruf eingeht. Die URL enthält die Speech-Engine-ID und eine einmalige Signatur, sodass die Bridge nie den rohen API-Schlüssel benötigt.
TwiML-Antwort bereitstellen
Wenn ein Anruf eingeht, sendet Twilio einen POST an /incoming-call. Die Antwort ist TwiML, das einen Media Stream zum eigenen /media-stream-WebSocket der Bridge öffnet.
RequestValidator (Python) und twilio.webhook({ validate: true }) (Node) prüfen den Header X-Twilio-Signature anhand von TWILIO_AUTH_TOKEN. Ohne Validierung könnte jeder im öffentlichen Internet einen POST an /incoming-call senden und Anrufe über Ihr Konto abrechnen.
Media Stream überbrücken
Der Media Stream ist ein WebSocket, der eine Reihe von JSON-Ereignissen sendet: connected, start, media (die Audionutzlast) und stop. Beim start öffnet die Bridge einen Speech-Engine-Gesprächs-WebSocket und leitet Audio in beide Richtungen weiter, bis der Stream geschlossen wird.
Das interruption-Ereignis der Speech Engine löst im Twilio-Stream ein clear-Ereignis aus. Dadurch wird gepuffertes Audio verworfen, sodass Unterbrechen sauber funktioniert. Das ping-Ereignis wird mit pong beantwortet, um den Gesprächs-WebSocket aktiv zu halten.
Brain-Server parallel ausführen
Der Brain-Server ist der im Schnellstart gezeigte Standard-Speech-Engine-Server. Die einzige Ergänzung ist die Prüfung des Shared Secret beim WebSocket-Upgrade — akzeptieren Sie die Verbindung nur, wenn x-api-key dem Wert entspricht, den Sie für die Speech Engine festgelegt haben.
Die vollständige Implementierung von on_transcript, einschließlich LLM-Aufruf und gestreamter Antwort, finden Sie im Speech-Engine-Schnellstart.
Twilio auf die Bridge verweisen
Bridge und öffentlichen Tunnel starten
Notieren Sie die von ngrok ausgegebene https://-URL — Twilio sendet POST-Anfragen dorthin.
Speech-Engine-ws_url aktualisieren
Setzen Sie speech_engine.ws_url auf die öffentliche WebSocket-URL Ihres Brain-Endpunkts, damit ElevenLabs weiß, wohin die Verbindung hergestellt werden soll.
Twilio-Nummer konfigurieren
Öffnen Sie in der Twilio-Konsole die Sprachkonfiguration Ihrer Telefonnummer:
- Ein Anruf geht ein: Webhook
- URL:
https://abc123.ngrok.io/incoming-call - HTTP-Methode: POST
Wenn die Nummer an einen Elastic SIP Trunk angehängt ist, trennen Sie sie zuerst — eine Twilio-Nummer wird entweder an einen Trunk oder an einen Webhook weitergeleitet, nicht an beides.
Hinweise für die Produktion
- Webhook-Validierung: Validieren Sie stets die
X-Twilio-Signatureauf/incoming-call. Das obige Beispiel verwendet die Hilfsbibliothek von Twilio. Überspringen Sie diesen Schritt nicht. - Gemeinsames Secret: Erzwingen Sie das gemeinsame Secret auf dem Brain-WebSocket. Andernfalls kann sich jeder, der Ihre ngrok-URL errät, verbinden und ElevenLabs imitieren.
- Stabiler Host: URLs der kostenlosen ngrok-Version ändern sich bei jedem Neustart. Verwenden Sie eine reservierte ngrok-Domain oder einen echten Hostnamen, damit Sie die
ws_urlder Speech Engine und den Twilio-Webhook nicht nach jedem Neustart aktualisieren müssen. - Latenz: Jeder Aufruf fügt zusätzlich zur Zeit bis zum ersten Token des LLM zwei Netzwerk-Hops hinzu. Verwenden Sie ein Modell mit geringer Latenz und streamen Sie Antworten, um die wahrgenommene Latenz niedrig zu halten.
- Ein oder zwei Prozesse: Das Beispiel platziert Bridge und Brain auf demselben Port, sodass ein einzelner ngrok-Tunnel alles abdeckt. In der Produktion können Sie sie auf zwei Services aufteilen, sofern jeder eine öffentliche URL hat.
- Prompt-Injection: Gesprochene Eingaben aus einem Telefonat sind nicht vertrauenswürdige Nutzereingaben. Validieren Sie Transkripte, bevor sie Tool-Aufrufe oder Datenbankeinträge beeinflussen.