Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/google/adk/a2a/agent/interceptors/new_integration_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,23 @@ async def _before_request(
if params.client_call_context is None:
params.client_call_context = _compat.ClientCallContext()

http_kwargs = params.client_call_context.state.get('http_kwargs', {})
headers = http_kwargs.get('headers', {})
context = params.client_call_context
if _compat.IS_A2A_V1:
# a2a-sdk 1.x transports only read headers from service_parameters.
headers = dict(context.service_parameters or {})
else:
http_kwargs = context.state.get('http_kwargs', {})
headers = http_kwargs.get('headers', {})
a2a_extensions = headers.get(HTTP_EXTENSION_HEADER, '').split(',')
a2a_extensions = [ext for ext in a2a_extensions if ext]
if _NEW_A2A_ADK_INTEGRATION_EXTENSION not in a2a_extensions:
a2a_extensions.append(_NEW_A2A_ADK_INTEGRATION_EXTENSION)
headers[HTTP_EXTENSION_HEADER] = ','.join(a2a_extensions)
http_kwargs['headers'] = headers
params.client_call_context.state['http_kwargs'] = http_kwargs
if _compat.IS_A2A_V1:
context.service_parameters = headers
else:
http_kwargs['headers'] = headers
context.state['http_kwargs'] = http_kwargs
return a2a_request, params


Expand Down
20 changes: 20 additions & 0 deletions tests/unittests/a2a/agent/test_remote_a2a_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -7589,3 +7589,23 @@ async def test_run_async_impl_keeps_task_control_on_auth_request(self):

assert events == [auth_request_event]
ctx.set_agent_state.assert_not_called()


class TestNewIntegrationExtensionInterceptor:
"""The extension header must land where the active a2a-sdk reads it."""

@pytest.mark.asyncio
async def test_header_is_merged_with_existing_headers(self):
from google.adk.a2a.agent.interceptors import new_integration_extension as nie

parameters = ParametersConfig()
_add = remote_a2a_agent._add_request_headers
_add(parameters, {"Authorization": "Bearer t"})

await nie._before_request(None, A2AMessage(), parameters)

headers = _request_headers(parameters.client_call_context)
assert headers["Authorization"] == "Bearer t"
assert (
headers["A2A-Extensions"] == nie._NEW_A2A_ADK_INTEGRATION_EXTENSION
)
Loading