From 7ad8dd5ed9d252518e1e2b48f3284659b0e5aae3 Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Thu, 12 Mar 2026 13:22:42 -0700 Subject: [PATCH 1/4] 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 f37ea6ffa4b534a585ed104313937efdc9a1352a Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Thu, 12 Mar 2026 14:20:23 -0700 Subject: [PATCH 2/4] 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', From 0b4c9b47159459eb182477ab9048a69ceac3831c Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Wed, 25 Mar 2026 11:10:20 -0700 Subject: [PATCH 3/4] Fix sorting in _LAZY_IMPORTS and __all__ in src/google/adk/agents/__init__.py --- src/google/adk/agents/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index e812add152..98eae32391 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -32,12 +32,12 @@ import importlib _LAZY_IMPORTS = { + "Agent": ".llm_agent", "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", @@ -56,13 +56,13 @@ def __getattr__(name: str): 'Agent', 'BaseAgent', 'Context', + 'InvocationContext', + 'LiveRequest', + 'LiveRequestQueue', 'LlmAgent', 'LoopAgent', 'McpInstructionProvider', 'ParallelAgent', - 'SequentialAgent', - 'InvocationContext', - 'LiveRequest', - 'LiveRequestQueue', 'RunConfig', + 'SequentialAgent', ] From 9d3bbcb101dd5cd32b1fd447b050a4670dd203d0 Mon Sep 17 00:00:00 2001 From: 9chait9 <9chait9@gmail.com> Date: Wed, 25 Mar 2026 12:17:08 -0700 Subject: [PATCH 4/4] Fix formatting issues: Standardize quotes to double quotes in __all__ list. --- src/google/adk/agents/__init__.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index 98eae32391..f8a27fa490 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -53,16 +53,16 @@ def __getattr__(name: str): raise AttributeError(f"module {__name__} has no attribute {name}") __all__ = [ - 'Agent', - 'BaseAgent', - 'Context', - 'InvocationContext', - 'LiveRequest', - 'LiveRequestQueue', - 'LlmAgent', - 'LoopAgent', - 'McpInstructionProvider', - 'ParallelAgent', - 'RunConfig', - 'SequentialAgent', + "Agent", + "BaseAgent", + "Context", + "InvocationContext", + "LiveRequest", + "LiveRequestQueue", + "LlmAgent", + "LoopAgent", + "McpInstructionProvider", + "ParallelAgent", + "RunConfig", + "SequentialAgent", ]