From f4c0670ab1a9fbb6335e6ea837c87a8ab14abcfd Mon Sep 17 00:00:00 2001 From: sokoliva Date: Wed, 4 Mar 2026 15:49:06 +0000 Subject: [PATCH 1/5] feat: add GetExtendedAgentCardRequest as input parameter to GetExtendedAgentCard method --- src/a2a/client/base_client.py | 3 + src/a2a/client/client.py | 2 + src/a2a/client/transports/base.py | 2 + src/a2a/client/transports/grpc.py | 4 +- src/a2a/client/transports/jsonrpc.py | 2 +- src/a2a/client/transports/rest.py | 6 +- .../client/transports/test_jsonrpc_client.py | 4 +- tests/client/transports/test_rest_client.py | 4 +- .../transports/test_tenant_decorator.py | 140 ++++++++++++++++++ .../test_client_server_integration.py | 9 +- 10 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 tests/client/transports/test_tenant_decorator.py diff --git a/src/a2a/client/base_client.py b/src/a2a/client/base_client.py index 947e7f1c..6bb16427 100644 --- a/src/a2a/client/base_client.py +++ b/src/a2a/client/base_client.py @@ -16,6 +16,7 @@ CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -311,6 +312,7 @@ async def subscribe( async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, @@ -330,6 +332,7 @@ async def get_extended_agent_card( The `AgentCard` for the agent. """ card = await self._transport.get_extended_agent_card( + request, context=context, extensions=extensions, signature_verifier=signature_verifier, diff --git a/src/a2a/client/client.py b/src/a2a/client/client.py index 134a9f76..793b78f8 100644 --- a/src/a2a/client/client.py +++ b/src/a2a/client/client.py @@ -17,6 +17,7 @@ CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -231,6 +232,7 @@ async def subscribe( @abstractmethod async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, diff --git a/src/a2a/client/transports/base.py b/src/a2a/client/transports/base.py index 2d2c2987..4e8e41ee 100644 --- a/src/a2a/client/transports/base.py +++ b/src/a2a/client/transports/base.py @@ -10,6 +10,7 @@ CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -148,6 +149,7 @@ async def subscribe( @abstractmethod async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, diff --git a/src/a2a/client/transports/grpc.py b/src/a2a/client/transports/grpc.py index 0357599d..71c8bdaa 100644 --- a/src/a2a/client/transports/grpc.py +++ b/src/a2a/client/transports/grpc.py @@ -29,6 +29,7 @@ CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -276,6 +277,7 @@ async def delete_task_push_notification_config( @_handle_grpc_exception async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, @@ -283,7 +285,7 @@ async def get_extended_agent_card( ) -> AgentCard: """Retrieves the agent's card.""" card = await self.stub.GetExtendedAgentCard( - a2a_pb2.GetExtendedAgentCardRequest(), + request, metadata=self._get_grpc_metadata(extensions), ) diff --git a/src/a2a/client/transports/jsonrpc.py b/src/a2a/client/transports/jsonrpc.py index 7fcc1af4..0fd88c80 100644 --- a/src/a2a/client/transports/jsonrpc.py +++ b/src/a2a/client/transports/jsonrpc.py @@ -378,6 +378,7 @@ async def subscribe( async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, @@ -394,7 +395,6 @@ async def get_extended_agent_card( if not card.capabilities.extended_agent_card: return card - request = GetExtendedAgentCardRequest() rpc_request = JSONRPC20Request( method='GetExtendedAgentCard', params=json_format.MessageToDict(request), diff --git a/src/a2a/client/transports/rest.py b/src/a2a/client/transports/rest.py index 975ee285..8e4c5800 100644 --- a/src/a2a/client/transports/rest.py +++ b/src/a2a/client/transports/rest.py @@ -22,6 +22,7 @@ CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -324,6 +325,7 @@ async def subscribe( async def get_extended_agent_card( self, + request: GetExtendedAgentCardRequest, *, context: ClientCallContext | None = None, extensions: list[str] | None = None, @@ -340,12 +342,12 @@ async def get_extended_agent_card( if not card.capabilities.extended_agent_card: return card _, modified_kwargs = await self._apply_interceptors( - {}, + MessageToDict(request, preserving_proto_field_name=True), modified_kwargs, context, ) response_data = await self._send_get_request( - '/card', {}, modified_kwargs + '/card', _model_to_query_params(request), modified_kwargs ) response: AgentCard = ParseDict(response_data, AgentCard()) diff --git a/tests/client/transports/test_jsonrpc_client.py b/tests/client/transports/test_jsonrpc_client.py index a550ed15..5927a20f 100644 --- a/tests/client/transports/test_jsonrpc_client.py +++ b/tests/client/transports/test_jsonrpc_client.py @@ -19,6 +19,7 @@ AgentInterface, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, @@ -647,6 +648,7 @@ async def test_get_card_with_extended_card_support_with_extensions( extended_card.CopyFrom(agent_card) extended_card.name = 'Extended' + request = GetExtendedAgentCardRequest() rpc_response = { 'id': '123', 'jsonrpc': '2.0', @@ -656,7 +658,7 @@ async def test_get_card_with_extended_card_support_with_extensions( client, '_send_request', new_callable=AsyncMock ) as mock_send_request: mock_send_request.return_value = rpc_response - await client.get_extended_agent_card(extensions=extensions) + await client.get_extended_agent_card(request, extensions=extensions) mock_send_request.assert_called_once() _, mock_kwargs = mock_send_request.call_args[0] diff --git a/tests/client/transports/test_rest_client.py b/tests/client/transports/test_rest_client.py index b28d557f..8d395457 100644 --- a/tests/client/transports/test_rest_client.py +++ b/tests/client/transports/test_rest_client.py @@ -16,6 +16,7 @@ AgentCard, AgentInterface, DeleteTaskPushNotificationConfigRequest, + GetExtendedAgentCardRequest, ListTaskPushNotificationConfigsRequest, SendMessageRequest, ) @@ -299,13 +300,14 @@ async def test_get_card_with_extended_card_support_with_extensions( ) # Extended card same for mock mock_httpx_client.send.return_value = mock_response + request = GetExtendedAgentCardRequest() with patch.object( client, '_send_get_request', new_callable=AsyncMock ) as mock_send_get_request: mock_send_get_request.return_value = json_format.MessageToDict( agent_card ) - await client.get_extended_agent_card(extensions=extensions) + await client.get_extended_agent_card(request, extensions=extensions) mock_send_get_request.assert_called_once() _, _, mock_kwargs = mock_send_get_request.call_args[0] diff --git a/tests/client/transports/test_tenant_decorator.py b/tests/client/transports/test_tenant_decorator.py new file mode 100644 index 00000000..ecde7f93 --- /dev/null +++ b/tests/client/transports/test_tenant_decorator.py @@ -0,0 +1,140 @@ +import pytest +from unittest.mock import AsyncMock, MagicMock + +from a2a.client.transports.base import ClientTransport +from a2a.client.transports.tenant_decorator import TenantTransportDecorator +from a2a.types.a2a_pb2 import ( + AgentCard, + CancelTaskRequest, + CreateTaskPushNotificationConfigRequest, + DeleteTaskPushNotificationConfigRequest, + GetTaskPushNotificationConfigRequest, + GetTaskRequest, + ListTaskPushNotificationConfigsRequest, + ListTasksRequest, + Message, + Part, + SendMessageRequest, + StreamResponse, + SubscribeToTaskRequest, +) + + +@pytest.fixture +def mock_transport() -> AsyncMock: + return AsyncMock(spec=ClientTransport) + + +class TestTenantTransportDecorator: + @pytest.mark.asyncio + async def test_resolve_tenant_logic( + self, mock_transport: AsyncMock + ) -> None: + tenant_id = 'test-tenant' + decorator = TenantTransportDecorator(mock_transport, tenant_id) + + # Case 1: Tenant already set on request + assert decorator._resolve_tenant('existing-tenant') == 'existing-tenant' + + # Case 2: Tenant not set (empty string) + assert decorator._resolve_tenant('') == tenant_id + + @pytest.mark.asyncio + async def test_resolve_tenant_logic_empty_tenant( + self, mock_transport: AsyncMock + ) -> None: + decorator = TenantTransportDecorator(mock_transport, '') + + # Case 1: Tenant already set on request + assert decorator._resolve_tenant('existing-tenant') == 'existing-tenant' + + # Case 2: Tenant not set (empty string) + assert decorator._resolve_tenant('') == '' + + @pytest.mark.parametrize( + 'method_name, request_obj', + [ + ( + 'send_message', + SendMessageRequest(message=Message(parts=[Part(text='hello')])), + ), + ( + 'get_task', + GetTaskRequest(id='t1'), + ), + ( + 'list_tasks', + ListTasksRequest(), + ), + ( + 'cancel_task', + CancelTaskRequest(id='t1'), + ), + ( + 'create_task_push_notification_config', + CreateTaskPushNotificationConfigRequest(task_id='t1'), + ), + ( + 'get_task_push_notification_config', + GetTaskPushNotificationConfigRequest(task_id='t1', id='c1'), + ), + ( + 'list_task_push_notification_configs', + ListTaskPushNotificationConfigsRequest(task_id='t1'), + ), + ( + 'delete_task_push_notification_config', + DeleteTaskPushNotificationConfigRequest(task_id='t1', id='c1'), + ), + ], + ) + @pytest.mark.asyncio + async def test_methods( + self, mock_transport: AsyncMock, method_name, request_obj + ) -> None: + tenant_id = 'test-tenant' + decorator = TenantTransportDecorator(mock_transport, tenant_id) + mock_method = getattr(mock_transport, method_name) + + await getattr(decorator, method_name)(request_obj) + + mock_method.assert_called_once() + assert mock_transport.mock_calls[0][0] == method_name + assert request_obj.tenant == tenant_id + + @pytest.mark.asyncio + async def test_streaming_methods(self, mock_transport: AsyncMock) -> None: + tenant_id = 'test-tenant' + decorator = TenantTransportDecorator(mock_transport, tenant_id) + + async def mock_stream(*args, **kwargs): + yield StreamResponse() + + # Test subscribe + mock_transport.subscribe.return_value = mock_stream() + request_sub = SubscribeToTaskRequest(id='t1') + async for _ in decorator.subscribe(request_sub): + pass + assert request_sub.tenant == tenant_id + + # Test send_message_streaming + mock_transport.send_message_streaming.return_value = mock_stream() + request_msg = SendMessageRequest() + async for _ in decorator.send_message_streaming(request_msg): + pass + assert request_msg.tenant == tenant_id + + @pytest.mark.asyncio + async def test_misc(self, mock_transport: AsyncMock) -> None: + tenant_id = 'test-tenant' + decorator = TenantTransportDecorator(mock_transport, tenant_id) + + # Test get_extended_agent_card + card = MagicMock(spec=AgentCard) + mock_transport.get_extended_agent_card.return_value = card + res = await decorator.get_extended_agent_card() + assert res is card + + # Test close + await decorator.close() + mock_transport.close.assert_called_once() diff --git a/tests/integration/test_client_server_integration.py b/tests/integration/test_client_server_integration.py index 90c23ef0..e65459f8 100644 --- a/tests/integration/test_client_server_integration.py +++ b/tests/integration/test_client_server_integration.py @@ -30,6 +30,7 @@ AgentCard, AgentInterface, CancelTaskRequest, + GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, Message, @@ -950,7 +951,7 @@ async def test_http_transport_get_authenticated_card( agent_card=agent_card, url=agent_card.supported_interfaces[0].url, ) - result = await transport.get_extended_agent_card() + result = await transport.get_extended_agent_card(GetExtendedAgentCardRequest()) assert result.name == extended_agent_card.name assert transport.agent_card is not None assert transport.agent_card.name == extended_agent_card.name @@ -976,7 +977,7 @@ def channel_factory(address: str) -> Channel: # The transport starts with a minimal card, get_extended_agent_card() fetches the full one assert transport.agent_card is not None transport.agent_card.capabilities.extended_agent_card = True - result = await transport.get_extended_agent_card() + result = await transport.get_extended_agent_card(GetExtendedAgentCardRequest()) assert result.name == agent_card.name assert transport.agent_card.name == agent_card.name @@ -1160,6 +1161,7 @@ async def test_json_transport_get_signed_extended_card( create_key_provider(public_key), ['HS384', 'ES256'] ) result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name @@ -1239,6 +1241,7 @@ async def test_json_transport_get_signed_base_and_extended_cards( # 3. Fetch extended card via transport result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name @@ -1316,6 +1319,7 @@ async def test_rest_transport_get_signed_card( # 3. Fetch extended card result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name @@ -1378,6 +1382,7 @@ def channel_factory(address: str) -> Channel: create_key_provider(public_key), ['HS384', 'ES256', 'RS256'] ) result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.signatures is not None From 675cabb26023d7d7c2d9d7629225a05e17135f86 Mon Sep 17 00:00:00 2001 From: sokoliva Date: Wed, 4 Mar 2026 16:02:15 +0000 Subject: [PATCH 2/5] fix: delete accidentally pushed file --- .../transports/test_tenant_decorator.py | 140 ------------------ 1 file changed, 140 deletions(-) delete mode 100644 tests/client/transports/test_tenant_decorator.py diff --git a/tests/client/transports/test_tenant_decorator.py b/tests/client/transports/test_tenant_decorator.py deleted file mode 100644 index ecde7f93..00000000 --- a/tests/client/transports/test_tenant_decorator.py +++ /dev/null @@ -1,140 +0,0 @@ -import pytest -from unittest.mock import AsyncMock, MagicMock - -from a2a.client.transports.base import ClientTransport -from a2a.client.transports.tenant_decorator import TenantTransportDecorator -from a2a.types.a2a_pb2 import ( - AgentCard, - CancelTaskRequest, - CreateTaskPushNotificationConfigRequest, - DeleteTaskPushNotificationConfigRequest, - GetTaskPushNotificationConfigRequest, - GetTaskRequest, - ListTaskPushNotificationConfigsRequest, - ListTasksRequest, - Message, - Part, - SendMessageRequest, - StreamResponse, - SubscribeToTaskRequest, -) - - -@pytest.fixture -def mock_transport() -> AsyncMock: - return AsyncMock(spec=ClientTransport) - - -class TestTenantTransportDecorator: - @pytest.mark.asyncio - async def test_resolve_tenant_logic( - self, mock_transport: AsyncMock - ) -> None: - tenant_id = 'test-tenant' - decorator = TenantTransportDecorator(mock_transport, tenant_id) - - # Case 1: Tenant already set on request - assert decorator._resolve_tenant('existing-tenant') == 'existing-tenant' - - # Case 2: Tenant not set (empty string) - assert decorator._resolve_tenant('') == tenant_id - - @pytest.mark.asyncio - async def test_resolve_tenant_logic_empty_tenant( - self, mock_transport: AsyncMock - ) -> None: - decorator = TenantTransportDecorator(mock_transport, '') - - # Case 1: Tenant already set on request - assert decorator._resolve_tenant('existing-tenant') == 'existing-tenant' - - # Case 2: Tenant not set (empty string) - assert decorator._resolve_tenant('') == '' - - @pytest.mark.parametrize( - 'method_name, request_obj', - [ - ( - 'send_message', - SendMessageRequest(message=Message(parts=[Part(text='hello')])), - ), - ( - 'get_task', - GetTaskRequest(id='t1'), - ), - ( - 'list_tasks', - ListTasksRequest(), - ), - ( - 'cancel_task', - CancelTaskRequest(id='t1'), - ), - ( - 'create_task_push_notification_config', - CreateTaskPushNotificationConfigRequest(task_id='t1'), - ), - ( - 'get_task_push_notification_config', - GetTaskPushNotificationConfigRequest(task_id='t1', id='c1'), - ), - ( - 'list_task_push_notification_configs', - ListTaskPushNotificationConfigsRequest(task_id='t1'), - ), - ( - 'delete_task_push_notification_config', - DeleteTaskPushNotificationConfigRequest(task_id='t1', id='c1'), - ), - ], - ) - @pytest.mark.asyncio - async def test_methods( - self, mock_transport: AsyncMock, method_name, request_obj - ) -> None: - tenant_id = 'test-tenant' - decorator = TenantTransportDecorator(mock_transport, tenant_id) - mock_method = getattr(mock_transport, method_name) - - await getattr(decorator, method_name)(request_obj) - - mock_method.assert_called_once() - assert mock_transport.mock_calls[0][0] == method_name - assert request_obj.tenant == tenant_id - - @pytest.mark.asyncio - async def test_streaming_methods(self, mock_transport: AsyncMock) -> None: - tenant_id = 'test-tenant' - decorator = TenantTransportDecorator(mock_transport, tenant_id) - - async def mock_stream(*args, **kwargs): - yield StreamResponse() - - # Test subscribe - mock_transport.subscribe.return_value = mock_stream() - request_sub = SubscribeToTaskRequest(id='t1') - async for _ in decorator.subscribe(request_sub): - pass - assert request_sub.tenant == tenant_id - - # Test send_message_streaming - mock_transport.send_message_streaming.return_value = mock_stream() - request_msg = SendMessageRequest() - async for _ in decorator.send_message_streaming(request_msg): - pass - assert request_msg.tenant == tenant_id - - @pytest.mark.asyncio - async def test_misc(self, mock_transport: AsyncMock) -> None: - tenant_id = 'test-tenant' - decorator = TenantTransportDecorator(mock_transport, tenant_id) - - # Test get_extended_agent_card - card = MagicMock(spec=AgentCard) - mock_transport.get_extended_agent_card.return_value = card - res = await decorator.get_extended_agent_card() - assert res is card - - # Test close - await decorator.close() - mock_transport.close.assert_called_once() From 5f76f1ec5952b3c7f9eae6b9939d92694878ddc3 Mon Sep 17 00:00:00 2001 From: sokoliva Date: Wed, 4 Mar 2026 16:03:46 +0000 Subject: [PATCH 3/5] fix: format --- .../test_client_server_integration.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/integration/test_client_server_integration.py b/tests/integration/test_client_server_integration.py index e65459f8..ae20c6e2 100644 --- a/tests/integration/test_client_server_integration.py +++ b/tests/integration/test_client_server_integration.py @@ -951,7 +951,9 @@ async def test_http_transport_get_authenticated_card( agent_card=agent_card, url=agent_card.supported_interfaces[0].url, ) - result = await transport.get_extended_agent_card(GetExtendedAgentCardRequest()) + result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest() + ) assert result.name == extended_agent_card.name assert transport.agent_card is not None assert transport.agent_card.name == extended_agent_card.name @@ -977,7 +979,9 @@ def channel_factory(address: str) -> Channel: # The transport starts with a minimal card, get_extended_agent_card() fetches the full one assert transport.agent_card is not None transport.agent_card.capabilities.extended_agent_card = True - result = await transport.get_extended_agent_card(GetExtendedAgentCardRequest()) + result = await transport.get_extended_agent_card( + GetExtendedAgentCardRequest() + ) assert result.name == agent_card.name assert transport.agent_card.name == agent_card.name @@ -1161,8 +1165,7 @@ async def test_json_transport_get_signed_extended_card( create_key_provider(public_key), ['HS384', 'ES256'] ) result = await transport.get_extended_agent_card( - GetExtendedAgentCardRequest(), - signature_verifier=signature_verifier + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name assert result.signatures is not None @@ -1241,8 +1244,7 @@ async def test_json_transport_get_signed_base_and_extended_cards( # 3. Fetch extended card via transport result = await transport.get_extended_agent_card( - GetExtendedAgentCardRequest(), - signature_verifier=signature_verifier + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name assert len(result.signatures) == 1 @@ -1319,8 +1321,7 @@ async def test_rest_transport_get_signed_card( # 3. Fetch extended card result = await transport.get_extended_agent_card( - GetExtendedAgentCardRequest(), - signature_verifier=signature_verifier + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.name == extended_agent_card.name assert result.signatures is not None @@ -1382,8 +1383,7 @@ def channel_factory(address: str) -> Channel: create_key_provider(public_key), ['HS384', 'ES256', 'RS256'] ) result = await transport.get_extended_agent_card( - GetExtendedAgentCardRequest(), - signature_verifier=signature_verifier + GetExtendedAgentCardRequest(), signature_verifier=signature_verifier ) assert result.signatures is not None assert len(result.signatures) == 1 From 6ed09b80d593b873ef39b4698a6ff7a9d360869d Mon Sep 17 00:00:00 2001 From: sokoliva Date: Wed, 4 Mar 2026 16:09:01 +0000 Subject: [PATCH 4/5] fix: remove unused import, add desc --- src/a2a/client/base_client.py | 1 + src/a2a/client/transports/grpc.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/a2a/client/base_client.py b/src/a2a/client/base_client.py index 6bb16427..258fb140 100644 --- a/src/a2a/client/base_client.py +++ b/src/a2a/client/base_client.py @@ -324,6 +324,7 @@ async def get_extended_agent_card( client's internal state with the new card. Args: + request: The `GetExtendedAgentCardRequest` object specifying the request. context: The client call context. extensions: List of extensions to be activated. signature_verifier: A callable used to verify the agent card's signatures. diff --git a/src/a2a/client/transports/grpc.py b/src/a2a/client/transports/grpc.py index 71c8bdaa..3815d722 100644 --- a/src/a2a/client/transports/grpc.py +++ b/src/a2a/client/transports/grpc.py @@ -23,7 +23,7 @@ from a2a.client.optionals import Channel from a2a.client.transports.base import ClientTransport from a2a.extensions.common import HTTP_EXTENSION_HEADER -from a2a.types import a2a_pb2, a2a_pb2_grpc +from a2a.types import a2a_pb2_grpc from a2a.types.a2a_pb2 import ( AgentCard, CancelTaskRequest, From 9ea0eefcda06081eaf543f359c0b4eb586fda1ac Mon Sep 17 00:00:00 2001 From: sokoliva Date: Thu, 5 Mar 2026 09:21:44 +0000 Subject: [PATCH 5/5] feat: remove query parameters from the `/card` GET request in the REST transport. --- src/a2a/client/transports/rest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/a2a/client/transports/rest.py b/src/a2a/client/transports/rest.py index 8e4c5800..a5459945 100644 --- a/src/a2a/client/transports/rest.py +++ b/src/a2a/client/transports/rest.py @@ -347,7 +347,7 @@ async def get_extended_agent_card( context, ) response_data = await self._send_get_request( - '/card', _model_to_query_params(request), modified_kwargs + '/card', {}, modified_kwargs ) response: AgentCard = ParseDict(response_data, AgentCard())