We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
1 parent e229576 commit 55b6a4aCopy full SHA for 55b6a4a
5 files changed
pyproject.toml
@@ -11,16 +11,11 @@ dependencies = [
11
"fastapi>=0.115.2",
12
"httpx>=0.28.1",
13
"httpx-sse>=0.4.0",
14
- "google-api-core>=1.26.0",
15
"opentelemetry-api>=1.33.0",
16
"opentelemetry-sdk>=1.33.0",
17
"pydantic>=2.11.3",
18
"sse-starlette",
19
- "starlette",
20
- "grpcio>=1.60",
21
- "grpcio-tools>=1.60",
22
- "grpcio_reflection>=1.7.0",
23
- "protobuf==5.29.5",
+ "starlette"
24
]
25
26
classifiers = [
@@ -42,6 +37,7 @@ mysql = ["sqlalchemy[asyncio,aiomysql]>=2.0.0"]
42
37
sqlite = ["sqlalchemy[asyncio,aiosqlite]>=2.0.0"]
43
38
sql = ["sqlalchemy[asyncio,postgresql-asyncpg,aiomysql,aiosqlite]>=2.0.0"]
44
39
encryption = ["cryptography>=43.0.0"]
40
+grpc = ["grpcio>=1.60", "grpcio-tools>=1.60", "grpcio_reflection>=1.7.0", "protobuf==5.29.5", "google-api-core>=1.26.0"]
45
41
46
[project.urls]
47
homepage = "https://a2a-protocol.org/"
src/a2a/server/request_handlers/__init__.py
@@ -1,9 +1,10 @@
1
"""Request handler components for the A2A server."""
2
3
+import logging
4
+
5
from a2a.server.request_handlers.default_request_handler import (
6
DefaultRequestHandler,
7
)
-from a2a.server.request_handlers.grpc_handler import GrpcHandler
8
from a2a.server.request_handlers.jsonrpc_handler import JSONRPCHandler
9
from a2a.server.request_handlers.request_handler import RequestHandler
10
from a2a.server.request_handlers.response_helpers import (
@@ -12,6 +13,29 @@
+logger = logging.getLogger(__name__)
+try:
+ from a2a.server.request_handlers.grpc_handler import (
+ GrpcHandler, # type: ignore
+ )
+except ImportError as e:
+ _original_error = e
+ logger.debug(
+ 'GrpcHandler not loaded. This is expected if database dependencies are not installed. Error: %s',
+ e,
27
28
29
+ class GrpcHandler: # type: ignore
30
+ """Placeholder for GrpcHandler when dependencies are not installed."""
31
32
+ def __init__(self, *args, **kwargs):
33
+ raise ImportError(
34
+ 'To use GrpcHandler, its dependencies must be installed. '
35
+ 'You can install them with \'pip install "a2a-sdk[grpc]"\''
36
+ ) from _original_error
__all__ = [
'DefaultRequestHandler',
'GrpcHandler',
src/a2a/server/request_handlers/grpc_handler.py
@@ -5,8 +5,16 @@
from abc import ABC, abstractmethod
from collections.abc import AsyncIterable
-import grpc
-import grpc.aio
+ import grpc
+ import grpc.aio
+ 'GrpcHandler requires grpcio and grpcio-tools to be installed. '
+ 'Install with: '
+ "'pip install a2a-sdk[grpc]'"
+ ) from e
import a2a.grpc.a2a_pb2_grpc as a2a_grpc
src/a2a/utils/proto_utils.py
@@ -28,8 +28,8 @@ def message(cls, message: types.Message | None) -> a2a_pb2.Message | None:
return a2a_pb2.Message(
message_id=message.messageId,
content=[ToProto.part(p) for p in message.parts],
- context_id=message.contextId,
- task_id=message.taskId,
+ context_id=message.contextId or '',
+ task_id=message.taskId or '',
role=cls.role(message.role),
metadata=ToProto.metadata(message.metadata),
@@ -438,8 +438,8 @@ def message(cls, message: a2a_pb2.Message) -> types.Message:
438
return types.Message(
439
messageId=message.message_id,
440
parts=[FromProto.part(p) for p in message.content],
441
- contextId=message.context_id,
442
- taskId=message.task_id,
+ contextId=message.context_id or None,
+ taskId=message.task_id or None,
443
role=FromProto.role(message.role),
444
metadata=FromProto.metadata(message.metadata),
445
uv.lock
0 commit comments