[Refactor] litellm/init.py: lazy load dotprompt integration (#18056)

This commit is contained in:
Alexsander Hamir 2025-12-16 07:18:11 -08:00 committed by GitHub
parent feb6924efe
commit f8168f5063
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 63 additions and 6 deletions

View File

@ -72,11 +72,6 @@ from litellm.constants import (
DEFAULT_SOFT_BUDGET,
DEFAULT_ALLOWED_FAILS,
)
from litellm.integrations.dotprompt import (
global_prompt_manager,
global_prompt_directory,
set_global_prompt_directory,
)
from litellm.types.guardrails import GuardrailItem
from litellm.types.secret_managers.main import (
KeyManagementSystem,
@ -1567,6 +1562,7 @@ def __getattr__(name: str) -> Any:
TYPES_UTILS_NAMES,
CACHING_NAMES,
HTTP_HANDLER_NAMES,
DOTPROMPT_NAMES,
)
# Lazy load cost_calculator functions
@ -1615,6 +1611,12 @@ def __getattr__(name: str) -> Any:
return _lazy_import_http_handlers(name)
# Lazy load dotprompt integration globals
if name in DOTPROMPT_NAMES:
from ._lazy_imports import _lazy_import_dotprompt
return _lazy_import_dotprompt(name)
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

View File

@ -78,6 +78,13 @@ HTTP_HANDLER_NAMES = (
"module_level_client",
)
# Dotprompt integration names that support lazy loading via _lazy_import_dotprompt
DOTPROMPT_NAMES = (
"global_prompt_manager",
"global_prompt_directory",
"set_global_prompt_directory",
)
# Lazy import for utils module - imports only the requested item by name.
# Note: PLR0915 (too many statements) is suppressed because the many if statements
# are intentional - each attribute is imported individually only when requested,
@ -504,4 +511,35 @@ def _lazy_import_http_handlers(name: str) -> Any:
_globals["module_level_client"] = sync_client
return sync_client
raise AttributeError(f"HTTP handlers lazy import: unknown attribute {name!r}")
raise AttributeError(f"HTTP handlers lazy import: unknown attribute {name!r}")
def _lazy_import_dotprompt(name: str) -> Any:
"""Lazy import for dotprompt integration globals."""
_globals = _get_litellm_globals()
if name == "global_prompt_manager":
from litellm.integrations.dotprompt import (
global_prompt_manager as _global_prompt_manager,
)
_globals["global_prompt_manager"] = _global_prompt_manager
return _global_prompt_manager
if name == "global_prompt_directory":
from litellm.integrations.dotprompt import (
global_prompt_directory as _global_prompt_directory,
)
_globals["global_prompt_directory"] = _global_prompt_directory
return _global_prompt_directory
if name == "set_global_prompt_directory":
from litellm.integrations.dotprompt import (
set_global_prompt_directory as _set_global_prompt_directory,
)
_globals["set_global_prompt_directory"] = _set_global_prompt_directory
return _set_global_prompt_directory
raise AttributeError(f"Dotprompt lazy import: unknown attribute {name!r}")

View File

@ -27,6 +27,8 @@ from litellm._lazy_imports import (
_lazy_import_caching,
_lazy_import_llm_client_cache,
_lazy_import_http_handlers,
DOTPROMPT_NAMES,
_lazy_import_dotprompt,
)
@ -165,6 +167,21 @@ def test_http_handler_lazy_imports():
_verify_only_requested_name_imported(name, HTTP_HANDLER_NAMES)
def test_dotprompt_lazy_imports():
"""Test that dotprompt globals can be lazy imported."""
for name in DOTPROMPT_NAMES:
_clear_names_from_globals(DOTPROMPT_NAMES)
obj = _lazy_import_dotprompt(name)
assert name in litellm.__dict__
# Only the setter must be callable; others may be None by default
if name == "set_global_prompt_directory":
assert callable(obj), f"{name} should be callable"
_verify_only_requested_name_imported(name, DOTPROMPT_NAMES)
def test_unknown_attribute_raises_error():
"""Test that unknown attributes raise AttributeError."""
with pytest.raises(AttributeError):