Skip to content

chore: Fallback to import package a2a_sdk when a2a is not available #2314

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion contributing/samples/a2a_root/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH

from google.adk.agents.remote_a2a_agent import AGENT_CARD_WELL_KNOWN_PATH
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent

root_agent = RemoteA2aAgent(
Expand Down
47 changes: 37 additions & 10 deletions src/google/adk/a2a/converters/event_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,49 @@
from datetime import datetime
from datetime import timezone
import logging
import sys
from typing import Any
from typing import Dict
from typing import List
from typing import Optional
import uuid

from a2a.server.events import Event as A2AEvent
from a2a.types import DataPart
from a2a.types import Message
from a2a.types import Part as A2APart
from a2a.types import Role
from a2a.types import Task
from a2a.types import TaskState
from a2a.types import TaskStatus
from a2a.types import TaskStatusUpdateEvent
from a2a.types import TextPart
# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
"A2A requires Python 3.10 or above. Please upgrade your Python version. "
f"Current version: {sys.version_info.major}.{sys.version_info.minor}"
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.server.events import Event as A2AEvent
from a2a.types import DataPart
from a2a.types import Message
from a2a.types import Part as A2APart
from a2a.types import Role
from a2a.types import Task
from a2a.types import TaskState
from a2a.types import TaskStatus
from a2a.types import TaskStatusUpdateEvent
from a2a.types import TextPart
except ImportError:
try:
from a2a_sdk.server.events import Event as A2AEvent
from a2a_sdk.types import DataPart
from a2a_sdk.types import Message
from a2a_sdk.types import Part as A2APart
from a2a_sdk.types import Role
from a2a_sdk.types import Task
from a2a_sdk.types import TaskState
from a2a_sdk.types import TaskStatus
from a2a_sdk.types import TaskStatusUpdateEvent
from a2a_sdk.types import TextPart
except ImportError:
raise ImportError(
"Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a"
" dependency."
)
from google.genai import types as genai_types

from ...agents.invocation_context import InvocationContext
Expand Down
25 changes: 16 additions & 9 deletions src/google/adk/a2a/converters/part_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,29 @@
import base64
import json
import logging
import sys
from typing import Optional

from .utils import _get_adk_metadata_key

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version. '
f'Current version: {sys.version_info.major}.{sys.version_info.minor}'
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a import types as a2a_types
except ImportError as e:
import sys

if sys.version_info < (3, 10):
except ImportError:
try:
from a2a_sdk import types as a2a_types
except ImportError:
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
) from e
else:
raise e

'Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a'
' dependency.'
)
from google.genai import types as genai_types

from ...utils.feature_decorator import experimental
Expand Down
22 changes: 15 additions & 7 deletions src/google/adk/a2a/converters/request_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,24 @@
import sys
from typing import Any

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version. '
f'Current version: {sys.version_info.major}.{sys.version_info.minor}'
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.server.agent_execution import RequestContext
except ImportError as e:
if sys.version_info < (3, 10):
except ImportError:
try:
from a2a_sdk.server.agent_execution import RequestContext
except ImportError:
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
) from e
else:
raise e

'Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a'
' dependency.'
)
from google.genai import types as genai_types

from ...runners import RunConfig
Expand Down
35 changes: 26 additions & 9 deletions src/google/adk/a2a/executor/a2a_agent_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,21 @@
from datetime import timezone
import inspect
import logging
import sys
from typing import Any
from typing import Awaitable
from typing import Callable
from typing import Optional
import uuid

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version. '
f'Current version: {sys.version_info.major}.{sys.version_info.minor}'
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.server.agent_execution import AgentExecutor
from a2a.server.agent_execution.context import RequestContext
Expand All @@ -36,16 +45,24 @@
from a2a.types import TaskStatus
from a2a.types import TaskStatusUpdateEvent
from a2a.types import TextPart

except ImportError as e:
import sys

if sys.version_info < (3, 10):
except ImportError:
try:
from a2a_sdk.server.agent_execution import AgentExecutor
from a2a_sdk.server.agent_execution.context import RequestContext
from a2a_sdk.server.events.event_queue import EventQueue
from a2a_sdk.types import Artifact
from a2a_sdk.types import Message
from a2a_sdk.types import Role
from a2a_sdk.types import TaskArtifactUpdateEvent
from a2a_sdk.types import TaskState
from a2a_sdk.types import TaskStatus
from a2a_sdk.types import TaskStatusUpdateEvent
from a2a_sdk.types import TextPart
except ImportError:
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
) from e
else:
raise e
'Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a'
' dependency.'
)
from google.adk.runners import Runner
from pydantic import BaseModel
from typing_extensions import override
Expand Down
30 changes: 26 additions & 4 deletions src/google/adk/a2a/executor/task_result_aggregator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,32 @@

