Skip to content

Commit b7bb2dd

Browse files
committed
Fix lazy openai.types to stay module-backed
1 parent 9378a2d commit b7bb2dd

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
@@ -89,17 +89,6 @@
8989
if _t.TYPE_CHECKING:
9090
from . import types as types
9191
from .lib.azure import AzureADTokenProvider, AzureOpenAI, AsyncAzureOpenAI
92-
else:
93-
from ._utils._proxy import LazyProxy as _LazyProxy
94-
95-
class _TypesProxy(_LazyProxy[_t.Any]):
96-
@override
97-
def __load__(self) -> _t.Any:
98-
import importlib
99-
100-
return importlib.import_module("openai.types")
101-
102-
types = _TypesProxy().__as_proxied__()
10392

10493
from .version import VERSION as VERSION
10594
from .lib._old_api import *
@@ -134,6 +123,12 @@ def _lazy_azure_openai() -> object:
134123
return AzureOpenAI
135124

136125

126+
def _lazy_types_module() -> object:
127+
import importlib
128+
129+
return importlib.import_module("openai.types")
130+
131+
137132
def _lazy_async_azure_openai() -> object:
138133
from .lib.azure import AsyncAzureOpenAI
139134

@@ -159,6 +154,7 @@ def _lazy_async_assistant_event_handler() -> object:
159154

160155

161156
_LAZY_EXPORTS: dict[str, _t.Callable[[], object]] = {
157+
"types": _lazy_types_module,
162158
"AzureOpenAI": _lazy_azure_openai,
163159
"AsyncAzureOpenAI": _lazy_async_azure_openai,
164160
"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)