diff --git a/src/google/adk/flows/llm_flows/instructions.py b/src/google/adk/flows/llm_flows/instructions.py index 587c1646..7aab3185 100644 --- a/src/google/adk/flows/llm_flows/instructions.py +++ b/src/google/adk/flows/llm_flows/instructions.py @@ -19,7 +19,6 @@ from __future__ import annotations from typing import AsyncGenerator from typing import TYPE_CHECKING -from google.genai import _transformers from typing_extensions import override from ...agents.readonly_context import ReadonlyContext @@ -85,6 +84,8 @@ class _InstructionsLlmRequestProcessor(BaseLlmRequestProcessor): # Handle static_instruction - add via append_instructions if agent.static_instruction: + from google.genai import _transformers + # Convert ContentUnion to Content using genai transformer static_content = _transformers.t_content(agent.static_instruction) llm_request.append_instructions(static_content) diff --git a/src/google/adk/models/apigee_llm.py b/src/google/adk/models/apigee_llm.py index 0d533a67..a2962021 100644 --- a/src/google/adk/models/apigee_llm.py +++ b/src/google/adk/models/apigee_llm.py @@ -18,12 +18,10 @@ from __future__ import annotations from functools import cached_property import logging import os -import re from typing import Optional from typing import TYPE_CHECKING from google.adk import version as adk_version -from google.genai import Client from google.genai import types from typing_extensions import override @@ -31,8 +29,11 @@ from ..utils.env_utils import is_env_enabled from .google_llm import Gemini if TYPE_CHECKING: + from google.genai import Client + from .llm_request import LlmRequest + logger = logging.getLogger('google_adk.' + __name__) _APIGEE_PROXY_URL_ENV_VARIABLE_NAME = 'APIGEE_PROXY_URL' @@ -137,6 +138,7 @@ class ApigeeLlm(Gemini): Returns: The api client. """ + from google.genai import Client kwargs_for_http_options = {} if self._api_version: diff --git a/src/google/adk/models/gemini_context_cache_manager.py b/src/google/adk/models/gemini_context_cache_manager.py index 136890be..cd842cf4 100644 --- a/src/google/adk/models/gemini_context_cache_manager.py +++ b/src/google/adk/models/gemini_context_cache_manager.py @@ -21,8 +21,8 @@ import json import logging import time from typing import Optional +from typing import TYPE_CHECKING -from google.genai import Client from google.genai import types from ..utils.feature_decorator import experimental @@ -32,6 +32,9 @@ from .llm_response import LlmResponse logger = logging.getLogger("google_adk." + __name__) +if TYPE_CHECKING: + from google.genai import Client + @experimental class GeminiContextCacheManager: diff --git a/src/google/adk/models/gemini_llm_connection.py b/src/google/adk/models/gemini_llm_connection.py index 0f1c9670..1a9dfef9 100644 --- a/src/google/adk/models/gemini_llm_connection.py +++ b/src/google/adk/models/gemini_llm_connection.py @@ -18,7 +18,6 @@ import logging from typing import AsyncGenerator from typing import Union -from google.genai import live from google.genai import types from ..utils.context_utils import Aclosing @@ -28,6 +27,10 @@ from .llm_response import LlmResponse logger = logging.getLogger('google_adk.' + __name__) RealtimeInput = Union[types.Blob, types.ActivityStart, types.ActivityEnd] +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from google.genai import live class GeminiLlmConnection(BaseLlmConnection): diff --git a/src/google/adk/models/google_llm.py b/src/google/adk/models/google_llm.py index a95fb5db..ece2320e 100644 --- a/src/google/adk/models/google_llm.py +++ b/src/google/adk/models/google_llm.py @@ -27,7 +27,6 @@ from typing import Optional from typing import TYPE_CHECKING from typing import Union -from google.genai import Client from google.genai import types from typing_extensions import override @@ -41,6 +40,8 @@ from .gemini_llm_connection import GeminiLlmConnection from .llm_response import LlmResponse if TYPE_CHECKING: + from google.genai import Client + from .llm_request import LlmRequest logger = logging.getLogger('google_adk.' + __name__) @@ -200,6 +201,8 @@ class Gemini(BaseLlm): Returns: The api client. """ + from google.genai import Client + return Client( http_options=types.HttpOptions( headers=self._tracking_headers, @@ -239,6 +242,8 @@ class Gemini(BaseLlm): @cached_property def _live_api_client(self) -> Client: + from google.genai import Client + return Client( http_options=types.HttpOptions( headers=self._tracking_headers, api_version=self._live_api_version diff --git a/tests/unittests/models/test_apigee_llm.py b/tests/unittests/models/test_apigee_llm.py index 73005001..b1710c48 100644 --- a/tests/unittests/models/test_apigee_llm.py +++ b/tests/unittests/models/test_apigee_llm.py @@ -46,7 +46,7 @@ def llm_request(): @pytest.mark.asyncio -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_generate_content_async_non_streaming( mock_client_constructor, llm_request ): @@ -96,7 +96,7 @@ async def test_generate_content_async_non_streaming( @pytest.mark.asyncio -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_generate_content_async_streaming( mock_client_constructor, llm_request ): @@ -167,7 +167,7 @@ async def test_generate_content_async_streaming( @pytest.mark.asyncio -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_generate_content_async_with_custom_headers( mock_client_constructor, llm_request ): @@ -207,7 +207,7 @@ async def test_generate_content_async_with_custom_headers( @pytest.mark.asyncio -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_vertex_model_path_parsing(mock_client_constructor): """Tests that Vertex AI model paths are parsed correctly.""" apigee_llm = ApigeeLlm(model=APIGEE_VERTEX_MODEL_ID, proxy_url=PROXY_URL) @@ -249,7 +249,7 @@ async def test_vertex_model_path_parsing(mock_client_constructor): @pytest.mark.asyncio -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_proxy_url_from_env_variable(mock_client_constructor): """Tests that proxy_url is read from environment variable.""" with mock.patch.dict( @@ -381,7 +381,7 @@ def test_vertex_model_missing_project_or_location_raises_error( ), ], ) -@mock.patch('google.adk.models.apigee_llm.Client') +@mock.patch('google.genai.Client') async def test_model_string_parsing_and_client_initialization( mock_client_constructor, model_string,