From a902fa7a6e77d4d2d3177e99862b2f4a146c80c7 Mon Sep 17 00:00:00 2001 From: Stanislav Novosad Date: Fri, 12 Dec 2025 17:59:01 -0700 Subject: [PATCH] Add app.REPLICA_DATABASE (#4289) --- skyvern/config.py | 1 + skyvern/forge/forge_app.py | 9 ++++++++- skyvern/forge/sdk/db/{client.py => agent_db.py} | 0 .../forge/sdk/db/{client_test.py => agent_db_test.py} | 2 +- skyvern/forge/sdk/db/polls.py | 2 +- skyvern/forge/sdk/services/org_auth_service.py | 2 +- skyvern/webeye/persistent_sessions_manager.py | 2 +- 7 files changed, 13 insertions(+), 5 deletions(-) rename skyvern/forge/sdk/db/{client.py => agent_db.py} (100%) rename skyvern/forge/sdk/db/{client_test.py => agent_db_test.py} (97%) diff --git a/skyvern/config.py b/skyvern/config.py index bbf1dad7..dc9d1a6e 100644 --- a/skyvern/config.py +++ b/skyvern/config.py @@ -59,6 +59,7 @@ class Settings(BaseSettings): if platform.system() == "Windows" else "postgresql+psycopg://skyvern@localhost/skyvern" ) + DATABASE_REPLICA_STRING: str | None = None DATABASE_STATEMENT_TIMEOUT_MS: int = 60000 DISABLE_CONNECTION_POOL: bool = False PROMPT_ACTION_HISTORY_WINDOW: int = 1 diff --git a/skyvern/forge/forge_app.py b/skyvern/forge/forge_app.py index 69ad945e..3eda358e 100644 --- a/skyvern/forge/forge_app.py +++ b/skyvern/forge/forge_app.py @@ -21,7 +21,7 @@ from skyvern.forge.sdk.artifact.storage.factory import StorageFactory from skyvern.forge.sdk.artifact.storage.s3 import S3Storage from skyvern.forge.sdk.cache.base import BaseCache from skyvern.forge.sdk.cache.factory import CacheFactory -from skyvern.forge.sdk.db.client import AgentDB +from skyvern.forge.sdk.db.agent_db import AgentDB from skyvern.forge.sdk.experimentation.providers import BaseExperimentationProvider, NoOpExperimentationProvider from skyvern.forge.sdk.schemas.credentials import CredentialVaultType from skyvern.forge.sdk.schemas.organizations import AzureClientSecretCredential, Organization @@ -44,6 +44,7 @@ class ForgeApp: SETTINGS_MANAGER: Settings DATABASE: AgentDB + REPLICA_DATABASE: AgentDB STORAGE: BaseStorage CACHE: BaseCache ARTIFACT_MANAGER: ArtifactManager @@ -93,6 +94,12 @@ def create_forge_app() -> ForgeApp: app.SETTINGS_MANAGER = settings app.DATABASE = AgentDB(settings.DATABASE_STRING, debug_enabled=settings.DEBUG_MODE) + + if settings.DATABASE_REPLICA_STRING and settings.DATABASE_REPLICA_STRING != settings.DATABASE_STRING: + app.REPLICA_DATABASE = AgentDB(settings.DATABASE_REPLICA_STRING, debug_enabled=settings.DEBUG_MODE) + else: + app.REPLICA_DATABASE = app.DATABASE + if settings.SKYVERN_STORAGE_TYPE == "s3": StorageFactory.set_storage(S3Storage()) app.STORAGE = StorageFactory.get_storage() diff --git a/skyvern/forge/sdk/db/client.py b/skyvern/forge/sdk/db/agent_db.py similarity index 100% rename from skyvern/forge/sdk/db/client.py rename to skyvern/forge/sdk/db/agent_db.py diff --git a/skyvern/forge/sdk/db/client_test.py b/skyvern/forge/sdk/db/agent_db_test.py similarity index 97% rename from skyvern/forge/sdk/db/client_test.py rename to skyvern/forge/sdk/db/agent_db_test.py index 870fc350..94c551bf 100644 --- a/skyvern/forge/sdk/db/client_test.py +++ b/skyvern/forge/sdk/db/agent_db_test.py @@ -4,7 +4,7 @@ import pytest import pytest_asyncio from sqlalchemy.ext.asyncio import create_async_engine -from skyvern.forge.sdk.db.client import AgentDB +from skyvern.forge.sdk.db.agent_db import AgentDB from skyvern.forge.sdk.db.models import Base diff --git a/skyvern/forge/sdk/db/polls.py b/skyvern/forge/sdk/db/polls.py index 9f9634f3..1293aaea 100644 --- a/skyvern/forge/sdk/db/polls.py +++ b/skyvern/forge/sdk/db/polls.py @@ -2,7 +2,7 @@ import asyncio from structlog import get_logger -from skyvern.forge.sdk.db.client import AgentDB +from skyvern.forge.sdk.db.agent_db import AgentDB from skyvern.forge.sdk.schemas.persistent_browser_sessions import PersistentBrowserSession LOG = get_logger(__name__) diff --git a/skyvern/forge/sdk/services/org_auth_service.py b/skyvern/forge/sdk/services/org_auth_service.py index 68a10ef1..fd3e2fad 100644 --- a/skyvern/forge/sdk/services/org_auth_service.py +++ b/skyvern/forge/sdk/services/org_auth_service.py @@ -13,7 +13,7 @@ from pydantic import ValidationError from skyvern.config import settings from skyvern.forge import app from skyvern.forge.sdk.core import skyvern_context -from skyvern.forge.sdk.db.client import AgentDB +from skyvern.forge.sdk.db.agent_db import AgentDB from skyvern.forge.sdk.models import TokenPayload from skyvern.forge.sdk.schemas.organizations import Organization, OrganizationAuthToken, OrganizationAuthTokenType diff --git a/skyvern/webeye/persistent_sessions_manager.py b/skyvern/webeye/persistent_sessions_manager.py index 01da90e8..d07dae6e 100644 --- a/skyvern/webeye/persistent_sessions_manager.py +++ b/skyvern/webeye/persistent_sessions_manager.py @@ -9,7 +9,7 @@ from playwright._impl._errors import TargetClosedError from skyvern.config import settings from skyvern.exceptions import BrowserSessionNotRenewable, MissingBrowserAddressError -from skyvern.forge.sdk.db.client import AgentDB +from skyvern.forge.sdk.db.agent_db import AgentDB from skyvern.forge.sdk.db.polls import wait_on_persistent_browser_address from skyvern.forge.sdk.schemas.persistent_browser_sessions import ( PersistentBrowserSession,