From 52c80c2972a5b5f3da43bb663cb54dfd15b776de Mon Sep 17 00:00:00 2001 From: ufJmacca Date: Mon, 6 Oct 2025 13:27:22 +1100 Subject: [PATCH 1/4] ADD a2a request metadata passthru --- .../adk/a2a/converters/request_converter.py | 15 +++++++++------ src/google/adk/agents/invocation_context.py | 3 +++ src/google/adk/agents/run_config.py | 4 ++++ src/google/adk/runners.py | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index 78a6d78eee..2600ada56d 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -55,14 +55,17 @@ def convert_a2a_request_to_adk_run_args( ) -> dict[str, Any]: if not request.message: - raise ValueError('Request message cannot be None') + raise ValueError("Request message cannot be None") + metadata = None + if hasattr(request, "metadata"): + metadata = request.metadata return { - 'user_id': _get_user_id(request), - 'session_id': request.context_id, - 'new_message': genai_types.Content( - role='user', + "user_id": _get_user_id(request), + "session_id": request.context_id, + "new_message": genai_types.Content( + role="user", parts=[part_converter(part) for part in request.message.parts], ), - 'run_config': RunConfig(), + "run_config": RunConfig(metadata=metadata), } diff --git a/src/google/adk/agents/invocation_context.py b/src/google/adk/agents/invocation_context.py index 66ecbaf4a9..7845c91929 100644 --- a/src/google/adk/agents/invocation_context.py +++ b/src/google/adk/agents/invocation_context.py @@ -202,6 +202,9 @@ class InvocationContext(BaseModel): plugin_manager: PluginManager = Field(default_factory=PluginManager) """The manager for keeping track of plugins in this invocation.""" + a2a_metadata: Optional[dict[str, Any]] = None + """The metadata of the A2A request.""" + _invocation_cost_manager: _InvocationCostManager = PrivateAttr( default_factory=_InvocationCostManager ) diff --git a/src/google/adk/agents/run_config.py b/src/google/adk/agents/run_config.py index 9fe82fabf1..fedfbd230a 100644 --- a/src/google/adk/agents/run_config.py +++ b/src/google/adk/agents/run_config.py @@ -17,6 +17,7 @@ from enum import Enum import logging import sys +from typing import Any from typing import Optional from google.genai import types @@ -42,6 +43,9 @@ class RunConfig(BaseModel): ) """The pydantic model config.""" + metadata: Optional[dict[str, Any]] = None + """The metadata of the run.""" + speech_config: Optional[types.SpeechConfig] = None """Speech configuration for the live agent.""" diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index e7066a0c48..157c9a1772 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -848,6 +848,7 @@ def _new_invocation_context( live_request_queue=live_request_queue, run_config=run_config, resumability_config=self.resumability_config, + a2a_metadata=run_config.metadata, ) def _new_invocation_context_for_live( From a2e8d98f067aefc2a5c997f63da978d50acb57fd Mon Sep 17 00:00:00 2001 From: ufJmacca Date: Mon, 6 Oct 2025 14:17:34 +1100 Subject: [PATCH 2/4] revert quotes --- .../adk/a2a/converters/request_converter.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index 2600ada56d..9a347079cc 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -1,13 +1,13 @@ # Copyright 2025 Google LLC # -# Licensed under the Apache License, Version 2.0 (the "License"); +# Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, +# distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. @@ -55,17 +55,17 @@ def convert_a2a_request_to_adk_run_args( ) -> dict[str, Any]: if not request.message: - raise ValueError("Request message cannot be None") + raise ValueError('Request message cannot be None') metadata = None - if hasattr(request, "metadata"): + if hasattr(request, 'metadata'): metadata = request.metadata return { - "user_id": _get_user_id(request), - "session_id": request.context_id, - "new_message": genai_types.Content( - role="user", + 'user_id': _get_user_id(request), + 'session_id': request.context_id, + 'new_message': genai_types.Content( + role='user', parts=[part_converter(part) for part in request.message.parts], ), - "run_config": RunConfig(metadata=metadata), + 'run_config': RunConfig(metadata=metadata), } From dd4a8a4cfede0641423b6e93425517202bbae5cd Mon Sep 17 00:00:00 2001 From: ufJmacca Date: Mon, 6 Oct 2025 14:18:39 +1100 Subject: [PATCH 3/4] recert quotes --- src/google/adk/a2a/converters/request_converter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index 9a347079cc..a9de188423 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -1,13 +1,13 @@ # Copyright 2025 Google LLC # -# Licensed under the Apache License, Version 2.0 (the 'License'); +# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an 'AS IS' BASIS, +# distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. From 61aec28e3069d5a9d2aa02e769441a48a4725e95 Mon Sep 17 00:00:00 2001 From: ufJmacca Date: Mon, 6 Oct 2025 14:27:06 +1100 Subject: [PATCH 4/4] Update src/google/adk/a2a/converters/request_converter.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/google/adk/a2a/converters/request_converter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index a9de188423..6ba812d359 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -57,9 +57,7 @@ def convert_a2a_request_to_adk_run_args( if not request.message: raise ValueError('Request message cannot be None') - metadata = None - if hasattr(request, 'metadata'): - metadata = request.metadata + metadata = getattr(request, 'metadata', None) return { 'user_id': _get_user_id(request), 'session_id': request.context_id,