TypeError: ‘MockValSer’ object cannot be converted to ‘SchemaSerializer’

这个报错通常出现在使用 openai 1.16.1 时,对 SDK 返回对象(尤其是流式 tool call 相关的类,如 ChoiceDeltaToolCall 、 ChatCompletionMessageToolCall )调用 model_dump() ,由于该版本默认延迟构建 pydant

快速结论:这个报错通常出现在使用 openai 1.16.1 时,对 SDK 返回对象(尤其是流式 tool call 相关的类,如 ChoiceDeltaToolCall、ChatCompletionMessageToolCall)调用 model_dump(),由于该版本默认延迟构建 pydantic 模型,触发 pydantic 序列化器异常。优先排查 DEFER_PYDANTIC_BUILD 环境变量和 pydantic 版本。

适用环境:Python 3.11.8;openai 1.16.1;pydantic 2.6.4;操作系统为 macOS 与 Linux。其他环境在该 Issue 中未被确认。

最快修复方案:设置环境变量 DEFER_PYDANTIC_BUILD=0,使 SDK 不延迟构建 pydantic 模型,这是 Issue 中确认可用的绕过方式。

注意事项:该方案不是库作者的官方修复,Issue 最终以“已有绕过方案”结束;环境变量名在讨论中曾出现笔误,正确名称是 DEFER_PYDANTIC_BUILD,不是 PYDANTIC_DEFER_BUILD。该问题根因指向 pydantic 自身的一个已报告 bug,openai 侧只是通过延迟构建将其暴露出来。

问题场景

用户在使用 OpenAI Python SDK 1.16.1 处理流式 tool call 消息时,对 SDK 返回的消息对象调用 model_dump(),例如把 params["messages"] 中的 ChoiceDeltaToolCall 或 ChatCompletionMessageToolCall 逐个 dump,用于再次构造请求参数。该操作在 1.16.1 之前的版本中正常,升级后开始抛出 pydantic 序列化相关异常。另有用户反馈在 LangChain 的 tool call 场景中也遇到同样问题。

报错原文

Traceback (most recent call last):
  ...
  File ".../pydantic/main.py", line 314, in model_dump
    return self.__pydantic_serializer__.to_python(
TypeError: 'MockValSer' object cannot be converted to 'SchemaSerializer'

原因分析

openai 1.16.1 引入了延迟构建 pydantic 模型的改动(对应 PR #1292 中的提交 bc6866eb),用于加快导入速度。该改动通过环境变量控制是否延迟构建。延迟构建后,深层模型在序列化时可能尚未完成 __pydantic_serializer__ 的初始化,model_dump() 拿到的仍是占位对象,于是抛出 TypeError: 'MockValSer' object cannot be converted to 'SchemaSerializer'。Issue 维护者指出这与 pydantic 已报告的 bug #7713 相符,因此可能原因是 pydantic 在延迟构建模式下的序列化器初始化问题,并非 OpenAI API 本身出错。

环境排查

  • 确认 openai 版本是否为 1.16.1,或包含 DEFER_PYDANTIC_BUILD 相关改动的版本。
  • 确认 pydantic 版本,Issue 中复现者为 2.6.4。
  • 确认 Python 版本,Issue 中为 3.11.8。
  • 确认是否在代码中对 SDK 返回对象直接调用 model_dump(),尤其是流式 tool call 消息或嵌套较深的消息类。
  • 确认环境中是否设置了 DEFER_PYDANTIC_BUILD,以及设置的是否为正确名称。
  • 确认是否通过 LangChain 等上层封装间接调用 model_dump()。

解决步骤

  1. 在运行环境中设置 DEFER_PYDANTIC_BUILD=0,例如在启动脚本、容器环境变量或 shell 中导出,确保在导入 openai 之前生效。
  2. 注意不要写成 PYDANTIC_DEFER_BUILD,该名称是讨论中的笔误,Issue 作者后续已更正。
  3. 如果无法设置环境变量,可在调用 model_dump() 前显式执行一次模型重建,例如对相关类调用 Model.model_rebuild()(Issue 维护者给出的“probably fix”建议,可优先尝试)。
  4. 如果仍不稳定,可临时回避对 SDK 返回对象直接做 model_dump(),改为自行提取所需字段再构造请求参数(Issue 报告者最终采用的方式)。
  5. 升级或降级 openai、pydantic 版本前,先确认目标版本是否已修复对应 pydantic 序列化问题,Issue 中未给出具体已修复版本。

验证方法

设置 DEFER_PYDANTIC_BUILD=0 后重新运行相同流式 tool call 流程,对返回的 ChoiceDeltaToolCall 或 ChatCompletionMessageToolCall 调用 model_dump(),观察是否还出现 TypeError: 'MockValSer' object cannot be converted to 'SchemaSerializer'。同时确认 dump 结果包含预期字段、可用于后续请求构造。若不再报错且字段完整,即视为绕过成功。

参考来源

openai/openai-python #1306

pydantic/pydantic #7713

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27024

发表回复

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