[SKY-6974] Browser Profiles [2/3] Marc/backend browser session profiles (#3923)

This commit is contained in:
Marc Kelechava
2025-11-06 01:24:39 -08:00
committed by GitHub
parent f0172a22df
commit 3db5ec6cd7
24 changed files with 662 additions and 27 deletions

View File

@@ -20,6 +20,7 @@ from skyvern.config import settings
from skyvern.constants import GET_DOWNLOADED_FILES_TIMEOUT, SAVE_DOWNLOADED_FILES_TIMEOUT
from skyvern.exceptions import (
BlockNotFound,
BrowserProfileNotFound,
BrowserSessionNotFound,
CannotUpdateWorkflowDueToCodeCache,
FailedToSendWebhook,
@@ -540,6 +541,7 @@ class WorkflowService:
)
workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id, organization_id=organization_id)
workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id=workflow_run.workflow_permanent_id)
browser_profile_id = workflow_run.browser_profile_id
close_browser_on_completion = browser_session_id is None and not workflow_run.browser_address
# Set workflow run status to running, create workflow run parameters
@@ -608,12 +610,14 @@ class WorkflowService:
)
return workflow_run
browser_session = await self.auto_create_browser_session_if_needed(
organization.organization_id,
workflow,
browser_session_id=browser_session_id,
proxy_location=workflow_run.proxy_location,
)
browser_session = None
if not browser_profile_id:
browser_session = await self.auto_create_browser_session_if_needed(
organization.organization_id,
workflow,
browser_session_id=browser_session_id,
proxy_location=workflow_run.proxy_location,
)
if browser_session:
browser_session_id = browser_session.persistent_browser_session_id
@@ -640,6 +644,7 @@ class WorkflowService:
workflow_run=workflow_run,
organization=organization,
browser_session_id=browser_session_id,
browser_profile_id=browser_profile_id,
block_labels=block_labels,
block_outputs=block_outputs,
workflow_script=workflow_script,
@@ -688,6 +693,7 @@ class WorkflowService:
workflow_run: WorkflowRun,
organization: Organization,
browser_session_id: str | None = None,
browser_profile_id: str | None = None,
block_labels: list[str] | None = None,
block_outputs: dict[str, Any] | None = None,
workflow_script: WorkflowScript | None = None,
@@ -1669,7 +1675,7 @@ class WorkflowService:
debug_session_id: str | None = None,
code_gen: bool | None = None,
) -> WorkflowRun:
# validate the browser session id
# validate the browser session or profile id
if workflow_request.browser_session_id:
browser_session = await app.DATABASE.get_persistent_browser_session(
session_id=workflow_request.browser_session_id,
@@ -1678,11 +1684,23 @@ class WorkflowService:
if not browser_session:
raise BrowserSessionNotFound(browser_session_id=workflow_request.browser_session_id)
if workflow_request.browser_profile_id:
browser_profile = await app.DATABASE.get_browser_profile(
workflow_request.browser_profile_id,
organization_id=organization_id,
)
if not browser_profile:
raise BrowserProfileNotFound(
profile_id=workflow_request.browser_profile_id,
organization_id=organization_id,
)
return await app.DATABASE.create_workflow_run(
workflow_permanent_id=workflow_permanent_id,
workflow_id=workflow_id,
organization_id=organization_id,
browser_session_id=workflow_request.browser_session_id,
browser_profile_id=workflow_request.browser_profile_id,
proxy_location=workflow_request.proxy_location,
webhook_callback_url=workflow_request.webhook_callback_url,
totp_verification_url=workflow_request.totp_verification_url,
@@ -2224,6 +2242,7 @@ class WorkflowService:
total_cost=total_cost,
workflow_title=workflow.title,
browser_session_id=workflow_run.browser_session_id,
browser_profile_id=workflow_run.browser_profile_id,
max_screenshot_scrolls=workflow_run.max_screenshot_scrolls,
task_v2=task_v2,
browser_address=workflow_run.browser_address,