Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=""
)
Expand Down
21 changes: 18 additions & 3 deletions app/daytona/sandbox.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import time

from daytona import (
from daytona_sdk import (
CreateSandboxFromImageParams,
Daytona,
DaytonaConfig,
Expand Down Expand Up @@ -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}")

Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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:
Expand Down
8 changes: 6 additions & 2 deletions app/daytona/tool_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
4 changes: 3 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ 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
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
Expand All @@ -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
Expand Down