diff --git a/src/openai/_files.py b/src/openai/_files.py index 7b23ca084a..f4796050e8 100644 --- a/src/openai/_files.py +++ b/src/openai/_files.py @@ -61,6 +61,9 @@ def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: def _transform_file(file: FileTypes) -> HttpxFileTypes: + if is_tuple_t(file): + return (file[0], read_file_content(file[1]), *file[2:]) + if is_file_content(file): if isinstance(file, os.PathLike): path = pathlib.Path(file) @@ -68,9 +71,6 @@ def _transform_file(file: FileTypes) -> HttpxFileTypes: return file - if is_tuple_t(file): - return (file[0], read_file_content(file[1]), *file[2:]) - raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") @@ -103,6 +103,9 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles async def _async_transform_file(file: FileTypes) -> HttpxFileTypes: + if is_tuple_t(file): + return (file[0], await async_read_file_content(file[1]), *file[2:]) + if is_file_content(file): if isinstance(file, os.PathLike): path = anyio.Path(file) @@ -110,9 +113,6 @@ async def _async_transform_file(file: FileTypes) -> HttpxFileTypes: return file - if is_tuple_t(file): - return (file[0], await async_read_file_content(file[1]), *file[2:]) - raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") diff --git a/tests/test_files.py b/tests/test_files.py index 15d5c6a811..ce9ac7e21f 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -21,6 +21,12 @@ def test_tuple_input() -> None: assert result == IsList(IsTuple("file", IsTuple("README.md", IsBytes()))) +def test_tuple_content_supports_pathlike() -> None: + result = to_httpx_files({"file": ("custom.txt", readme_path)}) + print(result) + assert result == IsDict({"file": IsTuple("custom.txt", IsBytes())}) + + @pytest.mark.asyncio async def test_async_pathlib_includes_file_name() -> None: result = await async_to_httpx_files({"file": readme_path}) @@ -42,6 +48,13 @@ async def test_async_tuple_input() -> None: assert result == IsList(IsTuple("file", IsTuple("README.md", IsBytes()))) +@pytest.mark.asyncio +async def test_async_tuple_content_supports_pathlike() -> None: + result = await async_to_httpx_files({"file": ("custom.txt", readme_path)}) + print(result) + assert result == IsDict({"file": IsTuple("custom.txt", IsBytes())}) + + def test_string_not_allowed() -> None: with pytest.raises(TypeError, match="Expected file types input to be a FileContent type or to be a tuple"): to_httpx_files(