快速结论:当你在 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]。对于裸 dict,get_args(dict) 返回空元组,取下标 1 就会抛出 IndexError。因此,字段类型注解不完整只是触发条件,真正的原因是 SDK 内部对类型参数数量缺少判断。
环境排查
- 确认 OpenAI Python SDK 版本:问题修复在
main,明确未包含在 v3.11.0;需确认安装版本是否已包含 PR #3760。 - 确认触发路径是同步请求转换还是异步请求转换,两者均受影响。
- 确认自定义
TypedDict中是否存在裸dict注解字段。 - Issue 未提供 Python、CUDA、PyTorch、显卡等环境信息,无需据此排查。
解决步骤
- 定位报错堆栈指向的
_transform_recursive,确认是对origin == dict分支的get_args(stripped_type)[1]触发IndexError。 - 升级到包含 PR #3760 的 OpenAI Python SDK 版本(该修复已合入
main,v3.11.0 不含此修复)。 - 若暂时无法升级,可优先尝试把裸
dict注解改为带类型参数的写法,例如metadata: dict[str, str],绕开无类型参数的路径。 - 如需自行打补丁,按 Issue 建议改为先取
args = get_args(stripped_type),仅当len(args) >= 2时才用args[1]递归,否则原样返回data。
验证方法
重新运行触发用例 transform({"metadata": {"key": "value"}}, TestParams),若不再抛出 IndexError 且返回预期数据,即说明问题已解决。同时建议验证包含嵌套模型的字段仍能正常序列化,以确认修复未引入回归。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


