From 3efd1df3fa6f3f8d0a3b184e12ca8ef7d6f1fd28 Mon Sep 17 00:00:00 2001 From: sokoliva Date: Thu, 26 Mar 2026 16:11:05 +0000 Subject: [PATCH 1/5] docs: fix docstrings related to `CallContextBuilder` args in constructors --- src/a2a/server/routes/jsonrpc_dispatcher.py | 4 ++-- src/a2a/server/routes/jsonrpc_routes.py | 7 ++++--- src/a2a/server/routes/rest_routes.py | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/a2a/server/routes/jsonrpc_dispatcher.py b/src/a2a/server/routes/jsonrpc_dispatcher.py index 1ce5f0fe8..7524b5216 100644 --- a/src/a2a/server/routes/jsonrpc_dispatcher.py +++ b/src/a2a/server/routes/jsonrpc_dispatcher.py @@ -209,8 +209,8 @@ def __init__( # noqa: PLR0913 extended_agent_card: An optional, distinct AgentCard to be served at the authenticated extended card endpoint. context_builder: The CallContextBuilder used to construct the - ServerCallContext passed to the http_handler. If None, no - ServerCallContext is passed. + ServerCallContext passed to the http_handler. If None the + DefaultCallContextBuilder is used. card_modifier: An optional callback to dynamically modify the public agent card before it is served. extended_card_modifier: An optional callback to dynamically modify diff --git a/src/a2a/server/routes/jsonrpc_routes.py b/src/a2a/server/routes/jsonrpc_routes.py index 9138ed8ea..357a2be3c 100644 --- a/src/a2a/server/routes/jsonrpc_routes.py +++ b/src/a2a/server/routes/jsonrpc_routes.py @@ -21,6 +21,7 @@ from a2a.server.request_handlers.request_handler import RequestHandler from a2a.server.routes.jsonrpc_dispatcher import ( CallContextBuilder, + DefaultCallContextBuilder, JsonRpcDispatcher, ) from a2a.types.a2a_pb2 import AgentCard @@ -54,8 +55,8 @@ def create_jsonrpc_routes( # noqa: PLR0913 extended_agent_card: An optional, distinct AgentCard to be served at the authenticated extended card endpoint. context_builder: The CallContextBuilder used to construct the - ServerCallContext passed to the request_handler. If None, no - ServerCallContext is passed. + ServerCallContext passed to the request_handler. If None the + DefaultCallContextBuilder is used. card_modifier: An optional callback to dynamically modify the public agent card before it is served. extended_card_modifier: An optional callback to dynamically modify @@ -74,7 +75,7 @@ def create_jsonrpc_routes( # noqa: PLR0913 agent_card=agent_card, http_handler=request_handler, extended_agent_card=extended_agent_card, - context_builder=context_builder, + context_builder=context_builder or DefaultCallContextBuilder(), card_modifier=card_modifier, extended_card_modifier=extended_card_modifier, enable_v0_3_compat=enable_v0_3_compat, diff --git a/src/a2a/server/routes/rest_routes.py b/src/a2a/server/routes/rest_routes.py index 1923f038a..4a5ed763a 100644 --- a/src/a2a/server/routes/rest_routes.py +++ b/src/a2a/server/routes/rest_routes.py @@ -76,8 +76,8 @@ def create_rest_routes( # noqa: PLR0913 extended_agent_card: An optional, distinct AgentCard to be served at the authenticated extended card endpoint. context_builder: The CallContextBuilder used to construct the - ServerCallContext passed to the request_handler. If None, no - ServerCallContext is passed. + ServerCallContext passed to the request_handler. If None the + DefaultCallContextBuilder is used. card_modifier: An optional callback to dynamically modify the public agent card before it is served. extended_card_modifier: An optional callback to dynamically modify @@ -100,7 +100,7 @@ def create_rest_routes( # noqa: PLR0913 agent_card=agent_card, http_handler=request_handler, extended_agent_card=extended_agent_card, - context_builder=context_builder, + context_builder=context_builder or DefaultCallContextBuilder(), card_modifier=card_modifier, extended_card_modifier=extended_card_modifier, ) From ab6426b1ce74027af84b831469478ae6ad4a1a4a Mon Sep 17 00:00:00 2001 From: sokoliva Date: Thu, 26 Mar 2026 16:47:25 +0000 Subject: [PATCH 2/5] Make ServerCallContext mandatory in compat rest dapter --- src/a2a/compat/v0_3/rest_adapter.py | 4 ++-- src/a2a/server/routes/jsonrpc_routes.py | 3 +-- src/a2a/server/routes/rest_routes.py | 8 +++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/a2a/compat/v0_3/rest_adapter.py b/src/a2a/compat/v0_3/rest_adapter.py index 3d1e9cb77..83edc4eba 100644 --- a/src/a2a/compat/v0_3/rest_adapter.py +++ b/src/a2a/compat/v0_3/rest_adapter.py @@ -109,7 +109,7 @@ async def event_generator( ) async def handle_get_agent_card( - self, request: Request, call_context: ServerCallContext | None = None + self, request: Request, call_context: ServerCallContext ) -> dict[str, Any]: """Handles GET requests for the agent card endpoint.""" card_to_serve = self.agent_card @@ -119,7 +119,7 @@ async def handle_get_agent_card( return v03_card.model_dump(mode='json', exclude_none=True) async def handle_authenticated_agent_card( - self, request: Request, call_context: ServerCallContext | None = None + self, request: Request, call_context: ServerCallContext ) -> dict[str, Any]: """Hook for per credential agent card response.""" if not self.agent_card.capabilities.extended_agent_card: diff --git a/src/a2a/server/routes/jsonrpc_routes.py b/src/a2a/server/routes/jsonrpc_routes.py index b80534ffd..a71a02b2d 100644 --- a/src/a2a/server/routes/jsonrpc_routes.py +++ b/src/a2a/server/routes/jsonrpc_routes.py @@ -21,7 +21,6 @@ from a2a.server.request_handlers.request_handler import RequestHandler from a2a.server.routes.jsonrpc_dispatcher import ( CallContextBuilder, - DefaultCallContextBuilder, JsonRpcDispatcher, ) from a2a.types.a2a_pb2 import AgentCard @@ -75,7 +74,7 @@ def create_jsonrpc_routes( # noqa: PLR0913 agent_card=agent_card, request_handler=request_handler, extended_agent_card=extended_agent_card, - context_builder=context_builder or DefaultCallContextBuilder(), + context_builder=context_builder, card_modifier=card_modifier, extended_card_modifier=extended_card_modifier, enable_v0_3_compat=enable_v0_3_compat, diff --git a/src/a2a/server/routes/rest_routes.py b/src/a2a/server/routes/rest_routes.py index 4a5ed763a..1792fe8e7 100644 --- a/src/a2a/server/routes/rest_routes.py +++ b/src/a2a/server/routes/rest_routes.py @@ -100,7 +100,7 @@ def create_rest_routes( # noqa: PLR0913 agent_card=agent_card, http_handler=request_handler, extended_agent_card=extended_agent_card, - context_builder=context_builder or DefaultCallContextBuilder(), + context_builder=context_builder, card_modifier=card_modifier, extended_card_modifier=extended_card_modifier, ) @@ -176,7 +176,7 @@ async def event_generator() -> AsyncIterator[str]: return EventSourceResponse(event_generator()) async def _handle_authenticated_agent_card( - request: 'Request', call_context: ServerCallContext | None = None + request: 'Request', call_context: ServerCallContext ) -> dict[str, Any]: if not agent_card.capabilities.extended_agent_card: raise ExtendedAgentCardNotConfiguredError( @@ -185,10 +185,8 @@ async def _handle_authenticated_agent_card( card_to_serve = extended_agent_card or agent_card if extended_card_modifier: - # Re-generate context if none passed to replicate RESTAdapter exact logic - context = call_context or _build_call_context(request) card_to_serve = await maybe_await( - extended_card_modifier(card_to_serve, context) + extended_card_modifier(card_to_serve, call_context) ) elif card_modifier: card_to_serve = await maybe_await(card_modifier(card_to_serve)) From 4876d86bc77af2e15416bb4f96b16fd35c176f57 Mon Sep 17 00:00:00 2001 From: sokoliva Date: Thu, 26 Mar 2026 16:58:20 +0000 Subject: [PATCH 3/5] revert change --- src/a2a/server/routes/rest_routes.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/a2a/server/routes/rest_routes.py b/src/a2a/server/routes/rest_routes.py index 1792fe8e7..33401474b 100644 --- a/src/a2a/server/routes/rest_routes.py +++ b/src/a2a/server/routes/rest_routes.py @@ -176,7 +176,7 @@ async def event_generator() -> AsyncIterator[str]: return EventSourceResponse(event_generator()) async def _handle_authenticated_agent_card( - request: 'Request', call_context: ServerCallContext + request: 'Request', call_context: ServerCallContext | None = None ) -> dict[str, Any]: if not agent_card.capabilities.extended_agent_card: raise ExtendedAgentCardNotConfiguredError( @@ -185,8 +185,10 @@ async def _handle_authenticated_agent_card( card_to_serve = extended_agent_card or agent_card if extended_card_modifier: + # Re-generate context if none passed to replicate RESTAdapter exact logic + context = call_context or _build_call_context(request) card_to_serve = await maybe_await( - extended_card_modifier(card_to_serve, call_context) + extended_card_modifier(card_to_serve, context) ) elif card_modifier: card_to_serve = await maybe_await(card_modifier(card_to_serve)) From 8ae89be783348b392710b6bfc068cbfd515c2210 Mon Sep 17 00:00:00 2001 From: sokoliva Date: Thu, 26 Mar 2026 17:03:43 +0000 Subject: [PATCH 4/5] fix --- src/a2a/server/routes/rest_routes.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/a2a/server/routes/rest_routes.py b/src/a2a/server/routes/rest_routes.py index 33401474b..3ce37922b 100644 --- a/src/a2a/server/routes/rest_routes.py +++ b/src/a2a/server/routes/rest_routes.py @@ -176,7 +176,7 @@ async def event_generator() -> AsyncIterator[str]: return EventSourceResponse(event_generator()) async def _handle_authenticated_agent_card( - request: 'Request', call_context: ServerCallContext | None = None + request: 'Request', call_context: ServerCallContext ) -> dict[str, Any]: if not agent_card.capabilities.extended_agent_card: raise ExtendedAgentCardNotConfiguredError( @@ -186,9 +186,8 @@ async def _handle_authenticated_agent_card( if extended_card_modifier: # Re-generate context if none passed to replicate RESTAdapter exact logic - context = call_context or _build_call_context(request) card_to_serve = await maybe_await( - extended_card_modifier(card_to_serve, context) + extended_card_modifier(card_to_serve, call_context) ) elif card_modifier: card_to_serve = await maybe_await(card_modifier(card_to_serve)) From 4797b28448045e39583eb2d123af6ab2064a023c Mon Sep 17 00:00:00 2001 From: sokoliva Date: Fri, 27 Mar 2026 08:57:07 +0000 Subject: [PATCH 5/5] fix --- src/a2a/compat/v0_3/rest_adapter.py | 3 +-- src/a2a/server/routes/rest_routes.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/a2a/compat/v0_3/rest_adapter.py b/src/a2a/compat/v0_3/rest_adapter.py index 83edc4eba..76b1ce4d1 100644 --- a/src/a2a/compat/v0_3/rest_adapter.py +++ b/src/a2a/compat/v0_3/rest_adapter.py @@ -132,9 +132,8 @@ async def handle_authenticated_agent_card( card_to_serve = self.agent_card if self.extended_card_modifier: - context = self._context_builder.build(request) card_to_serve = await maybe_await( - self.extended_card_modifier(card_to_serve, context) + self.extended_card_modifier(card_to_serve, call_context) ) elif self.card_modifier: card_to_serve = await maybe_await(self.card_modifier(card_to_serve)) diff --git a/src/a2a/server/routes/rest_routes.py b/src/a2a/server/routes/rest_routes.py index 3ce37922b..1792fe8e7 100644 --- a/src/a2a/server/routes/rest_routes.py +++ b/src/a2a/server/routes/rest_routes.py @@ -185,7 +185,6 @@ async def _handle_authenticated_agent_card( card_to_serve = extended_agent_card or agent_card if extended_card_modifier: - # Re-generate context if none passed to replicate RESTAdapter exact logic card_to_serve = await maybe_await( extended_card_modifier(card_to_serve, call_context) )