GPTMap

Live API 外呼开放:GPT-Live 经 SIP 主动拨打电话与通话控制实战

官方 changelog 2026-11-02 条目宣布 Outbound SIP calling 经 Live API 对全部组织开放:transport.type 设为 sip、trunk 走 TLS 信令与 SDES-SRTP、振铃 3 分钟与通话 2 小时上限。本文按官方指南逐字段拆解外呼请求、通话进度事件与通话中控制,并核对两包 SDK 类型层现状。

TL;DR
官方 changelog 2026-11-02 条目宣布 Outbound SIP calling 经 Live API 对全部组织开放(2026-11-09 核对)。外呼走 POST /v1/live/sessions、transport.type 设为 sip,trunk 需 TLS 信令(sips:,默认端口 5061)与 SDES-SRTP;振铃上限 3 分钟、通话上限 2 小时且不可配置;transport.ringing / answered / failed 进度事件经 sideband 下发、只回放附着前 3 秒。截至 openai-python v3.47.0 与 openai-node v7.53.0,两包建会话 transport 仍只定义 webrtc——外呼按官方指南直接调 HTTP。
Live API 外呼(outbound SIP calling)是 GPT-Live 通过你自己的 SIP 中继(trunk)主动拨打指定电话号码的能力:向 POST /v1/live/sessions 发送会话配置并把 transport.type 设为 sip,电话网络连接由 SIP 供应商承担,通话音频走 SIP,对话事件与通话进度经 sideband WebSocket 下发。官方 changelog 于 2026-11-02 宣布该能力对全部组织开放;官方定价页列 gpt-live-1 语音会话 $0.05 每分钟、按秒计费不向上取整,后端模型与工具用量另计。

操作步骤

  1. 配置 SIP trunk

    选择支持 TLS 信令与 SDES-SRTP 媒体的 SIP 供应商,先在供应商设置里启用 SRTP;准备好供应商端点(sips: 形式,默认端口 5061)、digest 认证的用户名密码与主叫号码(E.164)。

  2. 创建外呼会话

    向 POST /v1/live/sessions 发送会话配置与 transport 块:type 为 sip、destination 为被叫 E.164 号码、trunk 含 provider_url、auth(digest)与 caller_number;audio.format 省略(由 SIP 协商)。返回 200 与 session.id 只代表初始化成功,不代表已被接听。

  3. 附着 sideband 并监听呼叫进度

    创建后立即连接 `wss://api.openai.com/v1/live/sessions/{session_id}/attach`,不要再发 session.start;监听 transport.ringing、transport.answered、transport.failed 三个事件,sideband 只回放附着前 3 秒内的事件,按 event_id 去重。

  4. 通话中控制并收尾

    按需经 sideband 发 transport.dtmf.send 按键音、POST refer 端点转接、POST hangup 端点挂断;保持 sideband 连接直到收到 session.closed,以获取最终用量。

Live API 此前的 SIP 能力集中在呼入侧:供应商把来电转给 OpenAI,你用 accept 或 reject 决定接不接。2026-11-02 的官方 changelog 条目把方向反过来——外呼(outbound SIP calling)经 Live API 对全部组织开放,你的服务器指定一个电话号码,由自己的 SIP 供应商完成电话网络侧的连接,GPT-Live 承担对话本身。本文事实来源为 2026-11-09 当日抓取的官方 changelog、Telephony and SIP 指南(.md 全文变体)与两包官方 SDK 的 tag 源码;文中代码为官方指南照录(文档核对版,本站未在真机环境执行外呼)。

1. 官方宣布与能力边界

官方 changelog 2026-11-02 条目(Feature,标注 Model 为 gpt-live-1、API 为 v1/live/sessions)原文:

Outbound SIP calling is now available to all organizations through the Live API. Connect GPT-Live to a phone number through your SIP provider.

两条边界值得先钉住。第一,外呼只经 Live API 提供——官方指南在 Place an outbound call 一节写明「Outbound SIP calling is available to all organizations through the Live API, not the Realtime API call-creation endpoint」,Realtime API 的呼叫创建端点不在此外呼通道内。第二,计费口径:官方定价页(2026-11-09 抓取)列 gpt-live-1 语音会话 $0.05 每分钟、按秒计费且不向上取整,后端模型与工具用量单独计费。

状态锚定:截至 2026-11-09 当日抓取,官方 changelog 最新条目仍为 11-05 的 GPT-6 Cyber,11 月侧再无更新的 API 层条目。

2. 一通外呼的完整链路

