diff --git a/renderers/__init__.py b/renderers/__init__.py index 0ae78ac..c95719b 100644 --- a/renderers/__init__.py +++ b/renderers/__init__.py @@ -59,20 +59,51 @@ Qwen3VLRendererConfig, RendererConfig, ) -from renderers.deepseek_v3 import DeepSeekV3Renderer -from renderers.default import DefaultRenderer -from renderers.glm5 import GLM5Renderer, GLM51Renderer -from renderers.glm45 import GLM45Renderer -from renderers.gpt_oss import GptOssRenderer -from renderers.kimi_k2 import KimiK2Renderer -from renderers.kimi_k25 import KimiK25Renderer -from renderers.laguna_xs2 import LagunaXS2Renderer -from renderers.minimax_m2 import MiniMaxM2Renderer -from renderers.nemotron3 import Nemotron3Renderer -from renderers.qwen3 import Qwen3Renderer -from renderers.qwen3_vl import Qwen3VLRenderer -from renderers.qwen35 import Qwen35Renderer -from renderers.qwen36 import Qwen36Renderer + +# Concrete renderer classes are lazy-loaded so that consumers needing +# only the config layer (``RendererConfig`` discriminated union) don't +# pay the ``transformers`` import cost. Each renderer module does +# ``from transformers.tokenization_utils import PreTrainedTokenizer`` +# at module level, so eager imports here would drag ``transformers`` +# into every downstream ``import renderers``. ``__getattr__`` (PEP 562) +# resolves the names on first attribute access, so ``from renderers +# import DefaultRenderer`` and ``renderers.DefaultRenderer`` both work +# transparently. ``create_renderer`` doesn't depend on these eager +# imports — ``renderers.base._populate_registry`` lazy-imports the +# concrete classes itself when a renderer is instantiated. +_LAZY_RENDERERS: dict[str, str] = { + "DeepSeekV3Renderer": "renderers.deepseek_v3", + "DefaultRenderer": "renderers.default", + "GLM45Renderer": "renderers.glm45", + "GLM51Renderer": "renderers.glm5", + "GLM5Renderer": "renderers.glm5", + "GptOssRenderer": "renderers.gpt_oss", + "KimiK25Renderer": "renderers.kimi_k25", + "KimiK2Renderer": "renderers.kimi_k2", + "LagunaXS2Renderer": "renderers.laguna_xs2", + "MiniMaxM2Renderer": "renderers.minimax_m2", + "Nemotron3Renderer": "renderers.nemotron3", + "Qwen35Renderer": "renderers.qwen35", + "Qwen36Renderer": "renderers.qwen36", + "Qwen3Renderer": "renderers.qwen3", + "Qwen3VLRenderer": "renderers.qwen3_vl", +} + + +def __getattr__(name: str): + if name in _LAZY_RENDERERS: + import importlib + + module = importlib.import_module(_LAZY_RENDERERS[name]) + value = getattr(module, name) + globals()[name] = value # cache for subsequent lookups + return value + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +def __dir__() -> list[str]: + return sorted(set(globals().keys()) | set(_LAZY_RENDERERS)) + __all__ = [ "AutoRendererConfig",