BUG: IndexError in _transform_recursive when TypedDict field uses bare dict annotation

当你在 OpenAI Python SDK 中定义的 TypedDict 字段使用了不带类型参数的裸 dict (如 metadata: dict 而非 metadata: dict[str, str] )时,调用 transform() 会在内部递归转换阶段抛出 IndexError 。优先检查出

快速结论:当你在 OpenAI Python SDK 中定义的 TypedDict 字段使用了不带类型参数的裸 dict(如 metadata: dict 而非 metadata: dict[str, str])时,调用 transform() 会在内部递归转换阶段抛出 IndexError。优先检查出错的 TypedDict 字段是否漏写 dict 的 key/value 类型参数。

适用环境:OpenAI Python SDK;Issue 确认此问题存在于同步与异步请求转换路径。核心报错与 Python 版本、CUDA、显卡无关。修复提交已合入 main,且明确未包含在 v3.11.0 中。

最快修复方案:使用包含 PR #3760 的 SDK 版本(合入 main 后的后续 release),或在本地代码中把裸 dict 注解补全为带参数的 dict[...]

注意事项:Issue 说明修复会“保留嵌套模型序列化”,即合入后裸 dict 会被按原样返回,而不做进一步的键值递归转换,这可能导致嵌套模型不再被处理,需自行确认是否符合预期。是否已进入某个具体版本需以实际安装的 SDK 为准。

问题场景

在使用 OpenAI Python SDK 的项目里,自定义了一个 TypedDict(例如用于请求参数),其中某个字段被写成裸的、未参数化的 dict,然后调用 SDK 内部的 transform() 进行请求数据转换。触发代码如下:

from typing import TypedDict
from openai._utils._transform import transform

class TestParams(TypedDict, total=False):
    metadata: dict  # bare dict — no type parameters

result = transform({"metadata": {"key": "value"}}, TestParams)

该问题同样会出现在异步请求转换路径中。

报错原文

File ".../openai/_utils/_transform.py", line 183, in _transform_recursive
    items_type = get_args(stripped_type)[1]
                 ~~~~~~~~~~~~~~~~~~~~~~~^^^
IndexError: tuple index out of range

原因分析

_transform_recursive(以及其异步对应实现)中,处理 origin == dict 的分支会直接执行 get_args(stripped_type)[1]。对于裸 dictget_args(dict) 返回空元组,取下标 1 就会抛出 IndexError。因此,字段类型注解不完整只是触发条件,真正的原因是 SDK 内部对类型参数数量缺少判断。

环境排查

  • 确认 OpenAI Python SDK 版本:问题修复在 main,明确未包含在 v3.11.0;需确认安装版本是否已包含 PR #3760。
  • 确认触发路径是同步请求转换还是异步请求转换,两者均受影响。
  • 确认自定义 TypedDict 中是否存在裸 dict 注解字段。
  • Issue 未提供 Python、CUDA、PyTorch、显卡等环境信息,无需据此排查。

解决步骤

  1. 定位报错堆栈指向的 _transform_recursive,确认是对 origin == dict 分支的 get_args(stripped_type)[1] 触发 IndexError
  2. 升级到包含 PR #3760 的 OpenAI Python SDK 版本(该修复已合入 main,v3.11.0 不含此修复)。
  3. 若暂时无法升级,可优先尝试把裸 dict 注解改为带类型参数的写法,例如 metadata: dict[str, str],绕开无类型参数的路径。
  4. 如需自行打补丁,按 Issue 建议改为先取 args = get_args(stripped_type),仅当 len(args) >= 2 时才用 args[1] 递归,否则原样返回 data

验证方法

重新运行触发用例 transform({"metadata": {"key": "value"}}, TestParams),若不再抛出 IndexError 且返回预期数据,即说明问题已解决。同时建议验证包含嵌套模型的字段仍能正常序列化,以确认修复未引入回归。

参考来源

openai/openai-python #3338

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22566

发表回复

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