Skip to content

Commit 06a9b95

Browse files
GWealeShaharKatz
authored andcommitted
chore: Drop Python 3.9 support, set minimum to Python 3.10
Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 839799108
1 parent c65cb7e commit 06a9b95

40 files changed

+279
-804
lines changed

.github/workflows/python-unit-tests.yml

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
runs-on: ubuntu-latest
2626
strategy:
2727
matrix:
28-
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
28+
python-version: ["3.10", "3.11", "3.12", "3.13"]
2929

3030
steps:
3131
- name: Checkout code
@@ -48,14 +48,6 @@ jobs:
4848
- name: Run unit tests with pytest
4949
run: |
5050
source .venv/bin/activate
51-
if [[ "${{ matrix.python-version }}" == "3.9" ]]; then
52-
pytest tests/unittests \
53-
--ignore=tests/unittests/a2a \
54-
--ignore=tests/unittests/tools/mcp_tool \
55-
--ignore=tests/unittests/artifacts/test_artifact_service.py \
56-
--ignore=tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py
57-
else
58-
pytest tests/unittests \
59-
--ignore=tests/unittests/artifacts/test_artifact_service.py \
60-
--ignore=tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py
61-
fi
51+
pytest tests/unittests \
52+
--ignore=tests/unittests/artifacts/test_artifact_service.py \
53+
--ignore=tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py

contributing/samples/migrate_session_db/sample-output/alembic.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ prepend_sys_path = .
2121

2222
# timezone to use when rendering the date within the migration file
2323
# as well as the filename.
24-
# If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library.
24+
# If specified, requires the python>=3.10 and tzdata library.
2525
# Any required deps can installed by adding `alembic[tz]` to the pip requirements
2626
# string value is passed to ZoneInfo()
2727
# leave blank for localtime

contributing/samples/telemetry/main.py

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
import asyncio
16+
from contextlib import aclosing
1617
import os
1718
import time
1819

@@ -46,19 +47,16 @@ async def run_prompt(session: Session, new_message: str):
4647
role='user', parts=[types.Part.from_text(text=new_message)]
4748
)
4849
print('** User says:', content.model_dump(exclude_none=True))
49-
# TODO - migrate try...finally to contextlib.aclosing after Python 3.9 is
50-
# no longer supported.
51-
agen = runner.run_async(
52-
user_id=user_id_1,
53-
session_id=session.id,
54-
new_message=content,
55-
)
56-
try:
50+
async with aclosing(
51+
runner.run_async(
52+
user_id=user_id_1,
53+
session_id=session.id,
54+
new_message=content,
55+
)
56+
) as agen:
5757
async for event in agen:
5858
if event.content.parts and event.content.parts[0].text:
5959
print(f'** {event.author}: {event.content.parts[0].text}')
60-
finally:
61-
await agen.aclose()
6260

6361
async def run_prompt_bytes(session: Session, new_message: str):
6462
content = types.Content(
@@ -70,20 +68,17 @@ async def run_prompt_bytes(session: Session, new_message: str):
7068
],
7169
)
7270
print('** User says:', content.model_dump(exclude_none=True))
73-
# TODO - migrate try...finally to contextlib.aclosing after Python 3.9 is
74-
# no longer supported.
75-
agen = runner.run_async(
76-
user_id=user_id_1,
77-
session_id=session.id,
78-
new_message=content,
79-
run_config=RunConfig(save_input_blobs_as_artifacts=True),
80-
)
81-
try:
71+
async with aclosing(
72+
runner.run_async(
73+
user_id=user_id_1,
74+
session_id=session.id,
75+
new_message=content,
76+
run_config=RunConfig(save_input_blobs_as_artifacts=True),
77+
)
78+
) as agen:
8279
async for event in agen:
8380
if event.content.parts and event.content.parts[0].text:
8481
print(f'** {event.author}: {event.content.parts[0].text}')
85-
finally:
86-
await agen.aclose()
8782

8883
start_time = time.time()
8984
print('Start time:', start_time)

