跳转到内容

Twilio 上的语音智能体

Twilio 提供了一个 Media Streams API,可将电话通话的原始音频发送到 WebSocket 服务器。您可以使用此设置将语音智能体概述连接到 Twilio。您可以使用 websocket 模式下的默认 Realtime Session 传输机制,将来自 Twilio 的事件连接到 Realtime Session。不过,这要求您设置正确的音频格式并自行调整中断时机,因为电话通话自然会比基于 Web 的对话产生更高的延迟。

为了改善设置体验,我们创建了一个专用传输层,用于处理与 Twilio 的连接,包括中断处理和音频转发。

  1. 确保您拥有 Twilio 账户和 Twilio 电话号码。

  2. 设置一个用于验证 Twilio 请求的服务器。

    如果您在本地开发,则需要配置类似 ngrok 或 Cloudflare Tunnel 的本地隧道,使 Twilio 能够访问您的本地服务器。在创建传输层或连接到 OpenAI 之前,服务器必须验证传入呼叫 Webhook 和 WebSocket 升级请求中的 X-Twilio-Signature。请使用 Twilio 官方请求验证器、账户的主 Auth Token,以及已配置的公共 URL。请勿根据请求的 Host 或转发标头推导该 URL。TwilioRealtimeTransportLayer 接收的是已经过身份验证的 WebSocket;此适配器不会验证 HTTP 请求。

  3. 安装扩展包以安装 Twilio 适配器:

    终端窗口
    npm install @openai/agents-extensions
  4. 导入适配器和模型,以连接到您的 RealtimeSession:

    import { TwilioRealtimeTransportLayer } from '@openai/agents-extensions';
    import { RealtimeAgent, RealtimeSession } from '@openai/agents/realtime';
    const agent = new RealtimeAgent({
    name: 'My Agent',
    });
    // Authenticate the HTTP webhook and WebSocket upgrade in your server first.
    // Create a new transport mechanism that will bridge the connection between Twilio and
    // the OpenAI Realtime API.
    const twilioTransport = new TwilioRealtimeTransportLayer({
    twilioWebSocket: websocketConnection,
    });
    const session = new RealtimeSession(agent, {
    // set your own transport
    transport: twilioTransport,
    });
  5. 将您的 RealtimeSession 连接到 Twilio:

    import type { RealtimeSession } from '@openai/agents/realtime';
    // Connect only after the server has authenticated the Twilio WebSocket upgrade.
    async function connectAuthenticatedSession(
    session: RealtimeSession,
    apiKey: string,
    ) {
    await session.connect({ apiKey });
    }

您期望 RealtimeSession 支持的所有事件和行为都将按预期工作,包括工具调用、护栏等。有关如何将 RealtimeSession 与语音智能体配合使用的更多信息,请阅读语音智能体概述。

  1. 速度至关重要。

    为了接收来自 Twilio 的所有必要事件和音频,您应在经过身份验证的 WebSocket 连接可用后尽快创建 TwilioRealtimeTransportLayer 实例,并立即调用 session.connect()。

  2. 原始 Twilio 事件的访问。

    如果您想访问 Twilio 发送的原始事件,可以监听 RealtimeSession 实例上的 transport_event 事件。来自 Twilio 的每个事件都具有 twilio_message 类型,并包含一个存有原始事件数据的 message 属性。

  3. 调试日志的查看。

    有时您可能会遇到需要进一步了解具体情况的问题。使用 DEBUG=openai-agents* 环境变量可显示 Agents SDK 的所有调试日志。或者,您也可以使用 DEBUG=openai-agents:extensions:twilio*,仅启用 Twilio 适配器的调试日志。

可运行的 Twilio 示例包含经过身份验证的 Fastify 路由和 Realtime Session 设置。其 README 介绍了服务器端所需的 OPENAI_API_KEY、TWILIO_AUTH_TOKEN 和 TWILIO_PUBLIC_BASE_URL 设置。公共基础 URL 是不含路径前缀、查询字符串或片段的 HTTPS 源。当隧道的公共源发生变化时,请更新此设置。

服务器会在打开 Realtime 连接之前拒绝签名无效的呼叫和升级请求。Twilio Media Stream URL 使用 wss://,且不支持查询参数。有关自定义参数,请参阅 Twilio Stream 文档。