diff --git a/src/a2a/utils/task.py b/src/a2a/utils/task.py index 9b8c82a9..79133a1d 100644 --- a/src/a2a/utils/task.py +++ b/src/a2a/utils/task.py @@ -2,7 +2,7 @@ import uuid -from a2a.types import Artifact, Message, Task, TaskState, TaskStatus +from a2a.types import Artifact, Message, Task, TaskState, TaskStatus, TextPart def new_task(request: Message) -> Task: @@ -18,12 +18,15 @@ def new_task(request: Message) -> Task: Raises: TypeError: If the message role is None. - ValueError: If the message parts are empty. + ValueError: If the message parts are empty or if any part has empty content. """ if not request.role: raise TypeError('Message role cannot be None') if not request.parts: raise ValueError('Message parts cannot be empty') + for part in request.parts: + if isinstance(part.root, TextPart) and not part.root.text: + raise ValueError('TextPart content cannot be empty') return Task( status=TaskStatus(state=TaskState.submitted), diff --git a/tests/utils/test_task.py b/tests/utils/test_task.py index 0e391b74..e332c977 100644 --- a/tests/utils/test_task.py +++ b/tests/utils/test_task.py @@ -145,6 +145,16 @@ def test_new_task_invalid_message_empty_parts(self): ) ) + def test_new_task_invalid_message_empty_content(self): + with self.assertRaises(ValueError): + new_task( + Message( + role=Role.user, + parts=[Part(root=TextPart(text=''))], + messageId=str(uuid.uuid4()), + ) + ) + def test_new_task_invalid_message_none_role(self): with self.assertRaises(TypeError): msg = Message.model_construct(