From 87decd6b77d29675a81e1412d7f8882996848e00 Mon Sep 17 00:00:00 2001 From: LawyZheng Date: Fri, 17 Oct 2025 18:24:13 +0800 Subject: [PATCH] terminate self and reclaim when claim failed (#3753) --- .../schemas/persistent_browser_sessions.py | 17 ++++++++++++- skyvern/webeye/persistent_sessions_manager.py | 24 +++++++++++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/skyvern/forge/sdk/schemas/persistent_browser_sessions.py b/skyvern/forge/sdk/schemas/persistent_browser_sessions.py index 43c1f7c8..f1a98d1d 100644 --- a/skyvern/forge/sdk/schemas/persistent_browser_sessions.py +++ b/skyvern/forge/sdk/schemas/persistent_browser_sessions.py @@ -1,10 +1,25 @@ from datetime import datetime +from enum import StrEnum from pydantic import BaseModel, ConfigDict from skyvern.schemas.runs import ProxyLocation -FINAL_STATUSES = ("completed", "failed") + +class PersistentBrowserSessionStatus(StrEnum): + created = "created" + running = "running" + failed = "failed" + completed = "completed" + timeout = "timeout" + retry = "retry" + + +FINAL_STATUSES = ( + PersistentBrowserSessionStatus.completed, + PersistentBrowserSessionStatus.failed, + PersistentBrowserSessionStatus.timeout, +) def is_final_status(status: str | None) -> bool: diff --git a/skyvern/webeye/persistent_sessions_manager.py b/skyvern/webeye/persistent_sessions_manager.py index f85a7c7d..9e42b421 100644 --- a/skyvern/webeye/persistent_sessions_manager.py +++ b/skyvern/webeye/persistent_sessions_manager.py @@ -11,7 +11,11 @@ from skyvern.config import settings from skyvern.exceptions import BrowserSessionNotRenewable, MissingBrowserAddressError from skyvern.forge.sdk.db.client import AgentDB from skyvern.forge.sdk.db.polls import wait_on_persistent_browser_address -from skyvern.forge.sdk.schemas.persistent_browser_sessions import PersistentBrowserSession, is_final_status +from skyvern.forge.sdk.schemas.persistent_browser_sessions import ( + PersistentBrowserSession, + PersistentBrowserSessionStatus, + is_final_status, +) from skyvern.schemas.runs import ProxyLocation from skyvern.webeye.browser_factory import BrowserState @@ -61,13 +65,19 @@ async def validate_session_for_renewal( ) raise BrowserSessionNotRenewable("Browser session has not started yet", session_id) - if browser_session.status != "created": + if browser_session.status not in [ + PersistentBrowserSessionStatus.created, + PersistentBrowserSessionStatus.retry, + PersistentBrowserSessionStatus.running, + ]: LOG.warning( - "Attempted to renew browser session that is not in the 'created' state", + "Attempted to renew browser session that is not in the 'created', 'retry' or 'running' state", browser_session_id=session_id, organization_id=organization_id, ) - raise BrowserSessionNotRenewable("Browser session is not in the 'created' state", session_id) + raise BrowserSessionNotRenewable( + "Browser session is not in the 'created', 'retry' or 'running' state", session_id + ) started_at_utc = ( browser_session.started_at.replace(tzinfo=timezone.utc) @@ -141,6 +151,12 @@ async def update_status( ) return None + LOG.info( + "Updating browser session status", + browser_session_id=session_id, + organization_id=organization_id, + browser_status=status, + ) persistent_browser_session = await db.update_persistent_browser_session( session_id, status=status,