Spaces:
Sleeping
Sleeping
import abc | |
import asyncio | |
import logging | |
import uuid | |
from typing import Dict, List, Any, Optional | |
from aworld.sandbox.api.setup import SandboxSetup | |
from aworld.sandbox.models import SandboxStatus, SandboxEnvType, SandboxInfo | |
from aworld.sandbox.run.mcp_servers import McpServers | |
class Sandbox(SandboxSetup): | |
""" | |
Sandbox abstract base class that defines the interface for all sandbox implementations. | |
A sandbox provides an isolated environment for executing code and operations. | |
""" | |
default_sandbox_timeout = 3000 | |
def sandbox_id(self) -> str: | |
""" | |
Returns the unique identifier of the sandbox. | |
""" | |
return self._sandbox_id | |
def status(self) -> SandboxStatus: | |
""" | |
Returns the current status of the sandbox. | |
""" | |
return self._status | |
def timeout(self) -> int: | |
""" | |
Returns the timeout value for sandbox operations. | |
""" | |
return self._timeout | |
def metadata(self) -> Dict[str, Any]: | |
""" | |
Returns the sandbox metadata. | |
""" | |
return self._metadata | |
def env_type(self) -> SandboxEnvType: | |
""" | |
Returns the environment type of the sandbox. | |
""" | |
return self._env_type | |
def mcp_config(self) -> Any: | |
""" | |
Returns the MCP configuration. | |
""" | |
return self._mcp_config | |
def mcp_servers(self) -> List[str]: | |
""" | |
Returns the list of MCP servers. | |
""" | |
return self._mcp_servers | |
def mcpservers(self) -> McpServers: | |
""" | |
Module for running MCP in the sandbox. | |
Returns: | |
McpServers: The MCP servers instance. | |
""" | |
pass | |
def __init__( | |
self, | |
sandbox_id: Optional[str] = None, | |
env_type: Optional[int] = None, | |
metadata: Optional[Dict[str, str]] = None, | |
timeout: Optional[int] = None, | |
mcp_servers: Optional[List[str]] = None, | |
mcp_config: Optional[Any] = None, | |
): | |
""" | |
Initialize a new Sandbox instance. | |
Args: | |
sandbox_id: Unique identifier for the sandbox. If None, one will be generated. | |
env_type: The environment type (LOCAL, K8S, SUPERCOMPUTER). | |
metadata: Additional metadata for the sandbox. | |
timeout: Timeout for sandbox operations. | |
mcp_servers: List of MCP servers to use. | |
mcp_config: Configuration for MCP servers. | |
""" | |
# Initialize basic attributes | |
self._sandbox_id = sandbox_id or str(uuid.uuid4()) | |
self._status = SandboxStatus.INIT | |
self._timeout = timeout or self.default_sandbox_timeout | |
self._metadata = metadata or {} | |
self._env_type = env_type or SandboxEnvType.LOCAL | |
self._mcp_servers = mcp_servers or [] | |
self._mcp_config = mcp_config or {} | |
def get_info(self) -> SandboxInfo: | |
""" | |
Returns information about the sandbox. | |
Returns: | |
SandboxInfo: Information about the sandbox. | |
""" | |
pass | |
async def remove(self) -> bool: | |
""" | |
Remove the sandbox and clean up all resources. | |
Returns: | |
bool: True if removal was successful, False otherwise. | |
""" | |
pass | |
async def cleanup(self) -> bool: | |
""" | |
Clean up the sandbox resources. | |
Returns: | |
bool: True if cleanup was successful, False otherwise. | |
""" | |
pass | |
def __del__(self): | |
""" | |
Ensure resources are cleaned up when the object is garbage collected. | |
""" | |
try: | |
# Handle the case where an event loop already exists | |
try: | |
loop = asyncio.get_running_loop() | |
logging.warning("Cannot clean up sandbox in __del__ when event loop is already running") | |
return | |
except RuntimeError: | |
# No running event loop, create a new one | |
loop = asyncio.new_event_loop() | |
asyncio.set_event_loop(loop) | |
loop.run_until_complete(self.cleanup()) | |
loop.close() | |
except Exception as e: | |
logging.warning(f"Failed to cleanup sandbox resources during garbage collection: {e}") |