Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/google/adk/a2a/converters/event_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,15 @@ def convert_a2a_task_to_event(
# Extract message from task status or history
message = None
if a2a_task.artifacts:
# A task carries one artifact per non-partial event the remote agent
# produced, so reading only the last one drops every earlier output.
# to_adk_event.convert_a2a_task_to_event flattens them the same way.
message = Message(
message_id="",
role=_compat.ROLE_AGENT,
parts=a2a_task.artifacts[-1].parts,
parts=[
part for artifact in a2a_task.artifacts for part in artifact.parts
],
)
elif (
a2a_task.status
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"backendUrl": "",
"telemetry": false
"telemetry": null
}
33 changes: 33 additions & 0 deletions tests/unittests/a2a/converters/test_event_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,39 @@ def test_convert_a2a_task_to_event_with_artifacts_priority(self):
assert called_message.role == _compat.ROLE_AGENT
assert called_message.parts == [artifact_part]

def test_convert_a2a_task_to_event_keeps_every_artifact(self):
"""Every artifact on the task reaches the event, in task order.

A remote agent returns one artifact per non-partial event it produced,
so reading only the last artifact drops its earlier output.
"""
first_part = _compat.make_text_part("first artifact")
second_part = _compat.make_text_part("second artifact")
third_part = _compat.make_text_part("third artifact")

mock_artifacts = []
for part in (first_part, second_part, third_part):
mock_artifact = Mock(spec=Artifact)
mock_artifact.parts = [part]
mock_artifacts.append(mock_artifact)

mock_task = Mock(spec=Task)
mock_task.artifacts = mock_artifacts
mock_task.status = None
mock_task.history = []

with patch(
"google.adk.a2a.converters.event_converter.convert_a2a_message_to_event"
) as mock_convert_message:
mock_convert_message.return_value = Mock(spec=Event)

convert_a2a_task_to_event(
mock_task, "test-author", self.mock_invocation_context
)

called_message = mock_convert_message.call_args[0][0]
assert called_message.parts == [first_part, second_part, third_part]

def test_convert_a2a_task_to_event_with_status_message(self):
"""Test convert_a2a_task_to_event with status message (no artifacts)."""

Expand Down
Loading