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

这个报错通常出现在 openai-python v1.16.x 对返回对象调用 model_dump() 时,尤其是流式 tool call 返回的深层 Pydantic 模型。优先排查是否为 v1.16.1 引入的延迟构建行为,并检查 DEFER_PYDANTIC_BUILD 环境变量。

快速结论:这个报错通常出现在 openai-python v1.16.x 对返回对象调用 model_dump() 时,尤其是流式 tool call 返回的深层 Pydantic 模型。优先排查是否为 v1.16.1 引入的延迟构建行为,并检查 DEFER_PYDANTIC_BUILD 环境变量。

适用环境:Issue 中确认的环境为 macOS、Linux,Python 3.11.8,openai v1.16.1,pydantic 2.6.4。

最快修复方案:设置环境变量 DEFER_PYDANTIC_BUILD=0,或对相关模型调用 model_rebuild()。Issue 中有用户确认通过 DEFER_PYDANTIC_BUILD 解决了该问题。

注意事项:DEFER_PYDANTIC_BUILD 并非公开稳定配置项,后续版本可能改名或移除;在 Issue 讨论中维护者也表示该变量原本仅供内部使用,重命名是合理的。不同 pydantic 版本下的表现可能不一致。

问题场景

使用 OpenAI Python SDK v1.16.1 时,对库返回的 Pydantic 模型对象调用 model_dump() 会抛出序列化错误。Issue 中触发场景是流式 tool call 的 chat completion 消息,params["messages"]list[ChoiceDeltaToolCall]list[ChatCompletionMessageToolCall],在 Django 后端流式响应中遍历并 dump 这些消息时失败。也有评论提到在使用 LangChain 的 tool call 时遇到相同问题。

报错原文

Traceback (most recent call last):
  File ".../wsgiref/handlers.py", line 138, in run
    self.finish_response()
  File ".../django/core/servers/basehttp.py", line 173, in finish_response
    super().finish_response()
  File ".../wsgiref/handlers.py", line 183, in finish_response
    for data in self.result:
  File ".../backend/chat/views.py", line 91, in message_save_wrapper
    for message_chunk in generator:
  File ".../backend/llm/handlers/openaifunction.py", line 285, in chat_streaming
    for chunk in response:
  File ".../backend/llm/handlers/openai.py", line 73, in _traced_completion_create_streaming
    call_params["messages"] = [m.model_dump() for m in params["messages"]]
  File ".../backend/llm/handlers/openai.py", line 73, in 
    call_params["messages"] = [m.model_dump() for m in params["messages"]]
  File ".../pydantic/main.py", line 314, in model_dump
    return self.__pydantic_serializer__.to_python(
TypeError: 'MockValSer' object cannot be converted to 'SchemaSerializer'

原因分析

最可能的原因是 openai-python v1.16.1 通过 PR #1292 引入了 Pydantic 模型的延迟构建(defer build),导致部分深层模型在调用 model_dump() 时其内部序列化器仍处于未正确构建的 mock 状态。Issue 讨论中维护者指出这可能与 pydantic 的已知问题 pydantic/pydantic#7713 有关。用户报告 pydantic 2.6.4 下出现该问题,且通过 DEFER_PYDANTIC_BUILD 可规避。需要说明的是,Issue 中没有给出完整的独立复现脚本,因此上述判断为“可能原因”。

环境排查

  • 确认 openai-python 版本是否为 v1.16.1 或包含相同延迟构建变更的版本。
  • 确认 pydantic 版本,Issue 中报告为 2.6.4。
  • 确认 Python 版本,Issue 中为 3.11.8。
  • 确认操作系统,Issue 中涉及 macOS 和 Linux。
  • 确认是否在流式 tool call 或 LangChain tool call 场景中对返回对象调用了 model_dump()
  • 确认是否设置了 DEFER_PYDANTIC_BUILD 环境变量,以及其值是否为 0

解决步骤

  1. 优先尝试设置环境变量 DEFER_PYDANTIC_BUILD=0,然后重新运行触发问题的代码。Issue 中有用户确认该方式可绕过报错。
  2. 如果不方便设置环境变量,可尝试对报错涉及的模型调用 model_rebuild(),例如 ChatCompletionChunk.model_rebuild(),再调用 model_dump()。该方式在 Issue 中被维护者作为“probably fix”提出,属于可优先尝试的方案。
  3. 回退 openai-python 到 v1.16.1 之前的版本,避免延迟构建行为。Issue 中提到 v1.16.1 引入了该变更。
  4. 如果业务代码允许,调整代码避免直接对库返回的深层对象调用 model_dump()。Issue 作者表示其团队最终通过重写代码绕开了该行为。
  5. 关注 openai-python 后续版本是否重命名或移除该环境变量,避免长期依赖非公开配置。

验证方法

在流式 tool call chat completion 场景中,对返回的 ChoiceDeltaToolCallChatCompletionMessageToolCall 对象调用 model_dump(),确认不再出现 TypeError: 'MockValSer' object cannot be converted to 'SchemaSerializer',并且能正常输出序列化后的字典。若使用 model_rebuild(),需确认重建后序列化结果符合预期。

参考来源

openai/openai-python #1306

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23659

发表回复

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