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
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
from a2a.utils.errors import (
ExtendedAgentCardNotConfiguredError,
InternalError,
InvalidParamsError,
PushNotificationNotSupportedError,
TaskNotCancelableError,
TaskNotFoundError,
Expand Down Expand Up @@ -278,7 +277,7 @@ async def _setup_message_execution(

if task:
if task.status.state in TERMINAL_TASK_STATES:
raise InvalidParamsError(
raise UnsupportedOperationError(
message=f'Task {task.id} is in terminal state: {task.status.state}'
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
PushNotificationNotSupportedError,
TaskNotCancelableError,
TaskNotFoundError,
UnsupportedOperationError,
)
from a2a.utils.task import (
apply_history_length,
Expand Down Expand Up @@ -221,6 +222,10 @@ async def _setup_active_task(
task = await self.task_store.get(original_task_id, call_context)
if not task:
raise TaskNotFoundError(f'Task {original_task_id} not found')
if task.status.state in TERMINAL_TASK_STATES:
raise UnsupportedOperationError(
message=f'Task {task.id} is in terminal state: {task.status.state}'
)

# Build context to resolve or generate missing IDs
request_context = await self._request_context_builder.build(
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/test_scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
InvalidParamsError,
TaskNotCancelableError,
TaskNotFoundError,
UnsupportedOperationError,
)


Expand Down Expand Up @@ -428,8 +429,7 @@ async def cancel(
role=Role.ROLE_USER,
parts=[Part(text='message to completed task')],
)
# TODO: Is it correct error code ?
with pytest.raises(InvalidParamsError):
with pytest.raises(UnsupportedOperationError):
async for _ in client.send_message(SendMessageRequest(message=msg2)):
pass

Expand Down
12 changes: 6 additions & 6 deletions tests/server/request_handlers/test_default_request_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2518,8 +2518,8 @@ async def test_delete_task_push_notification_config_info_with_config_and_no_id(
@pytest.mark.asyncio
@pytest.mark.parametrize('terminal_state', TERMINAL_TASK_STATES)
async def test_on_message_send_task_in_terminal_state(
terminal_state, agent_card
):
terminal_state: TaskState, agent_card: AgentCard
) -> None:
"""Test on_message_send when task is already in a terminal state."""
state_name = TaskState.Name(terminal_state)
task_id = f'terminal_task_{state_name}'
Expand Down Expand Up @@ -2552,7 +2552,7 @@ async def test_on_message_send_task_in_terminal_state(
'a2a.server.request_handlers.default_request_handler.TaskManager.get_task',
return_value=terminal_task,
):
with pytest.raises(InvalidParamsError) as exc_info:
with pytest.raises(UnsupportedOperationError) as exc_info:
await request_handler.on_message_send(
params, create_server_call_context()
)
Expand All @@ -2566,8 +2566,8 @@ async def test_on_message_send_task_in_terminal_state(
@pytest.mark.asyncio
@pytest.mark.parametrize('terminal_state', TERMINAL_TASK_STATES)
async def test_on_message_send_stream_task_in_terminal_state(
terminal_state, agent_card
):
terminal_state: TaskState, agent_card: AgentCard
) -> None:
"""Test on_message_send_stream when task is already in a terminal state."""
state_name = TaskState.Name(terminal_state)
task_id = f'terminal_stream_task_{state_name}'
Expand Down Expand Up @@ -2596,7 +2596,7 @@ async def test_on_message_send_stream_task_in_terminal_state(
'a2a.server.request_handlers.default_request_handler.TaskManager.get_task',
return_value=terminal_task,
):
with pytest.raises(InvalidParamsError) as exc_info:
with pytest.raises(UnsupportedOperationError) as exc_info:
async for _ in request_handler.on_message_send_stream(
params, create_server_call_context()
):
Expand Down
27 changes: 11 additions & 16 deletions tests/server/request_handlers/test_default_request_handler_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
InvalidParamsError,
PushNotificationNotSupportedError,
TaskNotFoundError,
UnsupportedOperationError,
)
from a2a.types.a2a_pb2 import (
AgentCapabilities,
Expand Down Expand Up @@ -961,14 +962,17 @@ async def test_delete_task_push_notification_config_info_with_config_and_no_id()

@pytest.mark.asyncio
@pytest.mark.parametrize('terminal_state', TERMINAL_TASK_STATES)
async def test_on_message_send_task_in_terminal_state(terminal_state):
async def test_on_message_send_task_in_terminal_state(
terminal_state: TaskState,
) -> None:
"""Test on_message_send when task is already in a terminal state."""
state_name = TaskState.Name(terminal_state)
task_id = f'terminal_task_{state_name}'
terminal_task = create_sample_task(
task_id=task_id, status_state=terminal_state
)
mock_task_store = AsyncMock(spec=TaskStore)
mock_task_store.get.return_value = terminal_task
request_handler = DefaultRequestHandlerV2(
agent_executor=MockAgentExecutor(),
task_store=mock_task_store,
Expand All @@ -982,13 +986,7 @@ async def test_on_message_send_task_in_terminal_state(terminal_state):
task_id=task_id,
)
)
with (
patch(
'a2a.server.request_handlers.default_request_handler.TaskManager.get_task',
return_value=terminal_task,
),
pytest.raises(InvalidParamsError) as exc_info,
):
with pytest.raises(UnsupportedOperationError) as exc_info:
await request_handler.on_message_send(
params, create_server_call_context()
)
Expand All @@ -1000,14 +998,17 @@ async def test_on_message_send_task_in_terminal_state(terminal_state):

@pytest.mark.asyncio
@pytest.mark.parametrize('terminal_state', TERMINAL_TASK_STATES)
async def test_on_message_send_stream_task_in_terminal_state(terminal_state):
async def test_on_message_send_stream_task_in_terminal_state(
terminal_state: TaskState,
) -> None:
"""Test on_message_send_stream when task is already in a terminal state."""
state_name = TaskState.Name(terminal_state)
task_id = f'terminal_stream_task_{state_name}'
terminal_task = create_sample_task(
task_id=task_id, status_state=terminal_state
)
mock_task_store = AsyncMock(spec=TaskStore)
mock_task_store.get.return_value = terminal_task
request_handler = DefaultRequestHandlerV2(
agent_executor=MockAgentExecutor(),
task_store=mock_task_store,
Expand All @@ -1021,13 +1022,7 @@ async def test_on_message_send_stream_task_in_terminal_state(terminal_state):
task_id=task_id,
)
)
with (
patch(
'a2a.server.request_handlers.default_request_handler.TaskManager.get_task',
return_value=terminal_task,
),
pytest.raises(InvalidParamsError) as exc_info,
):
with pytest.raises(UnsupportedOperationError) as exc_info:
async for _ in request_handler.on_message_send_stream(
params, create_server_call_context()
):
Expand Down
Loading