diff --git a/skyvern/exceptions.py b/skyvern/exceptions.py index f3db518d..f3f80ce7 100644 --- a/skyvern/exceptions.py +++ b/skyvern/exceptions.py @@ -266,7 +266,12 @@ class UnknownElementTreeFormat(SkyvernException): class StepTerminationError(SkyvernException): def __init__(self, step_id: str, reason: str) -> None: - super().__init__(f"Step {step_id} cannot be executed and task is terminated. Reason: {reason}") + super().__init__(f"Step {step_id} cannot be executed and task is failed. Reason: {reason}") + + +class StepUnableToExecuteError(SkyvernException): + def __init__(self, step_id: str, reason: str) -> None: + super().__init__(f"Step {step_id} cannot be executed and task execution is stopped. Reason: {reason}") class UnsupportedActionType(SkyvernException): diff --git a/skyvern/forge/agent.py b/skyvern/forge/agent.py index c7aac774..4c6bb5d1 100644 --- a/skyvern/forge/agent.py +++ b/skyvern/forge/agent.py @@ -18,6 +18,7 @@ from skyvern.exceptions import ( InvalidWorkflowTaskURLState, MissingBrowserStatePage, StepTerminationError, + StepUnableToExecuteError, TaskNotFound, ) from skyvern.forge import app @@ -328,9 +329,16 @@ class ForgeAgent: return step, detailed_output, next_step # TODO (kerem): Let's add other exceptions that we know about here as custom exceptions as well + except StepUnableToExecuteError: + LOG.error( + "Step cannot be executed. Task execution stopped", + task_id=task.task_id, + step_id=step.step_id, + ) + raise except StepTerminationError as e: LOG.error( - "Step cannot be executed. Task terminated", + "Step cannot be executed. Task failed.", task_id=task.task_id, step_id=step.step_id, ) diff --git a/skyvern/forge/agent_functions.py b/skyvern/forge/agent_functions.py index cc51a561..9e704ffa 100644 --- a/skyvern/forge/agent_functions.py +++ b/skyvern/forge/agent_functions.py @@ -1,6 +1,6 @@ from playwright.async_api import Page -from skyvern.exceptions import StepTerminationError +from skyvern.exceptions import StepUnableToExecuteError from skyvern.forge import app from skyvern.forge.async_operations import AsyncOperation from skyvern.forge.sdk.models import Organization, Step, StepStatus @@ -34,7 +34,7 @@ class AgentFunction: can_execute = has_valid_task_status and has_valid_step_status and has_no_running_steps if not can_execute: - raise StepTerminationError(step_id=step.step_id, reason="Cannot execute step. Reasons: {reasons}") + raise StepUnableToExecuteError(step_id=step.step_id, reason=f"Cannot execute step. Reasons: {reasons}") def generate_async_operations( self,