Skip to content

Commit 0c6ff1a

Browse files
committed
Fix lazy openai.types to stay module-backed
1 parent 9dff11a commit 0c6ff1a

2 files changed

Lines changed: 46 additions & 11 deletions

File tree

src/openai/__init__.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,6 @@
9898
if _t.TYPE_CHECKING:
9999
from . import types as types
100100
from .lib.azure import AzureADTokenProvider, AzureOpenAI, AsyncAzureOpenAI
101-
else:
102-
from ._utils._proxy import LazyProxy as _LazyProxy
103-
104-
class _TypesProxy(_LazyProxy[_t.Any]):
105-
@override
106-
def __load__(self) -> _t.Any:
107-
import importlib
108-
109-
return importlib.import_module("openai.types")
110-
111-
types = _TypesProxy().__as_proxied__()
112101

113102
from .version import VERSION as VERSION
114103
from .lib._old_api import *
@@ -143,6 +132,12 @@ def _lazy_azure_openai() -> object:
143132
return AzureOpenAI
144133

145134

135+
def _lazy_types_module() -> object:
136+
import importlib
137+
138+
return importlib.import_module("openai.types")
139+
140+
146141
def _lazy_async_azure_openai() -> object:
147142
from .lib.azure import AsyncAzureOpenAI
148143

@@ -168,6 +163,7 @@ def _lazy_async_assistant_event_handler() -> object:
168163

169164

170165
_LAZY_EXPORTS: dict[str, _t.Callable[[], object]] = {
166+
"types": _lazy_types_module,
171167
"AzureOpenAI": _lazy_azure_openai,
172168
"AsyncAzureOpenAI": _lazy_async_azure_openai,
173169
"pydantic_function_tool": _lazy_pydantic_function_tool,

tests/test_lazy_types_import.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from __future__ import annotations
2+
3+
import importlib
4+
import sys
5+
from types import ModuleType
6+
7+
8+
def _openai_modules() -> dict[str, object]:
9+
return {name: mod for name, mod in sys.modules.items() if name == "openai" or name.startswith("openai.")}
10+
11+
12+
def test_openai_types_are_lazy_imported() -> None:
13+
original_modules = _openai_modules()
14+
15+
for name in original_modules:
16+
sys.modules.pop(name, None)
17+
18+
try:
19+
openai = importlib.import_module("openai")
20+
21+
assert "openai.types" not in sys.modules
22+
23+
# Attribute access should trigger the lazy import.
24+
assert openai.types.ChatModel is not None
25+
assert "openai.types" in sys.modules
26+
27+
types_module = sys.modules["openai.types"]
28+
assert isinstance(openai.types, ModuleType)
29+
assert openai.types is types_module
30+
31+
# Module reload should keep the binding pointed at the module object.
32+
reloaded = importlib.reload(openai.types)
33+
assert reloaded is openai.types
34+
assert reloaded is sys.modules["openai.types"]
35+
finally:
36+
for name in list(sys.modules):
37+
if name == "openai" or name.startswith("openai."):
38+
sys.modules.pop(name, None)
39+
sys.modules.update(original_modules)

0 commit comments

Comments
 (0)