Files
Dorod-Sky/skyvern/forge/sdk/routes/browser_sessions.py
2025-09-29 09:29:47 -04:00

188 lines
7.0 KiB
Python

import asyncio
from fastapi import Depends, HTTPException, Path, Query
from fastapi.responses import ORJSONResponse
from skyvern import analytics
from skyvern.forge import app
from skyvern.forge.sdk.routes.code_samples import (
CLOSE_BROWSER_SESSION_CODE_SAMPLE,
CREATE_BROWSER_SESSION_CODE_SAMPLE,
GET_BROWSER_SESSION_CODE_SAMPLE,
GET_BROWSER_SESSIONS_CODE_SAMPLE,
)
from skyvern.forge.sdk.routes.routers import base_router
from skyvern.forge.sdk.schemas.organizations import Organization
from skyvern.forge.sdk.services import org_auth_service
from skyvern.schemas.browser_sessions import CreateBrowserSessionRequest
from skyvern.webeye.schemas import BrowserSessionResponse
@base_router.get(
"/browser_sessions/history",
include_in_schema=False,
)
@base_router.get(
"/browser_sessions/history/",
include_in_schema=False,
)
async def get_browser_sessions_all(
current_org: Organization = Depends(org_auth_service.get_current_org),
page: int = Query(1, ge=1, description="Page number for pagination"),
page_size: int = Query(10, ge=1, le=100, description="Number of items per page"),
) -> list[BrowserSessionResponse]:
"""Get all browser sessions for the organization"""
analytics.capture("skyvern-oss-agent-browser-sessions-get-all")
browser_sessions = await app.DATABASE.get_persistent_browser_sessions_history(
current_org.organization_id,
page=page,
page_size=page_size,
)
responses = await asyncio.gather(
*[
BrowserSessionResponse.from_browser_session(browser_session, app.STORAGE)
for browser_session in browser_sessions
]
)
return responses
@base_router.post(
"/browser_sessions",
response_model=BrowserSessionResponse,
tags=["Browser Sessions"],
openapi_extra={
"x-fern-sdk-method-name": "create_browser_session",
"x-fern-examples": [{"code-samples": [{"sdk": "python", "code": CREATE_BROWSER_SESSION_CODE_SAMPLE}]}],
},
description="Create a browser session that persists across multiple runs",
summary="Create a session",
responses={
200: {"description": "Successfully created browser session"},
403: {"description": "Unauthorized - Invalid or missing authentication"},
},
)
@base_router.post(
"/browser_sessions/",
response_model=BrowserSessionResponse,
include_in_schema=False,
)
async def create_browser_session(
browser_session_request: CreateBrowserSessionRequest,
current_org: Organization = Depends(org_auth_service.get_current_org),
) -> BrowserSessionResponse:
browser_session = await app.PERSISTENT_SESSIONS_MANAGER.create_session(
organization_id=current_org.organization_id,
timeout_minutes=browser_session_request.timeout,
proxy_location=browser_session_request.proxy_location,
)
return await BrowserSessionResponse.from_browser_session(browser_session)
@base_router.post(
"/browser_sessions/{browser_session_id}/close",
tags=["Browser Sessions"],
openapi_extra={
"x-fern-sdk-method-name": "close_browser_session",
"x-fern-examples": [{"code-samples": [{"sdk": "python", "code": CLOSE_BROWSER_SESSION_CODE_SAMPLE}]}],
},
description="Close a session. Once closed, the session cannot be used again.",
summary="Close a session",
responses={
200: {"description": "Successfully closed browser session"},
403: {"description": "Unauthorized - Invalid or missing authentication"},
},
)
@base_router.post(
"/browser_sessions/{browser_session_id}/close/",
include_in_schema=False,
)
async def close_browser_session(
browser_session_id: str = Path(
...,
description="The ID of the browser session to close. completed_at will be set when the browser session is closed. browser_session_id starts with `pbs_`",
examples=["pbs_123456"],
),
current_org: Organization = Depends(org_auth_service.get_current_org),
) -> ORJSONResponse:
await app.PERSISTENT_SESSIONS_MANAGER.close_session(current_org.organization_id, browser_session_id)
return ORJSONResponse(
content={"message": "Browser session closed"},
status_code=200,
media_type="application/json",
)
@base_router.get(
"/browser_sessions/{browser_session_id}",
response_model=BrowserSessionResponse,
tags=["Browser Sessions"],
openapi_extra={
"x-fern-sdk-method-name": "get_browser_session",
"x-fern-examples": [{"code-samples": [{"sdk": "python", "code": GET_BROWSER_SESSION_CODE_SAMPLE}]}],
},
description="Get details about a specific browser session, including the browser address for cdp connection.",
summary="Get a session",
responses={
200: {"description": "Successfully retrieved browser session details"},
404: {"description": "Browser session not found"},
403: {"description": "Unauthorized - Invalid or missing authentication"},
},
)
@base_router.get(
"/browser_sessions/{browser_session_id}/",
response_model=BrowserSessionResponse,
include_in_schema=False,
)
async def get_browser_session(
browser_session_id: str = Path(
..., description="The ID of the browser session. browser_session_id starts with `pbs_`", examples=["pbs_123456"]
),
current_org: Organization = Depends(org_auth_service.get_current_org),
) -> BrowserSessionResponse:
analytics.capture("skyvern-oss-agent-browser-session-get")
browser_session = await app.PERSISTENT_SESSIONS_MANAGER.get_session(
browser_session_id,
current_org.organization_id,
)
if not browser_session:
raise HTTPException(status_code=404, detail=f"Browser session {browser_session_id} not found")
return await BrowserSessionResponse.from_browser_session(browser_session, app.STORAGE)
@base_router.get(
"/browser_sessions",
response_model=list[BrowserSessionResponse],
tags=["Browser Sessions"],
openapi_extra={
"x-fern-sdk-method-name": "get_browser_sessions",
"x-fern-examples": [{"code-samples": [{"sdk": "python", "code": GET_BROWSER_SESSIONS_CODE_SAMPLE}]}],
},
description="Get all active browser sessions for the organization",
summary="Get active browser sessions",
responses={
200: {"description": "Successfully retrieved all active browser sessions"},
403: {"description": "Unauthorized - Invalid or missing authentication"},
},
)
@base_router.get(
"/browser_sessions/",
response_model=list[BrowserSessionResponse],
include_in_schema=False,
)
async def get_browser_sessions(
current_org: Organization = Depends(org_auth_service.get_current_org),
) -> list[BrowserSessionResponse]:
"""Get all active browser sessions for the organization"""
analytics.capture("skyvern-oss-agent-browser-sessions-get")
browser_sessions = await app.PERSISTENT_SESSIONS_MANAGER.get_active_sessions(current_org.organization_id)
return await asyncio.gather(
*[
BrowserSessionResponse.from_browser_session(browser_session, app.STORAGE)
for browser_session in browser_sessions
]
)