Skip to content

Commit 2542cd6

Browse files
committed
fix merge errors
1 parent 9b4922f commit 2542cd6

4 files changed

Lines changed: 138 additions & 23 deletions

File tree

src/a2a/server/request_handlers/default_request_handler_v2.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818
from a2a.server.agent_execution.active_task_registry import ActiveTaskRegistry
1919
from a2a.server.request_handlers.request_handler import (
2020
RequestHandler,
21+
validate,
2122
validate_request_params,
2223
)
2324
from a2a.types.a2a_pb2 import (
25+
AgentCard,
2426
CancelTaskRequest,
2527
DeleteTaskPushNotificationConfigRequest,
28+
GetExtendedAgentCardRequest,
2629
GetTaskPushNotificationConfigRequest,
2730
GetTaskRequest,
2831
ListTaskPushNotificationConfigsRequest,
@@ -37,12 +40,14 @@
3740
TaskStatusUpdateEvent,
3841
)
3942
from a2a.utils.errors import (
43+
ExtendedAgentCardNotConfiguredError,
4044
InternalError,
4145
InvalidParamsError,
4246
TaskNotCancelableError,
4347
TaskNotFoundError,
4448
UnsupportedOperationError,
4549
)
50+
from a2a.utils.helpers import maybe_await
4651
from a2a.utils.task import (
4752
apply_history_length,
4853
validate_history_length,
@@ -52,7 +57,7 @@
5257

5358

5459
if TYPE_CHECKING:
55-
from collections.abc import AsyncGenerator
60+
from collections.abc import AsyncGenerator, Awaitable, Callable
5661

5762
from a2a.server.agent_execution.active_task import ActiveTask
5863
from a2a.server.context import ServerCallContext
@@ -80,16 +85,25 @@ def __init__( # noqa: PLR0913
8085
self,
8186
agent_executor: AgentExecutor,
8287
task_store: TaskStore,
88+
agent_card: AgentCard,
8389
queue_manager: Any
8490
| None = None, # Kept for backward compat in signature
8591
push_config_store: PushNotificationConfigStore | None = None,
8692
push_sender: PushNotificationSender | None = None,
8793
request_context_builder: RequestContextBuilder | None = None,
94+
extended_agent_card: AgentCard | None = None,
95+
extended_card_modifier: Callable[
96+
[AgentCard, ServerCallContext], Awaitable[AgentCard] | AgentCard
97+
]
98+
| None = None,
8899
) -> None:
89100
self.agent_executor = agent_executor
90101
self.task_store = task_store
102+
self._agent_card = agent_card
91103
self._push_config_store = push_config_store
92104
self._push_sender = push_sender
105+
self.extended_agent_card = extended_agent_card
106+
self.extended_card_modifier = extended_card_modifier
93107
self._request_context_builder = (
94108
request_context_builder
95109
or SimpleRequestContextBuilder(
@@ -411,3 +425,28 @@ async def on_delete_task_push_notification_config( # noqa: D102
411425
raise TaskNotFoundError
412426

413427
await self._push_config_store.delete_info(task_id, context, config_id)
428+
429+
@validate_request_params
430+
@validate(
431+
lambda self: self._agent_card.capabilities.extended_agent_card,
432+
error_message='The agent does not support authenticated extended cards',
433+
)
434+
async def on_get_extended_agent_card(
435+
self,
436+
params: GetExtendedAgentCardRequest,
437+
context: ServerCallContext,
438+
) -> AgentCard:
439+
"""Default handler for 'GetExtendedAgentCard'.
440+
441+
Requires `capabilities.extended_agent_card` to be true.
442+
"""
443+
extended_card = self.extended_agent_card
444+
if not extended_card:
445+
raise ExtendedAgentCardNotConfiguredError
446+
447+
if self.extended_card_modifier:
448+
return await maybe_await(
449+
self.extended_card_modifier(extended_card, context)
450+
)
451+
452+
return extended_card

tests/integration/test_client_server_integration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
create_rest_routes,
3636
)
3737
from a2a.server.request_handlers.default_request_handler import (
38-
DefaultRequestHandler,
38+
LegacyRequestHandler,
3939
)
4040
from a2a.types import a2a_pb2_grpc
4141
from a2a.types.a2a_pb2 import (
@@ -1130,7 +1130,7 @@ async def test_validate_decorator_push_notifications_disabled(
11301130
"""Integration test for @validate decorator with push notifications disabled."""
11311131
client = error_handling_setups.client
11321132

1133-
real_handler = DefaultRequestHandler(
1133+
real_handler = LegacyRequestHandler(
11341134
agent_executor=AsyncMock(),
11351135
task_store=AsyncMock(),
11361136
agent_card=agent_card,
@@ -1160,7 +1160,7 @@ async def test_validate_streaming_disabled(
11601160

11611161
agent_card.capabilities.streaming = False
11621162

1163-
real_handler = DefaultRequestHandler(
1163+
real_handler = LegacyRequestHandler(
11641164
agent_executor=AsyncMock(),
11651165
task_store=AsyncMock(),
11661166
agent_card=agent_card,

tests/integration/test_scenarios.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ async def create_client(handler, agent_card, streaming=False):
141141
agent_card.supported_interfaces[0].protocol_binding = TransportProtocol.GRPC
142142

143143
servicer = GrpcHandler(
144-
agent_card, handler, context_builder=MockCallContextBuilder()
144+
request_handler=handler, context_builder=MockCallContextBuilder()
145145
)
146146
a2a_pb2_grpc.add_A2AServiceServicer_to_server(servicer, server)
147147
await server.start()
@@ -165,9 +165,19 @@ def create_handler(
165165
task_store = task_store or InMemoryTaskStore()
166166
queue_manager = queue_manager or InMemoryQueueManager()
167167
return (
168-
LegacyRequestHandler(agent_executor, task_store, queue_manager)
168+
LegacyRequestHandler(
169+
agent_executor,
170+
task_store,
171+
agent_card(),
172+
queue_manager,
173+
)
169174
if use_legacy
170-
else DefaultRequestHandlerV2(agent_executor, task_store, queue_manager)
175+
else DefaultRequestHandlerV2(
176+
agent_executor,
177+
task_store,
178+
agent_card(),
179+
queue_manager,
180+
)
171181
)
172182

173183

0 commit comments

Comments
 (0)