diff --git a/backend/poetry.lock b/backend/poetry.lock index dbf884d8..6624876e 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -551,14 +551,14 @@ files = [ [[package]] name = "daytona-api-client" -version = "0.20.1" +version = "0.21.0a1" description = "Daytona" optional = false python-versions = "*" groups = ["main", "dev"] files = [ - {file = "daytona_api_client-0.20.1-py3-none-any.whl", hash = "sha256:4d5023108013365eba76bd0bd4704f30dee54c13e2ac5b62e8c88bcd4af5db92"}, - {file = "daytona_api_client-0.20.1.tar.gz", hash = "sha256:ff2061f7e7dc9c935a9087216600be277cb9cf6b8c1eecdfe333ef30d6b208fd"}, + {file = "daytona_api_client-0.21.0a1-py3-none-any.whl", hash = "sha256:a81862114e710f0fcce71a9a700790dda2900f2344f7d286f3504814057697c1"}, + {file = "daytona_api_client-0.21.0a1.tar.gz", hash = "sha256:40e9c862a6a8d142e88422b17837fd3cb3d14a376412bf11109b2b2effacf1c9"}, ] [package.dependencies] @@ -569,14 +569,14 @@ urllib3 = ">=1.25.3,<3.0.0" [[package]] name = "daytona-api-client-async" -version = "0.20.1" +version = "0.21.0a1" description = "Daytona" optional = false python-versions = "*" groups = ["main", "dev"] files = [ - {file = "daytona_api_client_async-0.20.1-py3-none-any.whl", hash = "sha256:f24e06e3ab6e554214ed064f1b4c8723356c76c14c69de9a73a6cad60a386127"}, - {file = "daytona_api_client_async-0.20.1.tar.gz", hash = "sha256:043045cb173b0b53416c19a9e276124a5c4fe14209f409a8572ef1975240e53f"}, + {file = "daytona_api_client_async-0.21.0a1-py3-none-any.whl", hash = "sha256:d5944b5f003811a6274a4ca0f13f934789afc9fe6e6aadcf1a6f33b723eda8b5"}, + {file = "daytona_api_client_async-0.21.0a1.tar.gz", hash = "sha256:cd5204905687bb5d690e933476dd67ed1e04b994d9362be4d158ab5af41d0b65"}, ] [package.dependencies] @@ -589,14 +589,14 @@ urllib3 = ">=1.25.3,<3.0.0" [[package]] name = "daytona-sdk" -version = "0.20.2" +version = "0.21.0a4" description = "Python SDK for Daytona" optional = false python-versions = ">=3.7" groups = ["main", "dev"] files = [ - {file = "daytona_sdk-0.20.2-py3-none-any.whl", hash = "sha256:ec83c6aeb1a712904ebdfc8f56dab8a3b85f92102fc5fc1b0c7ff8a4af79473e"}, - {file = "daytona_sdk-0.20.2.tar.gz", hash = "sha256:2796d19ce92cc45a0dd5c62457b4b0147e0e34514ec1d4807e6364bcd213a010"}, + {file = "daytona_sdk-0.21.0a4-py3-none-any.whl", hash = "sha256:74bffdb2c0f2fff089208972ef14bb562963490fbb35d87eb87e58e8a846b2ca"}, + {file = "daytona_sdk-0.21.0a4.tar.gz", hash = "sha256:399c7507f0810012745916625b122857fe817a4e79e634f27a38b816567e8438"}, ] [package.dependencies] @@ -605,8 +605,8 @@ aiofiles = ">=24.1.0,<24.2.0" aiohttp = ">=3.12.0,<4.0.0" aiohttp_retry = ">=2.9.0,<3.0.0" boto3 = ">=1.0.0,<2.0.0" -daytona_api_client = ">=0.20.1,<0.21.0" -daytona_api_client_async = ">=0.20.1,<0.21.0" +daytona_api_client = "0.21.0a1" +daytona_api_client_async = "0.21.0a1" Deprecated = ">=1.2.18,<2.0.0" environs = ">=9.5.0,<10.0.0" httpx = ">=0.28.0,<0.29.0" @@ -3904,4 +3904,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.1" python-versions = "^3.11" -content-hash = "09a851f3db2d0b1f130405a69c1661c453f82ce23e078256bc6749662af897a7" +content-hash = "f6a13156e73a31fd91ed8b923ee3b388c855282a2ed51ab23197af4fa0de99ff" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 05af3385..c7d611af 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -41,7 +41,7 @@ exa-py = "^1.9.1" e2b-code-interpreter = "^1.2.0" certifi = "2024.2.2" python-ripgrep = "0.0.6" -daytona_sdk = "^0.20.2" +daytona_sdk = "^0.21.0a4" boto3 = "^1.34.0" openai = "^1.72.0" nest-asyncio = "^1.6.0" @@ -68,7 +68,7 @@ agentpress = "agentpress.cli:main" include = "agentpress" [tool.poetry.group.dev.dependencies] -daytona-sdk = "^0.20.2" +daytona-sdk = "^0.21.0a4" [build-system] requires = ["poetry-core"] diff --git a/backend/requirements.txt b/backend/requirements.txt index bcd0ca7f..dffe61df 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -21,7 +21,9 @@ exa-py>=1.9.1 e2b-code-interpreter>=1.2.0 certifi==2024.2.2 python-ripgrep==0.0.6 -daytona-sdk==0.20.2 +daytona-sdk==0.21.0a4 +daytona-api-client==0.21.0a1 +daytona-api-client-async==0.21.0a1 boto3>=1.34.0 openai>=1.72.0 nest-asyncio>=1.6.0 diff --git a/backend/sandbox/sandbox.py b/backend/sandbox/sandbox.py index 32b7422a..ff3ea2f1 100644 --- a/backend/sandbox/sandbox.py +++ b/backend/sandbox/sandbox.py @@ -1,5 +1,4 @@ -from daytona_sdk import Daytona, DaytonaConfig, CreateSandboxParams, Sandbox, SessionExecuteRequest -from daytona_api_client.models.workspace_state import WorkspaceState +from daytona_sdk import Daytona, DaytonaConfig, CreateSandboxFromImageParams, Sandbox, SessionExecuteRequest, Resources, SandboxState from dotenv import load_dotenv from utils.logger import logger from utils.config import config @@ -38,17 +37,17 @@ async def get_or_start_sandbox(sandbox_id: str): logger.info(f"Getting or starting sandbox with ID: {sandbox_id}") try: - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) # Check if sandbox needs to be started - if sandbox.instance.state == WorkspaceState.ARCHIVED or sandbox.instance.state == WorkspaceState.STOPPED: - logger.info(f"Sandbox is in {sandbox.instance.state} state. Starting...") + if sandbox.state == SandboxState.ARCHIVED or sandbox.state == SandboxState.STOPPED: + logger.info(f"Sandbox is in {sandbox.state} state. Starting...") try: daytona.start(sandbox) # Wait a moment for the sandbox to initialize # sleep(5) # Refresh sandbox state after starting - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) # Start supervisord in a session when restarting start_supervisord_session(sandbox) @@ -91,7 +90,7 @@ def create_sandbox(password: str, project_id: str = None): logger.debug(f"Using sandbox_id as label: {project_id}") labels = {'id': project_id} - params = CreateSandboxParams( + params = CreateSandboxFromImageParams( image=Configuration.SANDBOX_IMAGE_NAME, public=True, labels=labels, @@ -108,11 +107,11 @@ def create_sandbox(password: str, project_id: str = None): "CHROME_DEBUGGING_HOST": "localhost", "CHROME_CDP": "" }, - resources={ - "cpu": 2, - "memory": 4, - "disk": 5, - }, + resources=Resources( + cpu=2, + memory=4, + disk=5, + ), auto_stop_interval=15, auto_archive_interval=24 * 60, ) @@ -133,7 +132,7 @@ async def delete_sandbox(sandbox_id: str): try: # Get the sandbox - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) # Delete the sandbox daytona.remove(sandbox) diff --git a/backend/utils/scripts/archive_inactive_sandboxes.py b/backend/utils/scripts/archive_inactive_sandboxes.py index e01e8593..1a56dbeb 100644 --- a/backend/utils/scripts/archive_inactive_sandboxes.py +++ b/backend/utils/scripts/archive_inactive_sandboxes.py @@ -162,7 +162,7 @@ async def archive_sandbox(project: Dict[str, Any], dry_run: bool) -> bool: return True # Get the sandbox - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) # Check sandbox state - it must be stopped before archiving sandbox_info = sandbox.info() diff --git a/backend/utils/scripts/archive_old_sandboxes.py b/backend/utils/scripts/archive_old_sandboxes.py index c0ebce9d..ae020d89 100644 --- a/backend/utils/scripts/archive_old_sandboxes.py +++ b/backend/utils/scripts/archive_old_sandboxes.py @@ -170,7 +170,7 @@ async def archive_sandbox(project: Dict[str, Any], dry_run: bool) -> bool: return True # Get the sandbox - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) # Check sandbox state - it must be stopped before archiving sandbox_info = sandbox.info() diff --git a/backend/utils/scripts/delete_user_sandboxes.py b/backend/utils/scripts/delete_user_sandboxes.py index 4a101ce4..fe1254ef 100644 --- a/backend/utils/scripts/delete_user_sandboxes.py +++ b/backend/utils/scripts/delete_user_sandboxes.py @@ -83,7 +83,7 @@ async def delete_sandboxes(projects: List[Dict[str, Any]]) -> None: logger.info(f"Deleting sandbox {sandbox_id} for project '{project_name}' (ID: {project_id})") # Get the sandbox and delete it - sandbox = daytona.get_current_sandbox(sandbox_id) + sandbox = daytona.get(sandbox_id) daytona.delete(sandbox) logger.info(f"Successfully deleted sandbox {sandbox_id}")