llms-full.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5620,7 +5620,7 @@ pip install google-cloud-aiplatform[adk,agent_engines]
56205620
```
56215621

56225622
!!!info
5623-
Agent Engine only supported Python version >=3.9 and <=3.12.
5623+
Agent Engine only supported Python version >=3.10 and <=3.12.
56245624

56255625
### Initialization
56265626

@@ -8073,7 +8073,7 @@ setting up a basic agent with multiple tools, and running it locally either in t
80738073
<!-- <img src="../../assets/quickstart.png" alt="Quickstart setup"> -->
80748074

80758075
This quickstart assumes a local IDE (VS Code, PyCharm, IntelliJ IDEA, etc.)
8076-
with Python 3.9+ or Java 17+ and terminal access. This method runs the
8076+
with Python 3.10+ or Java 17+ and terminal access. This method runs the
80778077
application entirely on your machine and is recommended for internal development.
80788078

80798079
## 1. Set up Environment & Install ADK {#venv-install}
@@ -16475,7 +16475,7 @@ This guide covers two primary integration patterns:
1647516475
Before you begin, ensure you have the following set up:
1647616476

1647716477
* **Set up ADK:** Follow the standard ADK [setup instructions](../get-started/quickstart.md/#venv-install) in the quickstart.
16478-
* **Install/update Python/Java:** MCP requires Python version of 3.9 or higher for Python or Java 17+.
16478+
* **Install/update Python/Java:** MCP requires Python version of 3.10 or higher for Python or Java 17+.
1647916479
* **Setup Node.js and npx:** **(Python only)** Many community MCP servers are distributed as Node.js packages and run using `npx`. Install Node.js (which includes npx) if you haven't already. For details, see [https://nodejs.org/en](https://nodejs.org/en).
1648016480
* **Verify Installations:** **(Python only)** Confirm `adk` and `npx` are in your PATH within the activated virtual environment:
1648116481

src/google/adk/a2a/converters/part_converter.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,11 @@
2626
from typing import Optional
2727
from typing import Union
2828

29-
from .utils import _get_adk_metadata_key
30-
31-
try:
32-
from a2a import types as a2a_types
33-
except ImportError as e:
34-
import sys
35-
36-
if sys.version_info < (3, 10):
37-
raise ImportError(
38-
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
39-
) from e
40-
else:
41-
raise e
42-
29+
from a2a import types as a2a_types
4330
from google.genai import types as genai_types
4431

4532
from ..experimental import a2a_experimental
33+
from .utils import _get_adk_metadata_key
4634

4735
logger = logging.getLogger('google_adk.' + __name__)
4836

src/google/adk/a2a/converters/request_converter.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,12 @@
1515
from __future__ import annotations
1616

1717
from collections.abc import Callable
18-
import sys
1918
from typing import Any
2019
from typing import Optional
2120

22-
from pydantic import BaseModel
23-
24-
try:
25-
from a2a.server.agent_execution import RequestContext
26-
except ImportError as e:
27-
if sys.version_info < (3, 10):
28-
raise ImportError(
29-
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
30-
) from e
31-
else:
32-
raise e
33-
21+
from a2a.server.agent_execution import RequestContext
3422
from google.genai import types as genai_types
23+
from pydantic import BaseModel
3524

3625
from ...runners import RunConfig
3726
from ..experimental import a2a_experimental

src/google/adk/a2a/executor/a2a_agent_executor.py

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,22 @@
2323
from typing import Optional
2424
import uuid
2525

26-
from ...utils.context_utils import Aclosing
27-
28-
try:
29-
from a2a.server.agent_execution import AgentExecutor
30-
from a2a.server.agent_execution.context import RequestContext
31-
from a2a.server.events.event_queue import EventQueue
32-
from a2a.types import Artifact
33-
from a2a.types import Message
34-
from a2a.types import Role
35-
from a2a.types import TaskArtifactUpdateEvent
36-
from a2a.types import TaskState
37-
from a2a.types import TaskStatus
38-
from a2a.types import TaskStatusUpdateEvent
39-
from a2a.types import TextPart
40-
41-
except ImportError as e:
42-
import sys
43-
44-
if sys.version_info < (3, 10):
45-
raise ImportError(
46-
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
47-
) from e
48-
else:
49-
raise e
26+
from a2a.server.agent_execution import AgentExecutor
27+
from a2a.server.agent_execution.context import RequestContext
28+
from a2a.server.events.event_queue import EventQueue
29+
from a2a.types import Artifact
30+
from a2a.types import Message
31+
from a2a.types import Role
32+
from a2a.types import TaskArtifactUpdateEvent
33+
from a2a.types import TaskState
34+
from a2a.types import TaskStatus
35+
from a2a.types import TaskStatusUpdateEvent
36+
from a2a.types import TextPart
5037
from google.adk.runners import Runner
5138
from pydantic import BaseModel
5239
from typing_extensions import override
5340

41+
from ...utils.context_utils import Aclosing
5442
from ..converters.event_converter import AdkEventToA2AEventsConverter
5543
from ..converters.event_converter import convert_event_to_a2a_events
5644
from ..converters.part_converter import A2APartToGenAIPartConverter

src/google/adk/a2a/utils/agent_card_builder.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,15 @@
1515
from __future__ import annotations
1616

1717
import re
18-
import sys
1918
from typing import Dict
2019
from typing import List
2120
from typing import Optional
2221

23-
try:
24-
from a2a.types import AgentCapabilities
25-
from a2a.types import AgentCard
26-
from a2a.types import AgentProvider
27-
from a2a.types import AgentSkill
28-
from a2a.types import SecurityScheme
29-
except ImportError as e:
30-
if sys.version_info < (3, 10):
31-
raise ImportError(
32-
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
33-
) from e
34-
else:
35-
raise e
36-
22+
from a2a.types import AgentCapabilities
23+
from a2a.types import AgentCard
24+
from a2a.types import AgentProvider
25+
from a2a.types import AgentSkill
26+
from a2a.types import SecurityScheme
3727

3828
from ...agents.base_agent import BaseAgent
3929
from ...agents.llm_agent import LlmAgent

src/google/adk/a2a/utils/agent_to_a2a.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,18 @@
1515
from __future__ import annotations
1616

1717
import logging
18-
import sys
19-
20-
try:
21-
from a2a.server.apps import A2AStarletteApplication
22-
from a2a.server.request_handlers import DefaultRequestHandler
23-
from a2a.server.tasks import InMemoryTaskStore
24-
from a2a.types import AgentCard
25-
except ImportError as e:
26-
if sys.version_info < (3, 10):
27-
raise ImportError(
28-
"A2A requires Python 3.10 or above. Please upgrade your Python version."
29-
) from e
30-
else:
31-
raise e
32-
3318
from typing import Optional
3419
from typing import Union
3520

21+
from a2a.server.apps import A2AStarletteApplication
22+
from a2a.server.request_handlers import DefaultRequestHandler
23+
from a2a.server.tasks import InMemoryTaskStore
24+
from a2a.types import AgentCard
3625
from starlette.applications import Starlette
3726

3827
from ...agents.base_agent import BaseAgent
3928
from ...artifacts.in_memory_artifact_service import InMemoryArtifactService
4029
from ...auth.credential_service.in_memory_credential_service import InMemoryCredentialService
41-
from ...cli.utils.logs import setup_adk_logger
4230
from ...memory.in_memory_memory_service import InMemoryMemoryService
4331
from ...runners import Runner
4432
from ...sessions.in_memory_session_service import InMemorySessionService
@@ -117,7 +105,8 @@ def to_a2a(
117105
app = to_a2a(agent, agent_card=my_custom_agent_card)
118106
"""
119107
# Set up ADK logging to ensure logs are visible when using uvicorn directly
120-
setup_adk_logger(logging.INFO)
108+
adk_logger = logging.getLogger("google_adk")
109+
adk_logger.setLevel(logging.INFO)
121110

122111
async def create_runner() -> Runner:
123112
"""Create a runner for the agent."""

src/google/adk/agents/__init__.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import logging
16-
import sys
17-
1815
from .base_agent import BaseAgent
1916
from .invocation_context import InvocationContext
2017
from .live_request_queue import LiveRequest
2118
from .live_request_queue import LiveRequestQueue
2219
from .llm_agent import Agent
2320
from .llm_agent import LlmAgent
2421
from .loop_agent import LoopAgent
22+
from .mcp_instruction_provider import McpInstructionProvider
2523
from .parallel_agent import ParallelAgent
2624
from .run_config import RunConfig
2725
from .sequential_agent import SequentialAgent
@@ -31,23 +29,11 @@
3129
'BaseAgent',
3230
'LlmAgent',
3331
'LoopAgent',
32+
'McpInstructionProvider',
3433
'ParallelAgent',
3534
'SequentialAgent',
3635
'InvocationContext',
3736
'LiveRequest',
3837
'LiveRequestQueue',
3938
'RunConfig',
4039
]
41-
42-
if sys.version_info < (3, 10):
43-
logger = logging.getLogger('google_adk.' + __name__)
44-
logger.warning(
45-
'MCP requires Python 3.10 or above. Please upgrade your Python'
46-
' version in order to use it.'
47-
)
48-
else:
49-
from .mcp_instruction_provider import McpInstructionProvider
50-
51-
__all__.extend([
52-
'McpInstructionProvider',
53-
])

0 commit comments

Comments
 (0)