diff --git a/skyvern-frontend/.env.example b/skyvern-frontend/.env.example index 8a74ebe1..04c2aec8 100644 --- a/skyvern-frontend/.env.example +++ b/skyvern-frontend/.env.example @@ -12,3 +12,6 @@ VITE_SKYVERN_API_KEY=YOUR_API_KEY # Enable recording skyvern logs as artifacts VITE_ENABLE_LOG_ARTIFACTS=false + +# Enable code block node +VITE_ENABLE_CODE_BLOCK=false diff --git a/skyvern/forge/sdk/workflow/exceptions.py b/skyvern/forge/sdk/workflow/exceptions.py index 14cbe663..1f485af0 100644 --- a/skyvern/forge/sdk/workflow/exceptions.py +++ b/skyvern/forge/sdk/workflow/exceptions.py @@ -139,3 +139,10 @@ class InsecureCodeDetected(SkyvernException): super().__init__( f"Insecure code detected. Reason: {msg}", ) + + +class CustomizedCodeException(SkyvernException): + def __init__(self, exception: Exception) -> None: + super().__init__( + f"Failed to execute code block. Reason: {exception.__class__.__name__}: {str(exception)}", + ) diff --git a/skyvern/forge/sdk/workflow/models/block.py b/skyvern/forge/sdk/workflow/models/block.py index 73d38ee1..19387b92 100644 --- a/skyvern/forge/sdk/workflow/models/block.py +++ b/skyvern/forge/sdk/workflow/models/block.py @@ -56,6 +56,7 @@ from skyvern.forge.sdk.schemas.task_v2 import TaskV2Status from skyvern.forge.sdk.schemas.tasks import Task, TaskOutput, TaskStatus from skyvern.forge.sdk.workflow.context_manager import BlockMetadata, WorkflowRunContext from skyvern.forge.sdk.workflow.exceptions import ( + CustomizedCodeException, FailedToFormatJinjaStyleParameter, InsecureCodeDetected, InvalidEmailClientConfiguration, @@ -1251,7 +1252,19 @@ async def wrapper(): ) user_function = self.generate_async_user_function(self.code, page, parameter_values) - result = await user_function() + try: + result = await user_function() + except Exception as e: + exc = CustomizedCodeException(e) + return await self.build_block_result( + success=False, + failure_reason=exc.message, + output_parameter_value=None, + status=BlockStatus.failed, + workflow_run_block_id=workflow_run_block_id, + organization_id=organization_id, + ) + result = json.loads( json.dumps(result, default=lambda value: f"Object '{type(value)}' is not JSON serializable") )