自定义 LLM 集成
自定义 LLM 集成
使用 Speech Engine SDK 和自己的 LLM 驱动 Twilio 电话智能体。
概览
ElevenAgents 的原生 Twilio 集成适用于由 ElevenLabs 托管 LLM 的场景。如果需要在自己的服务器上完全控制 LLM 大脑——使用自有模型、RAG 管道、函数调用路由或其他服务端推理——同时智能体仍使用 Twilio 电话号码,请参考本指南。
自定义 LLM 部分由 Speech Engine SDK提供。它会在 ElevenLabs 和服务器之间建立 WebSocket,让 LLM 能够随着通话进行流式返回响应。Twilio 部分使用 Media Streams,将通话音频转发给智能体。
架构
Speech Engine SDK 会在智能体的对话系统中公开两个 WebSocket 端点:
- 大脑 WebSocket 在服务器上运行。ElevenLabs 连接到它,以传递转写文本并接收 LLM 生成的文本。
- 对话 WebSocket 在 ElevenLabs 上运行。客户端连接到它以发送音频并接收合成音频。Twilio 桥接器通过签名 URL 连接,并双向转发 μ-law 音频。
由于 Twilio Media Streams 和 Speech Engine 都使用 ulaw_8000,桥接器可直接转发 base64 编码的音频,无需转码。
如果方便,桥接器和大脑服务器可以在同一进程中运行——以下示例将它们合并在一起。
何时使用此模式
本指南和原生 Twilio 集成都能将智能体部署到 Twilio 电话号码。区别在于谁负责 LLM:
- 原生集成:ElevenLabs 托管 LLM,你通过智能体进行配置。更简单。
- 通过 Speech Engine SDK 使用自定义 LLM(本指南):你在自己的服务器上托管 LLM。可完全控制模型、RAG、函数调用和业务逻辑。涉及更多组件。
如果 LLM 逻辑可在标准智能体配置中实现,建议使用原生集成。如果大脑需要在自己的基础设施上运行代码,请使用本指南。
此模式使用 Speech Engine SDK,它通过 WebSocket 连接在服务器与 ElevenLabs API 之间通信。你还可以使用 Custom LLM 指南,该指南使用兼容 OpenAI 的 HTTP 端点,而不是 Speech Engine SDK。
两者的主要区别是 WebSocket 与 HTTP 请求。WebSocket 只需维持一个连接,而不必为每轮对话建立新的 HTTP 连接,因此可能降低延迟。
前提条件
- 一个 Twilio 账户和一个支持语音的电话号码。
- 一个 Speech Engine 资源。请按照 Speech Engine 快速入门创建资源,并了解大脑服务器模式。
- 一个公开 HTTPS 隧道(例如 ngrok)。Twilio 会通过公网连接到桥接器。
- Python 3.9+ 或 Node.js 18+。
为 μ-law 音频配置智能体
Twilio Media Streams 使用 8 kHz μ-law 音频。将 Speech Engine 配置为接受和输出相同格式,以便桥接器无需转码。
eleven_flash_v2 可保持较低的文本转语音延迟,这对电话通话很重要。request_headers 块会让 ElevenLabs 在每个大脑 WebSocket 连接中包含 x-api-key: <shared-secret>——大脑服务器会检查此标头,确保只有 Speech Engine 能连接。
构建桥接服务器
桥接器提供 3 条路由:
POST /incoming-call— Twilio webhook。返回 TwiML,指示 Twilio 向/media-stream打开 Media Stream。GET /media-stream— Twilio Media Streams WebSocket。在 Speech Engine 对话 WebSocket 与通话之间转发音频。GET /ws— 大脑 WebSocket。对话开始时 ElevenLabs 会连接到此处。运行标准的engine.serve()/engine.attach()服务器。
提供 TwiML 响应
通话到达时,Twilio 会向 /incoming-call 发送 POST 请求。响应是 TwiML,它会向桥接器自身的 /media-stream WebSocket 打开 Media Stream。
RequestValidator(Python)和 twilio.webhook({ validate: true })(Node)会根据 TWILIO_AUTH_TOKEN 检查 X-Twilio-Signature 标头。若不进行验证,公网中的任何人都能向 /incoming-call 发送 POST 请求,并让账户承担通话费用。
桥接 Media Stream
Media Stream 是一个 WebSocket,会发送一系列 JSON 事件:connected、start、media(音频负载)和 stop。桥接器会在 start 时打开 Speech Engine 对话 WebSocket,并在流关闭前双向转发音频。
Speech Engine 的 interruption 事件会在 Twilio 流上触发 clear 事件,丢弃所有缓冲音频,从而确保插话功能正常工作。ping 事件会以 pong 响应,以保持对话 WebSocket 连接存活。
同时运行大脑服务器
大脑服务器是快速入门中展示的标准 Speech Engine 服务器。唯一的新增内容是在 WebSocket 升级时检查共享密钥——仅当 x-api-key 与为 Speech Engine 设置的值匹配时才接受连接。
有关完整的 on_transcript 实现,包括 LLM 调用和流式响应,请参阅 Speech Engine 快速入门。
将 Twilio 指向桥接器
生产环境注意事项
- Webhook 验证:始终验证
/incoming-call上的X-Twilio-Signature。上例使用 Twilio 的辅助库;请勿跳过此步骤。 - 共享密钥:在大脑 WebSocket 上强制执行共享密钥验证。否则,任何猜到 ngrok URL 的人都能连接并冒充 ElevenLabs。
- 稳定主机:ngrok 免费套餐的 URL 每次重启都会变化。请使用保留的 ngrok 域名或真实主机名,以免每次重启后都要更新 Speech Engine
ws_url和 Twilio webhook。 - 延迟:每通电话都会在 LLM 首个 token 生成时间的基础上增加两次网络跳转。使用低延迟模型并流式返回响应,以保持较低的感知延迟。
- 一个进程还是两个:该示例将桥接器和大脑部署在同一端口,因此一个 ngrok 隧道即可覆盖所有内容。在生产环境中,只要各自都有公开 URL,也可将它们拆分为两个服务。
- 提示词注入:电话通话中的语音输入是不受信任的用户输入。在它们影响工具调用或数据库写入前,请验证转写文本。