22from typing import Any
33
44import httpx
5+ import structlog
6+ from dotenv import load_dotenv
57from httpx import ASGITransport
68
79from skyvern .config import settings
8- from skyvern .forge .api_app import create_api_app
10+ from skyvern .forge .api_app import create_api_app , create_fast_api_app
11+ from skyvern .forge .forge_app_initializer import setup_local_organization , start_forge_app
912from skyvern .forge .sdk .api .llm .config_registry import LLMConfigRegistry
1013from skyvern .forge .sdk .api .llm .models import LLMConfig , LLMRouterConfig
14+ from skyvern .forge .sdk .db .client import AgentDB
15+
16+ LOG = structlog .get_logger ()
1117
1218
1319def create_embedded_server (
1420 llm_config : LLMRouterConfig | LLMConfig | None = None ,
1521 settings_overrides : dict [str , Any ] | None = None ,
22+ use_in_memory_db : bool = False ,
1623) -> httpx .AsyncClient :
1724 class EmbeddedServerTransport (httpx .AsyncBaseTransport ):
1825 def __init__ (self ) -> None :
@@ -21,6 +28,8 @@ def __init__(self) -> None:
2128
2229 async def handle_async_request (self , request : httpx .Request ) -> httpx .Response :
2330 if self ._transport is None :
31+ load_dotenv (".env" )
32+
2433 settings .BROWSER_LOGS_ENABLED = False
2534
2635 if llm_config :
@@ -38,10 +47,28 @@ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
3847 else :
3948 raise ValueError (f"Invalid setting: { key } " )
4049
41- self ._api_key = os .getenv ("SKYVERN_API_KEY" )
42- if not self ._api_key :
43- raise ValueError ("SKYVERN_API_KEY is not set. Provide api_key or set SKYVERN_API_KEY in .env file." )
44- api_app = create_api_app ()
50+ if use_in_memory_db :
51+ from sqlalchemy .ext .asyncio import create_async_engine # noqa: PLC0415
52+
53+ from skyvern .forge .sdk .db .models import Base # noqa: PLC0415
54+
55+ settings .DATABASE_STRING = "sqlite+aiosqlite:///:memory:"
56+ engine = create_async_engine (settings .DATABASE_STRING )
57+ async with engine .begin () as conn :
58+ await conn .run_sync (Base .metadata .create_all )
59+
60+ db = AgentDB (settings .DATABASE_STRING , debug_enabled = settings .DEBUG_MODE , db_engine = engine )
61+ forge_app_instance = start_forge_app (db )
62+ api_app = create_fast_api_app (forge_app_instance )
63+ self ._api_key = await setup_local_organization ()
64+ LOG .info ("Embedded server initialized with in-memory database" )
65+ else :
66+ self ._api_key = os .getenv ("SKYVERN_API_KEY" )
67+ if not self ._api_key :
68+ raise ValueError (
69+ "SKYVERN_API_KEY is not set. Provide api_key or set SKYVERN_API_KEY in .env file."
70+ )
71+ api_app = create_api_app ()
4572
4673 self ._transport = ASGITransport (app = api_app )
4774
0 commit comments