diff --git a/skyvern/exceptions.py b/skyvern/exceptions.py index 4d14f7b1..49eaeb05 100644 --- a/skyvern/exceptions.py +++ b/skyvern/exceptions.py @@ -777,8 +777,8 @@ class LLMCallerNotFoundError(SkyvernException): class BrowserSessionAlreadyOccupiedError(SkyvernHTTPException): - def __init__(self, browser_session_id: str) -> None: - super().__init__(f"Browser session {browser_session_id} is already occupied") + def __init__(self, browser_session_id: str, runnable_id: str) -> None: + super().__init__(f"Browser session {browser_session_id} is already occupied by {runnable_id}") class BrowserSessionNotRenewable(SkyvernException): diff --git a/skyvern/forge/sdk/workflow/service.py b/skyvern/forge/sdk/workflow/service.py index 69b5639a..a9d17b54 100644 --- a/skyvern/forge/sdk/workflow/service.py +++ b/skyvern/forge/sdk/workflow/service.py @@ -21,6 +21,7 @@ from skyvern.constants import GET_DOWNLOADED_FILES_TIMEOUT, SAVE_DOWNLOADED_FILE from skyvern.exceptions import ( BlockNotFound, BrowserProfileNotFound, + BrowserSessionAlreadyOccupiedError, BrowserSessionNotFound, CannotUpdateWorkflowDueToCodeCache, FailedToSendWebhook, @@ -404,6 +405,27 @@ class WorkflowService: workflow_request.proxy_location = workflow.proxy_location if workflow_request.webhook_callback_url is None and workflow.webhook_callback_url is not None: workflow_request.webhook_callback_url = workflow.webhook_callback_url + + if workflow_request.browser_session_id: + persistent_browser_session = await app.DATABASE.get_persistent_browser_session( + workflow_request.browser_session_id, organization.organization_id + ) + if persistent_browser_session is None: + LOG.warning( + "Failed to create workflow run, browser sesssion not found", + browser_session_id=workflow_request.browser_session_id, + ) + raise BrowserSessionNotFound(workflow_request.browser_session_id) + + if persistent_browser_session.runnable_id: + LOG.warning( + "Failed to create workflow run, browser session is already occupied", + browser_session_id=workflow_request.browser_session_id, + ) + raise BrowserSessionAlreadyOccupiedError( + workflow_request.browser_session_id, persistent_browser_session.runnable_id + ) + # Create the workflow run and set skyvern context workflow_run = await self.create_workflow_run( workflow_request=workflow_request,