diff --git a/app/config.py b/app/config.py index a881e2a5e..0a571f1a3 100644 --- a/app/config.py +++ b/app/config.py @@ -106,7 +106,7 @@ class SandboxSettings(BaseModel): class DaytonaSettings(BaseModel): - daytona_api_key: str + daytona_api_key: Optional[str] = None daytona_server_url: Optional[str] = Field( "https://app.daytona.io/api", description="" ) diff --git a/app/daytona/sandbox.py b/app/daytona/sandbox.py index 8970b9cef..284361a77 100644 --- a/app/daytona/sandbox.py +++ b/app/daytona/sandbox.py @@ -1,6 +1,6 @@ import time -from daytona import ( +from daytona_sdk import ( CreateSandboxFromImageParams, Daytona, DaytonaConfig, @@ -38,12 +38,20 @@ else: logger.warning("No Daytona target found in environment variables") -daytona = Daytona(daytona_config) -logger.info("Daytona client initialized") +# Only initialize Daytona if API key is provided +if daytona_config.api_key: + daytona = Daytona(daytona_config) + logger.info("Daytona client initialized") +else: + daytona = None + logger.info("Daytona client not initialized (no API key provided)") async def get_or_start_sandbox(sandbox_id: str): """Retrieve a sandbox by ID, check its state, and start it if needed.""" + + if daytona is None: + raise RuntimeError("Daytona client is not initialized. Please provide a Daytona API key.") logger.info(f"Getting or starting sandbox with ID: {sandbox_id}") @@ -101,6 +109,9 @@ def start_supervisord_session(sandbox: Sandbox): def create_sandbox(password: str, project_id: str = None): """Create a new sandbox with all required services configured and running.""" + + if daytona is None: + raise RuntimeError("Daytona client is not initialized. Please provide a Daytona API key.") logger.info("Creating new Daytona sandbox environment") logger.info("Configuring sandbox with browser-use image and environment variables") @@ -149,6 +160,10 @@ def create_sandbox(password: str, project_id: str = None): async def delete_sandbox(sandbox_id: str): """Delete a sandbox by its ID.""" + + if daytona is None: + raise RuntimeError("Daytona client is not initialized. Please provide a Daytona API key.") + logger.info(f"Deleting sandbox with ID: {sandbox_id}") try: diff --git a/app/daytona/tool_base.py b/app/daytona/tool_base.py index 043578a9a..07ba4d561 100644 --- a/app/daytona/tool_base.py +++ b/app/daytona/tool_base.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import Any, ClassVar, Dict, Optional -from daytona import Daytona, DaytonaConfig, Sandbox, SandboxState +from daytona_sdk import Daytona, DaytonaConfig, Sandbox, SandboxState from pydantic import Field from app.config import config @@ -19,7 +19,11 @@ server_url=daytona_settings.daytona_server_url, target=daytona_settings.daytona_target, ) -daytona = Daytona(daytona_config) +# Only initialize Daytona if API key is provided +if daytona_config.api_key: + daytona = Daytona(daytona_config) +else: + daytona = None @dataclass diff --git a/requirements.txt b/requirements.txt index aa7e6dc93..a6ae1822d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ openai~=1.66.3 tenacity~=9.0.0 pyyaml~=6.0.2 loguru~=0.7.3 +structlog~=25.5.0 numpy datasets~=3.4.1 fastapi~=0.115.11 @@ -10,7 +11,7 @@ tiktoken~=0.9.0 html2text~=2024.2.26 gymnasium~=1.1.1 -pillow~=11.1.0 +pillow~=10.4.0 browsergym~=0.13.3 uvicorn~=0.34.0 unidiff~=0.7.5 @@ -27,6 +28,7 @@ playwright~=1.51.0 docker~=7.1.0 pytest~=8.3.5 pytest-asyncio~=0.25.3 +daytona-sdk~=0.119.0 mcp~=1.5.0 httpx>=0.27.0