Skip to content

Commit ba63176

Browse files
google-genai-botcopybara-github
authored andcommitted
feat: Introduce custom_metadata field to run_config and propagate a2a request metadata to that field
PiperOrigin-RevId: 823066539
1 parent 955632c commit ba63176

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

src/google/adk/a2a/converters/request_converter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,16 @@ def convert_a2a_request_to_agent_run_request(
106106
if not request.message:
107107
raise ValueError('Request message cannot be None')
108108

109+
custom_metadata = {}
110+
if request.metadata:
111+
custom_metadata['a2a_metadata'] = request.metadata
112+
109113
return AgentRunRequest(
110114
user_id=_get_user_id(request),
111115
session_id=request.context_id,
112116
new_message=genai_types.Content(
113117
role='user',
114118
parts=[part_converter(part) for part in request.message.parts],
115119
),
116-
run_config=RunConfig(),
120+
run_config=RunConfig(custom_metadata=custom_metadata),
117121
)

src/google/adk/agents/run_config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from enum import Enum
1818
import logging
1919
import sys
20+
from typing import Any
2021
from typing import Optional
2122

2223
from google.genai import types
@@ -118,6 +119,9 @@ class RunConfig(BaseModel):
118119
- Less than or equal to 0: This allows for unbounded number of llm calls.
119120
"""
120121

122+
custom_metadata: Optional[dict[str, Any]] = None
123+
"""Custom metadata for the current invocation."""
124+
121125
@field_validator('max_llm_calls', mode='after')
122126
@classmethod
123127
def validate_max_llm_calls(cls, value: int) -> int:

tests/unittests/a2a/converters/test_request_converter.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ def test_convert_a2a_request_basic(self):
165165
request.message = mock_message
166166
request.context_id = "test_context_123"
167167
request.call_context = mock_call_context
168+
request.metadata = {"test_key": "test_value"}
168169

169170
# Create proper genai_types.Part objects instead of mocks
170171
mock_genai_part1 = genai_types.Part(text="test part 1")
@@ -185,6 +186,9 @@ def test_convert_a2a_request_basic(self):
185186
assert result.new_message.role == "user"
186187
assert result.new_message.parts == [mock_genai_part1, mock_genai_part2]
187188
assert isinstance(result.run_config, RunConfig)
189+
assert result.run_config.custom_metadata == {
190+
"a2a_metadata": {"test_key": "test_value"}
191+
}
188192

189193
# Verify calls
190194
assert mock_convert_part.call_count == 2
@@ -212,6 +216,7 @@ def test_convert_a2a_request_empty_parts(self):
212216
request.message = mock_message
213217
request.context_id = "test_context_123"
214218
request.call_context = None
219+
request.metadata = {}
215220

216221
# Act
217222
result = convert_a2a_request_to_agent_run_request(
@@ -241,6 +246,7 @@ def test_convert_a2a_request_none_context_id(self):
241246
request.message = mock_message
242247
request.context_id = None
243248
request.call_context = None
249+
request.metadata = {}
244250

245251
# Create proper genai_types.Part object instead of mock
246252
mock_genai_part = genai_types.Part(text="test part")
@@ -272,6 +278,7 @@ def test_convert_a2a_request_no_auth(self):
272278
request.message = mock_message
273279
request.context_id = "session_123"
274280
request.call_context = None
281+
request.metadata = {}
275282

276283
# Create proper genai_types.Part object instead of mock
277284
mock_genai_part = genai_types.Part(text="test part")
@@ -313,6 +320,7 @@ def test_end_to_end_conversion_with_auth_user(self):
313320
request.call_context = mock_call_context
314321
request.message = mock_message
315322
request.context_id = "mysession"
323+
request.metadata = {}
316324

317325
# Create proper genai_types.Part object instead of mock
318326
mock_genai_part = genai_types.Part(text="test part")
@@ -344,6 +352,7 @@ def test_end_to_end_conversion_with_fallback_user(self):
344352
request.call_context = None
345353
request.message = mock_message
346354
request.context_id = "test_session_456"
355+
request.metadata = {}
347356

348357
# Create proper genai_types.Part object instead of mock
349358
mock_genai_part = genai_types.Part(text="test part")

0 commit comments

Comments
 (0)