From 285694cefe722d0e708294ddbe769a600f4f8ba3 Mon Sep 17 00:00:00 2001 From: Jonathan Dobson Date: Tue, 25 Nov 2025 14:18:15 -0500 Subject: [PATCH] Browser streaming: add more verification checks for browser session (#4094) --- skyvern/forge/sdk/routes/streaming/verify.py | 32 ++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/skyvern/forge/sdk/routes/streaming/verify.py b/skyvern/forge/sdk/routes/streaming/verify.py index 474155a3..d5f63790 100644 --- a/skyvern/forge/sdk/routes/streaming/verify.py +++ b/skyvern/forge/sdk/routes/streaming/verify.py @@ -17,13 +17,13 @@ from __future__ import annotations import asyncio import typing as t -from datetime import datetime +from datetime import datetime, timedelta import structlog from skyvern.config import settings from skyvern.forge import app -from skyvern.forge.sdk.schemas.persistent_browser_sessions import AddressablePersistentBrowserSession +from skyvern.forge.sdk.schemas.persistent_browser_sessions import AddressablePersistentBrowserSession, is_final_status from skyvern.forge.sdk.schemas.tasks import Task, TaskStatus from skyvern.forge.sdk.workflow.models.workflow import WorkflowRun, WorkflowRunStatus @@ -67,6 +67,34 @@ async def verify_browser_session( ) return None + if is_final_status(browser_session.status): + LOG.info( + "Browser session is invalid, as it is in a final state.", + browser_session_status=browser_session.status, + browser_session_id=browser_session_id, + organization_id=organization_id, + ) + return None + + started_at = browser_session.started_at + timeout_minutes = browser_session.timeout_minutes + + if started_at and timeout_minutes: + current_time = datetime.utcnow() + times_out_at = started_at + timedelta(minutes=timeout_minutes) + + if current_time > times_out_at: + LOG.info( + "Browser session invalid, as it has timed out, but is still in a non-final status. This is likely a bug!", + browser_session_id=browser_session_id, + organization_id=organization_id, + timeout_minutes=timeout_minutes, + started_at=started_at.isoformat(), + now=current_time.isoformat(), + times_out_at=times_out_at.isoformat(), + ) + return None + browser_address = browser_session.browser_address if not browser_address: