From c2dea2657e313470c3c35cc2ff26b89b28056d7b Mon Sep 17 00:00:00 2001 From: zhangjiarui Date: Tue, 9 Jun 2026 09:32:03 +0800 Subject: [PATCH] fix: handle bare dict annotations in transform Avoid indexing missing type arguments when request transform logic sees an unparameterized dict field. Fixes #3338 --- src/openai/_utils/_transform.py | 12 ++++++++++-- tests/test_transform.py | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/openai/_utils/_transform.py b/src/openai/_utils/_transform.py index 414f38c340..cd3084a3bb 100644 --- a/src/openai/_utils/_transform.py +++ b/src/openai/_utils/_transform.py @@ -180,7 +180,11 @@ def _transform_recursive( return _transform_typeddict(data, stripped_type) if origin == dict and is_mapping(data): - items_type = get_args(stripped_type)[1] + args = get_args(stripped_type) + if len(args) < 2: + return data + + items_type = args[1] return {key: _transform_recursive(value, annotation=items_type) for key, value in data.items()} if ( @@ -346,7 +350,11 @@ async def _async_transform_recursive( return await _async_transform_typeddict(data, stripped_type) if origin == dict and is_mapping(data): - items_type = get_args(stripped_type)[1] + args = get_args(stripped_type) + if len(args) < 2: + return data + + items_type = args[1] return {key: _transform_recursive(value, annotation=items_type) for key, value in data.items()} if ( diff --git a/tests/test_transform.py b/tests/test_transform.py index bece75dfc7..874c205906 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -154,6 +154,18 @@ class Bar7(TypedDict): foo: str +class Foo7BareDict(TypedDict): + metadata: dict + + +@parametrize +@pytest.mark.asyncio +async def test_bare_dict_typeddict_field(use_async: bool) -> None: + data = {"metadata": {"key": "value"}} + + assert await transform(data, Foo7BareDict, use_async) == data + + @parametrize @pytest.mark.asyncio async def test_ignores_invalid_input(use_async: bool) -> None: