From dd9a4b6321f8922cb4505f84ed5c3e206dfbddb7 Mon Sep 17 00:00:00 2001 From: Giles Odigwe <79032838+giles17@users.noreply.github.com> Date: Fri, 29 May 2026 01:11:13 -0700 Subject: [PATCH] Python: [A2A] Set message_id on AgentResponseUpdate for message-bearing paths (#6163) Map A2A protocol message_id to AgentResponseUpdate.message_id in two paths where it was previously omitted, aligning with .NET behavior: 1. Standalone A2AMessage: set message_id=msg.message_id (matches .NET ConvertToAgentResponseUpdate(Message) which sets both ResponseId and MessageId to message.MessageId) 2. TaskStatusUpdateEvent (terminal/input_required): set message_id=message.message_id (matches .NET which sets MessageId=statusUpdateEvent.Status.Message?.MessageId) Fixes #5949 Co-authored-by: Copilot 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 | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index c620176779..33c8239a1c 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -492,6 +492,7 @@ class A2AAgent(AgentTelemetryLayer, BaseAgent): contents=contents, role="assistant" if msg.role == A2ARole.ROLE_AGENT else "user", response_id=msg.message_id or str(uuid.uuid4()), + message_id=msg.message_id, additional_properties={"a2a_metadata": metadata} if metadata else None, raw_representation=msg, ) @@ -732,6 +733,7 @@ class A2AAgent(AgentTelemetryLayer, BaseAgent): contents=contents, role="assistant" if message.role == A2ARole.ROLE_AGENT else "user", response_id=update_event.task_id, + message_id=message.message_id, additional_properties={"a2a_metadata": merged_metadata} if merged_metadata else None, raw_representation=update_event, ) diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index 0ff5978c87..746a9b8664 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -420,6 +420,7 @@ async def test_run_streaming_with_message_response(a2a_agent: A2AAgent, mock_a2a assert content.text == "Streaming response from agent!" assert updates[0].response_id == "msg-stream-123" + assert updates[0].message_id == "msg-stream-123" assert mock_a2a_client.call_count == 1 @@ -1422,7 +1423,7 @@ async def test_streaming_status_update_event_yields_content( status=TaskStatus( state=TaskState.TASK_STATE_COMPLETED, message=A2AMessage( - message_id=str(uuid4()), + message_id="msg-status-done", role=A2ARole.ROLE_AGENT, parts=[Part(text="Done")], ), @@ -1437,6 +1438,7 @@ async def test_streaming_status_update_event_yields_content( assert len(updates) == 1 assert updates[0].text == "Done" assert updates[0].role == "assistant" + assert updates[0].message_id == "msg-status-done" assert updates[0].raw_representation == update_event @@ -1449,7 +1451,7 @@ async def test_streaming_input_required_emits_content(a2a_agent: A2AAgent, mock_ status=TaskStatus( state=TaskState.TASK_STATE_INPUT_REQUIRED, message=A2AMessage( - message_id=str(uuid4()), + message_id="msg-input-req", role=A2ARole.ROLE_AGENT, parts=[Part(text="What is your name?")], ), @@ -1463,6 +1465,7 @@ async def test_streaming_input_required_emits_content(a2a_agent: A2AAgent, mock_ assert len(updates) == 1 assert updates[0].text == "What is your name?" + assert updates[0].message_id == "msg-input-req" @mark.asyncio