From 23fc17ff1103a1045039d25fe65c95b72c8a7f38 Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Thu, 12 Mar 2026 13:22:42 -0700 Subject: [PATCH 1/2] Fix #2433: Lazy load modules to improve import time --- src/google/adk/__init__.py | 22 ++++++++-- src/google/adk/agents/__init__.py | 67 +++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 16 deletions(-) diff --git a/src/google/adk/__init__.py b/src/google/adk/__init__.py index d48806bacd..f24ada98b1 100644 --- a/src/google/adk/__init__.py +++ b/src/google/adk/__init__.py @@ -13,11 +13,25 @@ # limitations under the License. from __future__ import annotations +from typing import TYPE_CHECKING -from . import version -from .agents.context import Context -from .agents.llm_agent import Agent -from .runners import Runner +if TYPE_CHECKING: + from .agents.context import Context + from .agents.llm_agent import Agent + from .runners import Runner +else: + def __getattr__(name: str): + if name == "Agent": + from .agents.llm_agent import Agent + return Agent + if name == "Context": + from .agents.context import Context + return Context + if name == "Runner": + from .runners import Runner + return Runner + raise AttributeError(f"module {__name__} has no attribute {name}") +from . import version __version__ = version.__version__ __all__ = ["Agent", "Context", "Runner"] diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index fbd1808f3f..9cd47ca42f 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -12,18 +12,61 @@ # See the License for the specific language governing permissions and # limitations under the License. -from .base_agent import BaseAgent -from .context import Context -from .invocation_context import InvocationContext -from .live_request_queue import LiveRequest -from .live_request_queue import LiveRequestQueue -from .llm_agent import Agent -from .llm_agent import LlmAgent -from .loop_agent import LoopAgent -from .mcp_instruction_provider import McpInstructionProvider -from .parallel_agent import ParallelAgent -from .run_config import RunConfig -from .sequential_agent import SequentialAgent +from __future__ import annotations +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .base_agent import BaseAgent + from .context import Context + from .invocation_context import InvocationContext + from .live_request_queue import LiveRequest + from .live_request_queue import LiveRequestQueue + from .llm_agent import Agent + from .llm_agent import LlmAgent + from .loop_agent import LoopAgent + from .mcp_instruction_provider import McpInstructionProvider + from .parallel_agent import ParallelAgent + from .run_config import RunConfig + from .sequential_agent import SequentialAgent + +def __getattr__(name: str): + if name == 'BaseAgent': + from .base_agent import BaseAgent + return BaseAgent + if name == 'Context': + from .context import Context + return Context + if name == 'InvocationContext': + from .invocation_context import InvocationContext + return InvocationContext + if name == 'LiveRequest': + from .live_request_queue import LiveRequest + return LiveRequest + if name == 'LiveRequestQueue': + from .live_request_queue import LiveRequestQueue + return LiveRequestQueue + if name == 'Agent': + from .llm_agent import Agent + return Agent + if name == 'LlmAgent': + from .llm_agent import LlmAgent + return LlmAgent + if name == 'LoopAgent': + from .loop_agent import LoopAgent + return LoopAgent + if name == 'McpInstructionProvider': + from .mcp_instruction_provider import McpInstructionProvider + return McpInstructionProvider + if name == 'ParallelAgent': + from .parallel_agent import ParallelAgent + return ParallelAgent + if name == 'RunConfig': + from .run_config import RunConfig + return RunConfig + if name == 'SequentialAgent': + from .sequential_agent import SequentialAgent + return SequentialAgent + raise AttributeError(f"module {__name__} has no attribute {name}") __all__ = [ 'Agent', From 6043f8967d460ddd21b85af0ac64d1f68f5e2766 Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Thu, 12 Mar 2026 14:20:23 -0700 Subject: [PATCH 2/2] Refactor lazy loading to use dictionary-based mapping and fix __getattr__ scope for better maintainability. --- src/google/adk/__init__.py | 20 ++++++----- src/google/adk/agents/__init__.py | 60 ++++++++++++------------------- 2 files changed, 33 insertions(+), 47 deletions(-) diff --git a/src/google/adk/__init__.py b/src/google/adk/__init__.py index f24ada98b1..ef5ee5a03a 100644 --- a/src/google/adk/__init__.py +++ b/src/google/adk/__init__.py @@ -20,16 +20,18 @@ from .agents.llm_agent import Agent from .runners import Runner else: + import importlib + + _LAZY_IMPORTS = { + "Agent": ".agents.llm_agent", + "Context": ".agents.context", + "Runner": ".runners", + } + def __getattr__(name: str): - if name == "Agent": - from .agents.llm_agent import Agent - return Agent - if name == "Context": - from .agents.context import Context - return Context - if name == "Runner": - from .runners import Runner - return Runner + if name in _LAZY_IMPORTS: + module = importlib.import_module(_LAZY_IMPORTS[name], __name__) + return getattr(module, name) raise AttributeError(f"module {__name__} has no attribute {name}") from . import version diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index 9cd47ca42f..e812add152 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -28,45 +28,29 @@ from .parallel_agent import ParallelAgent from .run_config import RunConfig from .sequential_agent import SequentialAgent +else: + import importlib -def __getattr__(name: str): - if name == 'BaseAgent': - from .base_agent import BaseAgent - return BaseAgent - if name == 'Context': - from .context import Context - return Context - if name == 'InvocationContext': - from .invocation_context import InvocationContext - return InvocationContext - if name == 'LiveRequest': - from .live_request_queue import LiveRequest - return LiveRequest - if name == 'LiveRequestQueue': - from .live_request_queue import LiveRequestQueue - return LiveRequestQueue - if name == 'Agent': - from .llm_agent import Agent - return Agent - if name == 'LlmAgent': - from .llm_agent import LlmAgent - return LlmAgent - if name == 'LoopAgent': - from .loop_agent import LoopAgent - return LoopAgent - if name == 'McpInstructionProvider': - from .mcp_instruction_provider import McpInstructionProvider - return McpInstructionProvider - if name == 'ParallelAgent': - from .parallel_agent import ParallelAgent - return ParallelAgent - if name == 'RunConfig': - from .run_config import RunConfig - return RunConfig - if name == 'SequentialAgent': - from .sequential_agent import SequentialAgent - return SequentialAgent - raise AttributeError(f"module {__name__} has no attribute {name}") + _LAZY_IMPORTS = { + "BaseAgent": ".base_agent", + "Context": ".context", + "InvocationContext": ".invocation_context", + "LiveRequest": ".live_request_queue", + "LiveRequestQueue": ".live_request_queue", + "Agent": ".llm_agent", + "LlmAgent": ".llm_agent", + "LoopAgent": ".loop_agent", + "McpInstructionProvider": ".mcp_instruction_provider", + "ParallelAgent": ".parallel_agent", + "RunConfig": ".run_config", + "SequentialAgent": ".sequential_agent", + } + + def __getattr__(name: str): + if name in _LAZY_IMPORTS: + module = importlib.import_module(_LAZY_IMPORTS[name], __name__) + return getattr(module, name) + raise AttributeError(f"module {__name__} has no attribute {name}") __all__ = [ 'Agent',