For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主导航

电话与 SIP

为电话通话选择 SIP 连接或应用音频桥接。

选择您的应用使用的 API。每种 API 都有各自的身份验证、会话创建和事件规范。

选择电话连接方式

电话通话可以通过 SIP 中继或转发音频的应用接入 GPT-Live。请根据您现有的电话系统,以及应用需要在哪个环节处理音频,选择合适的连接方式。

连接音频传输与应用职责
SIP 直连提供商与 OpenAI 交换通话音频。您的应用负责处理 Webhook、会话配置、通话决策和业务逻辑。
服务器音频桥接您的应用通过 WebSocket 将提供商或房间的音频转发到 GPT-Live,并管理两端连接、事件转换、播放和通话生命周期。

提供商与您的应用之间的连接,以及您的应用与 OpenAI 之间的连接,彼此独立。例如,来电者可以通过 SIP 加入房间,而房间中的智能体则通过 WebSocket 连接到 GPT-Live。

正在使用 Twilio、Telnyx、LiveKit 或 Daily/Pipecat?请参阅 GPT-Live 合作伙伴集成,了解各提供商的专用指南。

SIP 直连

SIP 直连让通话音频始终通过提供商与 OpenAI 之间的媒体链路传输。SIP 信令使用 TLS,GPT-Live 要求通话音频使用 SRTP。您的后端仍负责来电决策、会话配置、授权和业务逻辑。

当您的后端需要接收会话事件或发送命令时,请使用旁路连接。它会接入现有对话,而音频仍由 SIP 传输。请为每项操作指定一个处理程序,避免因 Webhook 重复投递或多个连接观察到同一事件而导致工具重复执行。

请将 SIP 路由和提供商配置与使用它们的集成一同管理。Realtime Webhook 事件、通话标识符和接听请求载荷属于 Realtime API;Live 会话应使用 GPT-Live 规范。

处理通话生命周期

使用此流程前,请确认您的项目已启用 GPT-Live SIP 支持,并且提供商的 SIP 中继已路由到该项目。另一个选项卡中的 Realtime Webhook 和接听请求载荷遵循不同的 API 规范。

接收来电

为您的项目配置用于接收 live.transport.incomingWebhook 端点。在决定如何处理通话之前,请验证 Webhook 签名并对投递进行去重。确认收到投递并不等于接听通话。

Webhook 通过 data.type: "sip" 标明这是 SIP 通话,并提供 data.session_id。每项 Live 通话操作都应原样使用该会话 ID。请将 data.sip_headers 视为不可信的来电者元数据,不能将其用作授权依据。

现有集成可能仍会收到已弃用的 live.call.incoming 事件,该事件不包含 data.type。迁移期间,请处理这两个事件名称,并保留旧订阅,直到旧事件的投递和重试全部完成。同一个待处理通话也可能触发 Realtime Webhook;请指定一个处理程序来决定接听或拒接,不要通过两个 API 同时接听。

接听或拒接通话

应用您的应用授权和路由规则。要接听通话,请发送经过身份验证的 POST /v1/live/sessions/{session_id}/accept 请求,并在请求中包含顶层 session 对象:

{
  "session": {
    "type": "live",
    "model": "gpt-live-1",
    "instructions": "You are answering an inbound support call.",
    "audio": { "output": { "voice": "marin" } },
    "delegation": { "type": "client" }
  }
}

请从可信后端发起通话控制请求,并使用 Authorization: Bearer $OPENAI_API_KEY。接听时请选择语音和委派模式。音频格式由 SIP 协商,因此请省略 audio.format。此示例选择客户端委派;您的后端必须处理委派的工作。有关客户端和 Responses 配置,请参阅委派与工具

接听成功后,会在会话初始化完成时返回 200 OK,响应体为空。请先处理 HTTP 错误,再将通话视为已接听。

拒接通话,请发送 POST /v1/live/sessions/{session_id}/reject,并附带 SIP 状态码,例如使用 { "status_code": 486 } 表示忙线。状态码必须是 300 至 699 之间的整数。首次接听或拒接决策生效;之后与之竞争的决策将返回 decision_already_made

接入您的后端

接听后,请通过 wss://api.openai.com/v1/live/sessions/{session_id}/attach 建立旁路 WebSocket 连接。使用已接听通话的会话 ID,以及同一项目的身份验证信息和连接标头。不要再次发送 session.start

SIP 负责传输通话音频。请使用旁路连接处理转录文本、委派、工具、命令和回传音频。即使多个连接观察到同一事件,也应为每项副作用指定唯一的执行方。

观察按键事件

当来电者按下按键时,旁路连接会收到 transport.dtmf.received;当托管工具成功发送音调后,旁路连接会收到 transport.dtmf.send。事件的 event 字段包含 09*#AD 中的一个值。

这些是供观察者接收的通知,而不是客户端命令。不要通过发送 transport.dtmf.send 来请求音调,也不要假定浏览器数据通道会接收按键事件。

转接或结束通话

转接通话,请发送 POST /v1/live/sessions/{session_id}/refer,并使用 { "target_uri": "sip:agent@example.com" } 指定目的地。要挂断通话,请发送不带请求体的 POST /v1/live/sessions/{session_id}/hangup。两者成功时都会返回 200 OK,响应体为空。

释放应用资源之前,请保持旁路连接开启,以接收最终事件和用量信息。挂断请求成功或意外断开连接,都不能替代 session.closed。有关最终处理和关闭原因,请参阅用量与优雅关闭

此流程用于接听来电。不支持通过 POST /v1/live/sessions 创建出站 SIP 通话;请使用相关的合作伙伴集成,由提供商负责呼出通话。

服务器音频桥接

当您的应用接收来自电话提供商或智能体框架的音频流时,请使用 GPT-Live WebSocket 连接。应用负责两端连接的身份验证、事件封装格式的转换,以及双向音频转发。

GPT-Live 支持通过 WebSocket 传输采样率为 8 kHz 的原始 G.711 μ-law 和 A-law 音频。当提供商的音频流使用相同的编解码器、采样率和声道数时,您的应用可以直接转发原始音频字节,无需将其转换为 PCM。请保持音频顺序,并使用每个连接要求的消息格式。音频格式相同并不意味着两种事件协议可以互换。

音频桥接还负责管理其排队等待播放的所有音频。设计应用时,请考虑提供商缓冲、中断和结束通话的处理。有关 Live 会话生命周期,请参阅管理会话;有关话轮切换和播放控制的变化,请参阅迁移到 GPT-Live

请将提供商的通话或房间标识符与 OpenAI 会话 ID 一同保存,以便跨两个系统追踪同一段对话。

GPT-Live 后续步骤