Skip to content

Commit 88b388e

Browse files
GWealecopybara-github
authored andcommitted
perf(import): lazy-load heavy dependencies
END_PUBLIC https://docs.google.com/document/d/1EpQaKqlX_OT4GrpbpqCLjtyF1pBcCTyu0sjXa8zWk8c/edit?usp=sharing Deeply nested imports in new features (such as `events` pulling in `auth`, which eagerly imports `FastAPI`; and `functions` eagerly importing `OpenTelemetry`) silently added over 400ms to the baseline import time at HEAD, negating recent performance gains. This CL prevents heavy external frameworks from accidentally polluting the top-level `import google.adk` path by: - Deferring FastAPI by converting `auth/__init__.py` to a lazy-loading registry via `__getattr__`. - Moving `AuthConfig` imports behind `if TYPE_CHECKING:` in `event_actions.py`, `functions.py`, and `base_credential_service.py`. - Deferring `OpenTelemetry` by moving `from ..telemetry import _instrumentation` inside `run_async`/`run_live` and moving `from opentelemetry import trace` behind `if TYPE_CHECKING:`. - Adding an `import_tree_audit.py` script and a formal RFC for import time bloat prevention. Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 952421569
1 parent 268815d commit 88b388e

1 file changed

Lines changed: 19 additions & 1 deletion

File tree

src/google/adk/events/event_actions.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from typing import Any
1919
from typing import cast
2020
from typing import Optional
21+
from typing import TYPE_CHECKING
2122
from typing import Union
2223

2324
from google.genai.types import Content
@@ -26,13 +27,18 @@
2627
from pydantic import ConfigDict
2728
from pydantic import Field
2829
from pydantic import field_serializer
30+
from pydantic import field_validator
2931
from pydantic import SerializerFunctionWrapHandler
3032
from pydantic_core import to_jsonable_python
3133

32-
from ..auth.auth_tool import AuthConfig
3334
from ..tools.tool_confirmation import ToolConfirmation
3435
from .ui_widget import UiWidget
3536

37+
if TYPE_CHECKING:
38+
from ..auth.auth_tool import AuthConfig
39+
else:
40+
AuthConfig = Any
41+
3642
logger = logging.getLogger('google_adk.' + __name__)
3743

3844

@@ -131,6 +137,18 @@ def _serialize_state_delta(
131137
- Values: The requested auth config.
132138
"""
133139

140+
@field_validator('requested_auth_configs', mode='after')
141+
@classmethod
142+
def _parse_auth_configs(cls, v: dict[str, Any]) -> dict[str, Any]:
143+
if not v:
144+
return v
145+
from ..auth.auth_tool import AuthConfig
146+
147+
return {
148+
k: AuthConfig.model_validate(val) if isinstance(val, dict) else val
149+
for k, val in v.items()
150+
}
151+
134152
requested_tool_confirmations: dict[str, ToolConfirmation] = Field(
135153
default_factory=dict
136154
)

0 commit comments

Comments
 (0)