From ed41537d56d64af67932a5d0d3d338466329d4e8 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Fri, 11 Jul 2025 01:09:46 +0530 Subject: [PATCH 1/3] Improve error handling in task creation --- src/a2a/utils/task.py | 9 +++++++++ tests/utils/test_task.py | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/a2a/utils/task.py b/src/a2a/utils/task.py index 9cf4df436..3d1a7a546 100644 --- a/src/a2a/utils/task.py +++ b/src/a2a/utils/task.py @@ -15,7 +15,16 @@ def new_task(request: Message) -> Task: Returns: A new `Task` object initialized with 'submitted' status and the input message in history. + + Raises: + TypeError: If the message role is None. + ValueError: If the message parts are empty. """ + if not request.role: + raise TypeError('Message role cannot be None') + if not request.parts: + raise ValueError('Message parts cannot be empty') + return Task( status=TaskStatus(state=TaskState.submitted), id=(request.taskId if request.taskId else str(uuid.uuid4())), diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index 796a7ad8d..e378864a4 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -3,6 +3,8 @@ from unittest.mock import patch +from pydantic import ValidationError + from a2a.types import Message, Part, Role, TextPart from a2a.utils.task import completed_task, new_task @@ -113,6 +115,24 @@ def test_completed_task_uses_provided_history(self): ) self.assertEqual(task.history, history) + def test_new_task_invalid_message_empty_parts(self): + with self.assertRaises(ValueError): + new_task( + Message( + role=Role.user, + parts=[], + messageId=str(uuid.uuid4()), + ) + ) + + def test_new_task_invalid_message_none_role(self): + with self.assertRaises(ValidationError): + Message( + role=None, + parts=[Part(root=TextPart(text='test message'))], + messageId=str(uuid.uuid4()), + ) + if __name__ == '__main__': unittest.main() From d4c93af35ce5df0c0ac5f6b8cf65a41169c6b434 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Bind Date: Fri, 11 Jul 2025 01:24:59 +0530 Subject: [PATCH 2/3] fix gemini-code-assist issues --- src/a2a/utils/task.py | 4 ++-- tests/utils/test_task.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/a2a/utils/task.py b/src/a2a/utils/task.py index 3d1a7a546..6a91f2d40 100644 --- a/src/a2a/utils/task.py +++ b/src/a2a/utils/task.py @@ -15,7 +15,7 @@ def new_task(request: Message) -> Task: Returns: A new `Task` object initialized with 'submitted' status and the input message in history. - + Raises: TypeError: If the message role is None. ValueError: If the message parts are empty. @@ -24,7 +24,7 @@ def new_task(request: Message) -> Task: raise TypeError('Message role cannot be None') if not request.parts: raise ValueError('Message parts cannot be empty') - + return Task( status=TaskStatus(state=TaskState.submitted), id=(request.taskId if request.taskId else str(uuid.uuid4())), diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index e378864a4..d6ade46e6 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -126,12 +126,13 @@ def test_new_task_invalid_message_empty_parts(self): ) def test_new_task_invalid_message_none_role(self): - with self.assertRaises(ValidationError): - Message( + with self.assertRaises(TypeError): + msg = Message.model_construct( role=None, parts=[Part(root=TextPart(text='test message'))], messageId=str(uuid.uuid4()), ) + new_task(msg) if __name__ == '__main__': From a1352ae9be45f2ff4688f02b38b6e1f34d6d1b6c Mon Sep 17 00:00:00 2001 From: Holt Skinner Date: Mon, 14 Jul 2025 11:17:59 -0500 Subject: [PATCH 3/3] formatting --- tests/utils/test_task.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index d6ade46e6..76119f008 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -3,8 +3,6 @@ from unittest.mock import patch -from pydantic import ValidationError - from a2a.types import Message, Part, Role, TextPart from a2a.utils.task import completed_task, new_task