整个外呼分四段:创建会话 → 附着 sideband → 监听呼叫进度事件 → 通话中控制(可选),最后保持 sideband 直到收到 session.closed 拿最终用量。与呼入不同,外呼不需要来电 webhook,也不需要 accept 请求——创建会话本身就是拨号动作。

创建会话用官方指南照录的 curl 加 jq 示例(示例选择 client 委托,你的后端需要处理受托工作;供应商端点与电话号码请替换为你自己的值):

jq -n \
  --arg username "$SIP_USERNAME" \
  --arg password "$SIP_PASSWORD" \
  '{
    "session": {
      "model": "gpt-live-1",
      "instructions": "Help the user schedule an appointment.",
      "audio": { "output": { "voice": "marin" } },
      "delegation": { "type": "client" }
    },
    "transport": {
      "type": "sip",
      "destination": "+14155550123",
      "trunk": {
        "provider_url": "sips:sip.example.com:5061",
        "auth": {
          "type": "digest",
          "username": $username,
          "password": $password
        },
        "caller_number": "+14155550100"
      }
    }
  }' | curl https://api.openai.com/v1/live/sessions \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -H "Content-Type: application/json" \
    --data-binary @-

请求成功返回 200 与一个极简的响应体:

{
  "session": { "id": "live_123" },
  "transport": { "type": "sip" }
}

官方指南对这个响应有三个强调:它不代表电话已被接听;其中不含 SDP,也不含 trunk 凭据;session.id 要原样保留,后续的 sideband 连接与通话控制都靠它。另外创建外呼会话时省略 audio.format——音频格式由 SIP 协商。

3. trunk 配置字段与供应商要求

trunk 配置随每次请求一起提交,字段如下(全部出自官方指南):

字段值
transport.destination要拨打的电话号码,E.164 格式(如 +14155550123);不支持 SIP URI 目标
transport.trunk.provider_url供应商端点,如 sips:sip.example.com:5061;默认端口 5061,;transport=tcp 可选
transport.trunk.auth.typedigest(SIP Digest 认证)
transport.trunk.auth.username供应商的 SIP 用户名
transport.trunk.auth.password供应商的 SIP 密码
transport.trunk.caller_number发给供应商的主叫号码,E.164 格式

供应商侧的硬性要求:中继必须支持 TLS 信令与 SDES-SRTP 媒体,并且在拨号前先在供应商设置里启用 SRTP。provider_url 必须用 sips: 形式(TLS 信令),URL 里不能带凭据、路径、URI 头或其他 URI 参数;本地主机名与私有、本地 IP 字面量会被拒绝。OpenAI API key 与 SIP 凭据都留在你自己的服务器上。网络侧还有一组放行要求:SIP 信令走 GeoIP 路由端点 sip.api.openai.com 与 sip-eu.api.openai.com(对 DNS 解析出的地址放行 TCP/TLS 5061 端口的出站流量),SRTP 媒体按协商 SDP 给出的地址与端口放行双向 UDP——官方指南列出四个 /28 CIDR 段。

4. 通话进度事件、限额与错误

附着 sideband 后,呼叫进度经三个事件下发(官方指南的事件表):

事件含义
transport.ringing供应商报告振铃或早媒体
transport.answered电话已被接听且媒体已建立
transport.failed会话初始化后呼叫建立失败,检查 error.code 与 error.message

每个事件都带 event_id 与 session_id。附着时机是硬约束:sideband 只回放附着前 3 秒内的事件,附着晚了就会错过更早的呼叫进度;回放的事件保留原始 event_id,按 event_id 去重即可。

限额与错误都是指南明说的数字与状态码:振铃最长 3 分钟、接通后通话最长 2 小时,两者都不能在创建请求里配置;无效的会话配置在创建请求上直接返回;传输建立失败可返回 502,初始化超时返回 504;创建成功之后的异步建立失败,要靠监听 transport.failed 感知。

5. 通话中控制:DTMF、转接与挂断

官方指南写明这些控制对呼入呼出都适用。按键音走 sideband 的三个事件:对端按键时收到 transport.dtmf.received;向 trunk 发按键音则发 transport.dtmf.send 客户端事件,成功后收到 transport.dtmf.sent;如果你在发送时带了 event_id,回执里会以 client_event_id 回带,失败则收到带 error.client_event_id 的 error 事件。

转接与挂断是两个普通 HTTP 端点。转接(refer)的请求体只有 target_uri 一个字段:

{ "target_uri": "sip:agent@example.com" }

