TypeError: Object of type Omit is not JSON serializable

这个报错通常出现在 OpenAI Python SDK 的 Realtime 连接尚未真正建立时,就通过 connection_manager.send() 发送包含 omit / NotGiven 字段的 dict 事件;此时 SDK 走了 json.dumps() 而不是 maybe_trans

快速结论:这个报错通常出现在 OpenAI Python SDK 的 Realtime 连接尚未真正建立时,就通过 connection_manager.send() 发送包含 omit / NotGiven 字段的 dict 事件;此时 SDK 走了 json.dumps() 而不是 maybe_transform(),导致无法序列化。优先排查:是否在预连接阶段发送了 dict 事件,以及是否使用了 omit

适用环境:Issue 中已确认的工具为 OpenAI Python SDK(Realtime 相关接口,含同步与异步客户端);原始复现使用 model="gpt-4o-realtime-preview"。Issue 未提供操作系统、Python、CUDA、显卡或具体 SDK 版本信息。

最快修复方案:Issue 中明确验证的修复是升级到包含 PR #3944 的版本;该 PR 让“预连接阶段排队发送的 Realtime 事件”与“已连接后的 send()”使用相同的序列化处理逻辑,同步和异步客户端均已修复。

注意事项:如果无法升级 SDK,可优先尝试避免在预连接阶段发送带 omit / NotGiven 的 dict 事件,或等待连接建立后再调用 send();但这属于规避思路,Issue 未将其作为已验证的正式修复。Issue 也未列出受影响的版本范围,因此升级前需要自行确认目标版本已包含 #3944。

问题场景

用户使用 OpenAI Python SDK 的 Realtime 功能:先通过 client.realtime.connect(model="gpt-4o-realtime-preview") 获取 AsyncRealtimeConnectionManager / RealtimeConnectionManager,然后在这个 manager 上直接调用 send(),传入一个 dict 事件,例如 {"type": "response.cancel", "event_id": omit}。问题发生在连接真正建立之前(pre-connect)的发送路径上。

报错原文

TypeError: Object of type Omit is not JSON serializable

原因分析

根据 Issue 描述,AsyncRealtimeConnectionManager.send() / RealtimeConnectionManager.send() 对 dict payload 直接调用了 json.dumps(event)。但连接建立之后,connection.send() 使用的是 maybe_transform(),它会正确剥离 Omit / NotGiven 这类特殊标记。由于预连接路径缺少这层转换,omit 被原样交给 JSON 序列化器,于是抛出 Object of type Omit is not JSON serializable

根因属于 SDK 内部序列化路径不一致,而不是用户事件内容本身写错。

环境排查

  • 确认使用的是 OpenAI Python SDK,并且调用了 Realtime 相关接口。
  • 确认触发代码是否在连接建立前对 RealtimeConnectionManager / AsyncRealtimeConnectionManager 调用 send()
  • 确认传入的 dict 事件中是否包含 omitNotGiven 字段。
  • 确认当前 SDK 版本是否已包含 PR #3944 的修复。
  • 确认同步客户端和异步客户端是否都受影响(Issue 中两者均被提到,且 #3944 对两者做了修复)。
  • 对照连接建立后使用 connection.send() 的路径,看是否能正常发送同一事件。

解决步骤

  1. 升级 OpenAI Python SDK 到包含 PR #3944 的版本,这是 Issue 中明确验证过的修复方式。
  2. 升级后,用原始复现代码验证:manager.send({"type": "response.cancel", "event_id": omit}) 不再抛出序列化错误。
  3. 如果暂时不能升级,可优先尝试规避:不要在 pre-connect 阶段发送带 omit / NotGiven 的 dict 事件;等连接建立后再使用 connection.send() 发送。
  4. 如果业务必须预连接发送,则检查事件中是否可以直接省略该字段,而不是显式使用 omit
  5. 同步和异步两种调用方式都要分别验证,确保使用的是同一套修复后的序列化处理逻辑。

验证方法

使用原始复现代码运行,确认不再出现 TypeError: Object of type Omit is not JSON serializable;同时确认事件被正确发送或被正常排队,而不是在序列化阶段崩溃。对于异步客户端,也建议用相同场景验证一次。

参考来源

openai/openai-python #3402

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25128

发表回复

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