From 8b451bee83a1611afae517e0600618006ac1f4d3 Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 13 Mar 2026 11:48:12 +0100 Subject: [PATCH 1/2] Python: forward A2A context_id --- .../packages/a2a/agent_framework_a2a/_agent.py | 1 + python/packages/a2a/tests/test_a2a_agent.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index c954c90fc0..d7637f7015 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -493,6 +493,7 @@ def _prepare_message_for_a2a(self, message: Message) -> A2AMessage: role=A2ARole("user"), parts=parts, message_id=message.message_id or uuid.uuid4().hex, + context_id=message.additional_properties.get("context_id"), metadata=metadata, ) diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index ce7bb42a48..2c53c8022d 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -507,6 +507,22 @@ def test_prepare_message_for_a2a_with_multiple_contents() -> None: assert result.parts[3].root.kind == "text" # JSON text remains as text (no parsing) +def test_prepare_message_for_a2a_forwards_context_id() -> None: + """Test conversion of Message preserves context_id on the A2A message.""" + + agent = A2AAgent(client=MagicMock(), _http_client=None) + + message = Message( + role="user", + contents=[Content.from_text(text="Continue the task")], + additional_properties={"context_id": "ctx-123"}, + ) + + result = agent._prepare_message_for_a2a(message) + + assert result.context_id == "ctx-123" + + def test_parse_contents_from_a2a_with_data_part() -> None: """Test conversion of A2A DataPart.""" From 6f0e384b22d075fc87401929e658e9bda836f7ce Mon Sep 17 00:00:00 2001 From: eavanvalkenburg Date: Fri, 13 Mar 2026 13:47:51 +0100 Subject: [PATCH 2/2] Avoid duplicating A2A context ids Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- python/packages/a2a/agent_framework_a2a/_agent.py | 2 +- python/packages/a2a/tests/test_a2a_agent.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index d7637f7015..e11aa668da 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -486,7 +486,7 @@ def _prepare_message_for_a2a(self, message: Message) -> A2AMessage: raise ValueError(f"Unknown content type: {content.type}") # Exclude framework-internal keys (e.g. attribution) from wire metadata - internal_keys = {"_attribution"} + internal_keys = {"_attribution", "context_id"} metadata = {k: v for k, v in message.additional_properties.items() if k not in internal_keys} or None return A2AMessage( diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index 2c53c8022d..a426c27a7f 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -508,19 +508,20 @@ def test_prepare_message_for_a2a_with_multiple_contents() -> None: def test_prepare_message_for_a2a_forwards_context_id() -> None: - """Test conversion of Message preserves context_id on the A2A message.""" + """Test conversion of Message preserves context_id without duplicating it in metadata.""" agent = A2AAgent(client=MagicMock(), _http_client=None) message = Message( role="user", contents=[Content.from_text(text="Continue the task")], - additional_properties={"context_id": "ctx-123"}, + additional_properties={"context_id": "ctx-123", "trace_id": "trace-456"}, ) result = agent._prepare_message_for_a2a(message) assert result.context_id == "ctx-123" + assert result.metadata == {"trace_id": "trace-456"} def test_parse_contents_from_a2a_with_data_part() -> None: