2424import a2a .types .a2a_pb2_grpc as a2a_grpc
2525
2626from a2a import types
27- from a2a .auth .user import UnauthenticatedUser
27+ from a2a .auth .user import UnauthenticatedUser , User
2828from a2a .extensions .common import (
2929 HTTP_EXTENSION_HEADER ,
3030 get_requested_extensions ,
4141
4242logger = logging .getLogger (__name__ )
4343
44- # For now we use a trivial wrapper on the grpc context object
4544
46-
47- class CallContextBuilder (ABC ):
48- """A class for building ServerCallContexts using the Starlette Request."""
45+ class GrpcServerCallContextBuilder (ABC ):
46+ """Interface for building ServerCallContext from gRPC context."""
4947
5048 @abstractmethod
5149 def build (self , context : grpc .aio .ServicerContext ) -> ServerCallContext :
52- """Builds a ServerCallContext from a gRPC Request."""
50+ """Builds a ServerCallContext from a gRPC ServicerContext."""
51+
52+
53+ class DefaultGrpcServerCallContextBuilder (GrpcServerCallContextBuilder ):
54+ """Default implementation of GrpcServerCallContextBuilder."""
55+
56+ def build (self , context : grpc .aio .ServicerContext ) -> ServerCallContext :
57+ """Builds a ServerCallContext from a gRPC ServicerContext."""
58+ state = {'grpc_context' : context }
59+ return ServerCallContext (
60+ user = self .build_user (context ),
61+ state = state ,
62+ requested_extensions = get_requested_extensions (
63+ _get_metadata_value (context , HTTP_EXTENSION_HEADER )
64+ ),
65+ )
66+
67+ def build_user (self , context : grpc .aio .ServicerContext ) -> User :
68+ """Builds a User from a gRPC ServicerContext."""
69+ return UnauthenticatedUser ()
5370
5471
5572def _get_metadata_value (
@@ -67,22 +84,6 @@ def _get_metadata_value(
6784 ]
6885
6986
70- class DefaultCallContextBuilder (CallContextBuilder ):
71- """A default implementation of CallContextBuilder."""
72-
73- def build (self , context : grpc .aio .ServicerContext ) -> ServerCallContext :
74- """Builds the ServerCallContext."""
75- user = UnauthenticatedUser ()
76- state = {'grpc_context' : context }
77- return ServerCallContext (
78- user = user ,
79- state = state ,
80- requested_extensions = get_requested_extensions (
81- _get_metadata_value (context , HTTP_EXTENSION_HEADER )
82- ),
83- )
84-
85-
8687_ERROR_CODE_MAP = {
8788 types .InvalidRequestError : grpc .StatusCode .INVALID_ARGUMENT ,
8889 types .MethodNotFoundError : grpc .StatusCode .NOT_FOUND ,
@@ -110,7 +111,7 @@ def __init__(
110111 self ,
111112 agent_card : AgentCard ,
112113 request_handler : RequestHandler ,
113- context_builder : CallContextBuilder | None = None ,
114+ context_builder : GrpcServerCallContextBuilder | None = None ,
114115 card_modifier : Callable [[AgentCard ], Awaitable [AgentCard ] | AgentCard ]
115116 | None = None ,
116117 ):
@@ -120,14 +121,17 @@ def __init__(
120121 agent_card: The AgentCard describing the agent's capabilities.
121122 request_handler: The underlying `RequestHandler` instance to
122123 delegate requests to.
123- context_builder: The CallContextBuilder object. If none the
124- DefaultCallContextBuilder is used.
124+ context_builder: The GrpcContextBuilder used to construct the
125+ ServerCallContext passed to the request_handler. If None the
126+ DefaultGrpcContextBuilder is used.
125127 card_modifier: An optional callback to dynamically modify the public
126128 agent card before it is served.
127129 """
128130 self .agent_card = agent_card
129131 self .request_handler = request_handler
130- self .context_builder = context_builder or DefaultCallContextBuilder ()
132+ self ._context_builder = (
133+ context_builder or DefaultGrpcServerCallContextBuilder ()
134+ )
131135 self .card_modifier = card_modifier
132136
133137 async def _handle_unary (
@@ -451,6 +455,6 @@ def _build_call_context(
451455 context : grpc .aio .ServicerContext ,
452456 request : message .Message ,
453457 ) -> ServerCallContext :
454- server_context = self .context_builder .build (context )
458+ server_context = self ._context_builder .build (context )
455459 server_context .tenant = getattr (request , 'tenant' , '' )
456460 return server_context
0 commit comments