from __future__ import annotations

from a2a.server.events import Event
from a2a.types import Message
from a2a.types import TaskState
from a2a.types import TaskStatusUpdateEvent
import sys

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version. '
f'Current version: {sys.version_info.major}.{sys.version_info.minor}'
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.server.events import Event
from a2a.types import Message
from a2a.types import TaskState
from a2a.types import TaskStatusUpdateEvent
except ImportError:
try:
from a2a_sdk.server.events import Event
from a2a_sdk.types import Message
from a2a_sdk.types import TaskState
from a2a_sdk.types import TaskStatusUpdateEvent
except ImportError:
raise ImportError(
'Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a'
' dependency.'
)

from ...utils.feature_decorator import experimental

Expand Down
26 changes: 19 additions & 7 deletions src/google/adk/a2a/utils/agent_card_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,32 @@
from typing import List
from typing import Optional

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version. '
f'Current version: {sys.version_info.major}.{sys.version_info.minor}'
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.types import AgentCapabilities
from a2a.types import AgentCard
from a2a.types import AgentProvider
from a2a.types import AgentSkill
from a2a.types import SecurityScheme
except ImportError as e:
if sys.version_info < (3, 10):
except ImportError:
try:
from a2a_sdk.types import AgentCapabilities
from a2a_sdk.types import AgentCard
from a2a_sdk.types import AgentProvider
from a2a_sdk.types import AgentSkill
from a2a_sdk.types import SecurityScheme
except ImportError:
raise ImportError(
'A2A requires Python 3.10 or above. Please upgrade your Python version.'
) from e
else:
raise e

'Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a'
' dependency.'
)

from ...agents.base_agent import BaseAgent
from ...agents.llm_agent import LlmAgent
Expand Down
24 changes: 17 additions & 7 deletions src/google/adk/a2a/utils/agent_to_a2a.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,28 @@
import logging
import sys

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
"A2A requires Python 3.10 or above. Please upgrade your Python version. "
f"Current version: {sys.version_info.major}.{sys.version_info.minor}"
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.server.apps import A2AStarletteApplication
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.tasks import InMemoryTaskStore
except ImportError as e:
if sys.version_info < (3, 10):
except ImportError:
try:
from a2a_sdk.server.apps import A2AStarletteApplication
from a2a_sdk.server.request_handlers import DefaultRequestHandler
from a2a_sdk.server.tasks import InMemoryTaskStore
except ImportError:
raise ImportError(
"A2A requires Python 3.10 or above. Please upgrade your Python version."
) from e
else:
raise e

"Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a"
" dependency."
)
from starlette.applications import Starlette

from ...agents.base_agent import BaseAgent
Expand Down
40 changes: 26 additions & 14 deletions src/google/adk/agents/remote_a2a_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,22 @@
import json
import logging
from pathlib import Path
import sys
from typing import Any
from typing import AsyncGenerator
from typing import Optional
from typing import Union
from urllib.parse import urlparse
import uuid

# Check Python version first
if sys.version_info < (3, 10):
raise ImportError(
"A2A requires Python 3.10 or above. Please upgrade your Python version. "
f"Current version: {sys.version_info.major}.{sys.version_info.minor}"
)

# Import a2a packages with fallback to a2a_sdk
try:
from a2a.client import A2AClient
from a2a.client.card_resolver import A2ACardResolver
Expand All @@ -35,22 +44,25 @@
from a2a.types import SendMessageRequest
from a2a.types import SendMessageSuccessResponse
from a2a.types import Task as A2ATask
except ImportError as e:
import sys

if sys.version_info < (3, 10):
raise ImportError(
"A2A requires Python 3.10 or above. Please upgrade your Python version."
) from e
else:
raise e

try:
from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
except ImportError:
# Fallback for older versions of a2a-sdk.
AGENT_CARD_WELL_KNOWN_PATH = "/.well-known/agent.json"

try:
from a2a_sdk.client import A2AClient
from a2a_sdk.client.card_resolver import A2ACardResolver
from a2a_sdk.types import AgentCard
from a2a_sdk.types import Message as A2AMessage
from a2a_sdk.types import MessageSendParams as A2AMessageSendParams
from a2a_sdk.types import Part as A2APart
from a2a_sdk.types import Role
from a2a_sdk.types import SendMessageRequest
from a2a_sdk.types import SendMessageSuccessResponse
from a2a_sdk.types import Task as A2ATask
from a2a_sdk.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
except ImportError:
raise ImportError(
"Could not import a2a or a2a_sdk packages. Please install a2a-sdk as a"
" dependency."
)
from google.genai import types as genai_types
import httpx

Expand Down
Loading
Loading