From 5d2339fb8014934ca0688e8609b68b4a59f4c9df Mon Sep 17 00:00:00 2001 From: suhasagg Date: Mon, 5 Oct 2026 15:47:12 +0530 Subject: [PATCH] fix(a2a): preserve terminal task status messages --- .../a2a/agent_framework_a2a/_agent.py | 12 +++++ python/packages/a2a/tests/test_a2a_agent.py | 48 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/python/packages/a2a/agent_framework_a2a/_agent.py b/python/packages/a2a/agent_framework_a2a/_agent.py index c5780b1ed5f..291b9010e73 100644 --- a/python/packages/a2a/agent_framework_a2a/_agent.py +++ b/python/packages/a2a/agent_framework_a2a/_agent.py @@ -1191,6 +1191,18 @@ def _parse_messages_from_task(self, task: Task) -> list[Message]: raw_representation=history_item, ) ) + elif task.status.message and task.status.message.parts: + status_message = task.status.message + contents = self._parse_contents_from_a2a(status_message.parts) + status_metadata = MessageToDict(status_message.metadata) if status_message.metadata else None + messages.append( + Message( + role="assistant" if status_message.role == A2ARole.ROLE_AGENT else "user", + contents=contents, + additional_properties=status_metadata, + raw_representation=status_message, + ) + ) return messages diff --git a/python/packages/a2a/tests/test_a2a_agent.py b/python/packages/a2a/tests/test_a2a_agent.py index 533e2e2a667..69735db35fa 100644 --- a/python/packages/a2a/tests/test_a2a_agent.py +++ b/python/packages/a2a/tests/test_a2a_agent.py @@ -374,6 +374,54 @@ def test_parse_messages_from_task_with_artifacts(a2a_agent: A2AAgent) -> None: assert all(msg.role == "assistant" for msg in result) +def test_parse_messages_from_task_with_terminal_status_message(a2a_agent: A2AAgent) -> None: + """Test _parse_messages_from_task falls back to a terminal task status message.""" + status_message = A2AMessage( + message_id="status-message", + role=A2ARole.ROLE_AGENT, + parts=[Part(text="Final response")], + ) + task = Task( + id="test", + context_id="test", + status=TaskStatus( + state=TaskState.TASK_STATE_COMPLETED, + message=status_message, + ), + ) + + result = a2a_agent._parse_messages_from_task(task) + + assert len(result) == 1 + assert result[0].role == "assistant" + assert result[0].text == "Final response" + assert result[0].raw_representation == status_message + + +def test_parse_messages_from_failed_task_with_status_message(a2a_agent: A2AAgent) -> None: + """Test _parse_messages_from_task preserves a failed task status message.""" + status_message = A2AMessage( + message_id="failure-message", + role=A2ARole.ROLE_AGENT, + parts=[Part(text="Task failed")], + ) + task = Task( + id="test", + context_id="test", + status=TaskStatus( + state=TaskState.TASK_STATE_FAILED, + message=status_message, + ), + ) + + result = a2a_agent._parse_messages_from_task(task) + + assert len(result) == 1 + assert result[0].role == "assistant" + assert result[0].text == "Task failed" + assert result[0].raw_representation == status_message + + def test_parse_message_from_artifact(a2a_agent: A2AAgent) -> None: """Test _parse_message_from_artifact conversion.""" artifact = Artifact(artifact_id="test-artifact", parts=[Part(text="Artifact content")])