extra_headers while using as proxy

当把 OpenAI Python SDK 当成代理(尤其是把 base_url 指向 Portkey 等网关并依赖 default_headers 传递认证信息)来发起 Realtime 连接时,容易出现 extra_headers while using as proxy 相关的 header 处

快速结论:当把 OpenAI Python SDK 当成代理(尤其是把 base_url 指向 Portkey 等网关并依赖 default_headers 传递认证信息)来发起 Realtime 连接时,容易出现 extra_headers while using as proxy 相关的 header 处理问题,表现为 WebSocket 握手返回 401。优先排查 SDK 版本是否已支持在 Realtime 链路中转发 default_headers

适用环境:Issue 中确认的环境:macOS 15.1.1、Python 3.9.6、OpenAI Python SDK v1.58.1,使用 Portkey(portkey.ai)作为网关,配合 AsyncOpenAI 与 Realtime API。修复版本为 3.16.2(GA Realtime client)。CUDA、显卡型号未在 Issue 中提及。

最快修复方案:升级 OpenAI Python SDK 到 3.16.2 或更高版本,改用 client.realtime.connect(...) 发起连接;该版本中 GA Realtime client 会转发 default_headers,且每次调用的 extra_headers 仍然优先生效。

注意事项:Realtime beta API 已于 2025-09-15 退役,老的 client.beta.realtime.connect(...) 写法不再属于受支持路径;若升级并改用 GA 客户端后网关仍拒绝请求,官方建议提供一份去掉凭据的最小复现,以便继续定位是网关侧还是 SDK 侧问题。

问题场景

用户把 OpenAI Python SDK 当作代理转发层使用:用 AsyncOpenAIbase_url 指向 Portkey 网关,并通过 default_headers=createHeaders(...) 承载认证信息(virtual key 等),再调用 Realtime 连接示例。问题发生在建立 Realtime WebSocket 连接的握手阶段,而不是普通的 HTTP 聊天补全请求。

报错原文

websockets.exceptions.InvalidStatus: server rejected WebSocket connection: HTTP 401
extra_headers while using as proxy

原因分析

最可能的原因是:Realtime 连接路径没有把客户端初始化时设置的 default_headers 一并带入 WebSocket 握手请求,导致网关(Portkey)在握手阶段拿不到认证信息,从而返回 401。Issue 正文中的判断是“default headers 未被 extra_headers 考虑”,即认证细节可能存在于默认 headers 中却未随 Realtime 请求发出。官方在评论中确认了这一点,并说明在 3.16.2 的 GA Realtime client 中 default_headers 会被转发。

环境排查

  • 确认 OpenAI Python SDK 版本:Issue 中报错版本为 v1.58.1,修复版本为 3.16.2,请先核对当前是否为受支持的 GA 版本。
  • 确认调用的是 GA 客户端 client.realtime.connect(...),而非已退役的 client.beta.realtime.connect(...)
  • 确认 base_url 指向的是 Portkey 网关地址,且网关侧确实依赖 default_headers 中的凭据完成认证。
  • 确认 Python 版本(Issue 为 3.9.6)与依赖(websockets 等)是否能正常建立 WebSocket 连接。
  • 如需与官方复现对齐,也可核对是否使用了 Issue 中列出的模型名 gpt-4o-realtime-preview-2024-10-01

解决步骤

  1. 升级 OpenAI Python SDK 到 3.16.2 或更高版本,以获取会转发 default_headers 的 GA Realtime client。
  2. 把连接代码从 client.beta.realtime.connect(...) 切换到 client.realtime.connect(...),因为 Realtime beta API 已退役。
  3. 保留 default_headers 中携带的网关认证信息;如某次调用需要额外 header,继续使用 extra_headers,其优先级高于默认 header。
  4. 重新运行 Issue 中的 Realtime 示例,先只发一次会话更新,观察握手是否还返回 401。
  5. 如果升级并改用 GA 客户端后网关仍然拒绝请求,按官方建议整理一份移除凭据后的最小复现,提交到 Issue 中继续排查。

验证方法

升级并改用 client.realtime.connect(...) 后重新发起连接:如果不再抛出 websockets.exceptions.InvalidStatus: server rejected WebSocket connection: HTTP 401,并且能够正常收到 response.text.deltaresponse.text.doneresponse.done 等事件,即说明默认 header 已正确随 Realtime 连接转发,问题解决。若依旧 401,则说明可能出在网关侧认证配置或复现代码本身。

参考来源

openai/openai-python #1975

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24380

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注