diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index 92166c3f..f92617b1 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -106,6 +106,10 @@ def convert_a2a_request_to_agent_run_request( if not request.message: raise ValueError('Request message cannot be None') + custom_metadata = {} + if request.metadata: + custom_metadata['a2a_metadata'] = request.metadata + return AgentRunRequest( user_id=_get_user_id(request), session_id=request.context_id, @@ -113,5 +117,5 @@ def convert_a2a_request_to_agent_run_request( role='user', parts=[part_converter(part) for part in request.message.parts], ), - run_config=RunConfig(), + run_config=RunConfig(custom_metadata=custom_metadata), ) diff --git a/src/google/adk/agents/run_config.py b/src/google/adk/agents/run_config.py index bfcf3706..315de43f 100644 --- a/src/google/adk/agents/run_config.py +++ b/src/google/adk/agents/run_config.py @@ -17,6 +17,7 @@ from __future__ import annotations from enum import Enum import logging import sys +from typing import Any from typing import Optional from google.genai import types @@ -118,6 +119,9 @@ class RunConfig(BaseModel): - Less than or equal to 0: This allows for unbounded number of llm calls. """ + custom_metadata: Optional[dict[str, Any]] = None + """Custom metadata for the current invocation.""" + @field_validator('max_llm_calls', mode='after') @classmethod def validate_max_llm_calls(cls, value: int) -> int: diff --git a/tests/unittests/a2a/converters/test_request_converter.py b/tests/unittests/a2a/converters/test_request_converter.py index 360afbd3..3f4b8d85 100644 --- a/tests/unittests/a2a/converters/test_request_converter.py +++ b/tests/unittests/a2a/converters/test_request_converter.py @@ -165,6 +165,7 @@ class TestConvertA2aRequestToAgentRunRequest: request.message = mock_message request.context_id = "test_context_123" request.call_context = mock_call_context + request.metadata = {"test_key": "test_value"} # Create proper genai_types.Part objects instead of mocks mock_genai_part1 = genai_types.Part(text="test part 1") @@ -185,6 +186,9 @@ class TestConvertA2aRequestToAgentRunRequest: assert result.new_message.role == "user" assert result.new_message.parts == [mock_genai_part1, mock_genai_part2] assert isinstance(result.run_config, RunConfig) + assert result.run_config.custom_metadata == { + "a2a_metadata": {"test_key": "test_value"} + } # Verify calls assert mock_convert_part.call_count == 2 @@ -212,6 +216,7 @@ class TestConvertA2aRequestToAgentRunRequest: request.message = mock_message request.context_id = "test_context_123" request.call_context = None + request.metadata = {} # Act result = convert_a2a_request_to_agent_run_request( @@ -241,6 +246,7 @@ class TestConvertA2aRequestToAgentRunRequest: request.message = mock_message request.context_id = None request.call_context = None + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -272,6 +278,7 @@ class TestConvertA2aRequestToAgentRunRequest: request.message = mock_message request.context_id = "session_123" request.call_context = None + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -313,6 +320,7 @@ class TestIntegration: request.call_context = mock_call_context request.message = mock_message request.context_id = "mysession" + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -344,6 +352,7 @@ class TestIntegration: request.call_context = None request.message = mock_message request.context_id = "test_session_456" + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part")