From 237350d4d6e9fd1d9b70fb92f4de2712bd63d2fd Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Wed, 16 Jul 2025 00:20:19 +0530 Subject: [PATCH 1/2] fixed --- src/a2a/utils/task.py | 3 +++ tests/utils/test_task.py | 29 ++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/a2a/utils/task.py b/src/a2a/utils/task.py index 6a91f2d4..ee98225f 100644 --- a/src/a2a/utils/task.py +++ b/src/a2a/utils/task.py @@ -55,6 +55,9 @@ def completed_task( Returns: A `Task` object with status set to 'completed'. """ + if not artifacts or not all(isinstance(a, Artifact) for a in artifacts): + raise ValueError("artifacts must be a non-empty list of Artifact objects") + if history is None: history = [] return Task( diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index 76119f00..376b3c9a 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -3,7 +3,8 @@ from unittest.mock import patch -from a2a.types import Message, Part, Role, TextPart +import pytest +from a2a.types import Message, Part, Role, TextPart, Artifact from a2a.utils.task import completed_task, new_task @@ -57,7 +58,7 @@ def test_new_task_initial_message_in_history(self): def test_completed_task_status(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [] # Artifacts should be of type Artifact + artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] task = completed_task( task_id=task_id, context_id=context_id, @@ -69,7 +70,7 @@ def test_completed_task_status(self): def test_completed_task_assigns_ids_and_artifacts(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [] # Artifacts should be of type Artifact + artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] task = completed_task( task_id=task_id, context_id=context_id, @@ -83,7 +84,7 @@ def test_completed_task_assigns_ids_and_artifacts(self): def test_completed_task_empty_history_if_not_provided(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [] # Artifacts should be of type Artifact + artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] task = completed_task( task_id=task_id, context_id=context_id, artifacts=artifacts ) @@ -92,7 +93,7 @@ def test_completed_task_empty_history_if_not_provided(self): def test_completed_task_uses_provided_history(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [] # Artifacts should be of type Artifact + artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] history = [ Message( role=Role.user, @@ -132,6 +133,24 @@ def test_new_task_invalid_message_none_role(self): ) new_task(msg) + def test_completed_task_empty_artifacts(self): + with pytest.raises(ValueError, match="artifacts must be a non-empty list of Artifact objects"): + completed_task( + task_id="task-123", + context_id="ctx-456", + artifacts=[], + history=[] + ) + + def test_completed_task_invalid_artifact_type(self): + with pytest.raises(ValueError, match="artifacts must be a non-empty list of Artifact objects"): + completed_task( + task_id="task-123", + context_id="ctx-456", + artifacts=["not an artifact"], + history=[] + ) + if __name__ == '__main__': unittest.main() From 1591ba0a2bf9427fd7dba8ea0e29d14f887357cd Mon Sep 17 00:00:00 2001 From: Holt Skinner Date: Tue, 15 Jul 2025 19:57:25 +0100 Subject: [PATCH 2/2] Formatting --- src/a2a/utils/task.py | 4 ++- tests/utils/test_task.py | 55 ++++++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/a2a/utils/task.py b/src/a2a/utils/task.py index ee98225f..9b8c82a9 100644 --- a/src/a2a/utils/task.py +++ b/src/a2a/utils/task.py @@ -56,7 +56,9 @@ def completed_task( A `Task` object with status set to 'completed'. """ if not artifacts or not all(isinstance(a, Artifact) for a in artifacts): - raise ValueError("artifacts must be a non-empty list of Artifact objects") + raise ValueError( + 'artifacts must be a non-empty list of Artifact objects' + ) if history is None: history = [] diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index 376b3c9a..0e391b74 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -4,7 +4,8 @@ from unittest.mock import patch import pytest -from a2a.types import Message, Part, Role, TextPart, Artifact + +from a2a.types import Artifact, Message, Part, Role, TextPart from a2a.utils.task import completed_task, new_task @@ -58,7 +59,12 @@ def test_new_task_initial_message_in_history(self): def test_completed_task_status(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] + artifacts = [ + Artifact( + artifactId='artifact_1', + parts=[Part(root=TextPart(text='some content'))], + ) + ] task = completed_task( task_id=task_id, context_id=context_id, @@ -70,7 +76,12 @@ def test_completed_task_status(self): def test_completed_task_assigns_ids_and_artifacts(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] + artifacts = [ + Artifact( + artifactId='artifact_1', + parts=[Part(root=TextPart(text='some content'))], + ) + ] task = completed_task( task_id=task_id, context_id=context_id, @@ -84,7 +95,12 @@ def test_completed_task_assigns_ids_and_artifacts(self): def test_completed_task_empty_history_if_not_provided(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] + artifacts = [ + Artifact( + artifactId='artifact_1', + parts=[Part(root=TextPart(text='some content'))], + ) + ] task = completed_task( task_id=task_id, context_id=context_id, artifacts=artifacts ) @@ -93,7 +109,12 @@ def test_completed_task_empty_history_if_not_provided(self): def test_completed_task_uses_provided_history(self): task_id = str(uuid.uuid4()) context_id = str(uuid.uuid4()) - artifacts = [Artifact(artifactId="artifact_1", parts=[Part(root=TextPart(text="some content"))])] + artifacts = [ + Artifact( + artifactId='artifact_1', + parts=[Part(root=TextPart(text='some content'))], + ) + ] history = [ Message( role=Role.user, @@ -134,21 +155,27 @@ def test_new_task_invalid_message_none_role(self): new_task(msg) def test_completed_task_empty_artifacts(self): - with pytest.raises(ValueError, match="artifacts must be a non-empty list of Artifact objects"): + with pytest.raises( + ValueError, + match='artifacts must be a non-empty list of Artifact objects', + ): completed_task( - task_id="task-123", - context_id="ctx-456", + task_id='task-123', + context_id='ctx-456', artifacts=[], - history=[] + history=[], ) def test_completed_task_invalid_artifact_type(self): - with pytest.raises(ValueError, match="artifacts must be a non-empty list of Artifact objects"): + with pytest.raises( + ValueError, + match='artifacts must be a non-empty list of Artifact objects', + ): completed_task( - task_id="task-123", - context_id="ctx-456", - artifacts=["not an artifact"], - history=[] + task_id='task-123', + context_id='ctx-456', + artifacts=['not an artifact'], + history=[], )