target_uri 写入 SIP Refer-To 头,可以是 tel:+14155550123 这样的电话 URI,也可以是 sip:agent@example.com 这样的 SIP URI,剩余转接流程由你的供应商完成。挂断(hangup)向 POST /v1/live/sessions/{session_id}/hangup 发送且不带请求体。两个端点成功时都返回 200 与空响应体。收尾规则:保持 sideband 打开直到收到 session.closed,最终用量随该事件给出。

6. SDK 类型层现状:webrtc 之外尚无 sip

本站当日(2026-11-09)对两包官方 SDK 的 tag 源码核对结果:SIP 外呼还没有进入类型层。

  • openai-python v3.47.0:src/openai/types/live/live_create_params.py 里 Transport 的 type 是 Required[Literal["webrtc"]],字段只有 sdp——sip 类型、destination、trunk 等字段都不在类型里;src/openai/resources/live/sessions.py 的方法清单是 accept、download_recording、fork、hangup、refer、reject(同步与异步各一份),没有 create。
  • openai-node v7.53.0:src/resources/live/live.ts 的 LiveCreateParams.Transport 同样只有 type: 'webrtc' 加 sdp。

事件侧倒是先走了一步:openai-node v7.53.0 的 ServerEvent 联合已包含 TransportRinging、TransportAnswered、TransportFailed 与 DTMF 三事件(transport.dtmf.received / send / sent),与指南的进度事件一一对应。也就是说,事件类型已经就位、创建会话的 SIP transport 还没就位——在两包类型层跟进之前,外呼按官方指南用原始 HTTP 调用,等 SDK 更新后再迁回类型化调用。

7. 常见错误与排查

  • 创建请求直接报错:会话配置无效会在创建请求上返回——逐项检查 trunk 字段(sips: 形式、digest 认证、E.164 号码)与省略 audio.format。
  • 返回 502:传输建立失败;官方指南原文给出的状态码之一,重试前先核对供应商端 SRTP 是否已启用。
  • 返回 504:初始化超时。
  • 创建成功但电话没响:创建响应的 200 不代表拨号成功;附着 sideband 监听 transport.failed,按 error.code 与 error.message 排查。
  • 错过了 ringing 事件:附着晚于事件超过回放窗口(仅前 3 秒);下次在创建返回后立即附着,并按 event_id 去重处理回放与实时事件的交叠。
  • DTMF 发送失败:看 error 事件里的 error.client_event_id 定位是哪次发送失败。

8. 下一步

关键要点

  • 官方 changelog 2026-11-02 条目:Outbound SIP calling 经 Live API 对全部组织开放,条目标注 Model 为 gpt-live-1、API 为 v1/live/sessions(本站 2026-11-09 抓取核对;当日 changelog 最新条目仍为 11-05 的 GPT-6 Cyber)
  • 外呼不经 Realtime API 的呼叫创建端点:官方指南原文明确写外呼经 Live API 提供;创建会话时 transport.type 设为 sip,destination 用 E.164 电话号码(如 +14155550123),SIP URI 目标不支持
  • trunk 要求:TLS 信令(provider_url 用 sips:,默认端口 5061)加 SDES-SRTP 媒体,且先在供应商设置里启用 SRTP;auth.type 为 digest,另带 caller_number 主叫号码(E.164)
  • 通话进度事件 transport.ringing / transport.answered / transport.failed 经 sideband WebSocket 下发,各带 event_id 与 session_id;sideband 只回放附着前 3 秒内的事件,按 event_id 去重,附着要趁早
  • 限额:振铃最长 3 分钟、接通通话最长 2 小时,官方写明不能在创建请求里配置;传输建立失败可返回 502、初始化超时返回 504,创建成功后的异步失败靠 transport.failed 感知
  • SDK 类型滞后:截至 openai-python v3.47.0 与 openai-node v7.53.0(tag 实测),两包 LiveCreateParams 的 transport 仍只定义 webrtc 一个类型、python 的 sessions 子资源也没有 create 方法——外呼按官方指南用原始 HTTP 调用

常见问题

四步:服务器向 POST /v1/live/sessions 发会话配置与 transport.type 为 sip 的传输块(destination 填 E.164 号码、trunk 填供应商端点与 digest 认证凭据、caller_number 填主叫号);返回 200 与 session.id 后立即附着 sideband WebSocket;监听 transport.ringing / transport.answered / transport.failed 判断呼叫进度;通话中按需发 DTMF、转接或挂断,最后等 session.closed 拿最终用量。

官方参考

相关文章

订阅 GPTMap Weekly

每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。

提交后将在新标签页打开 Buttondown 完成订阅确认。

GPTMap Editorial发布于 2026-11-09 11 分钟阅读
测试环境(EEAT)
使用模型:gpt-live-1