Spaces:
Sleeping
Sleeping
| from typing import Dict, List, Any, Optional | |
| from aworld.sandbox.base import Sandbox | |
| from aworld.sandbox.common import BaseSandbox | |
| from aworld.sandbox.models import SandboxEnvType | |
| from aworld.sandbox.implementations import LocalSandbox, KubernetesSandbox, SuperSandbox | |
| # For backward compatibility, use LocalSandbox as the default Sandbox implementation | |
| DefaultSandbox = LocalSandbox | |
| # Override Sandbox class constructor to create the appropriate sandbox based on env_type | |
| def create_sandbox( | |
| env_type: Optional[int] = None, | |
| sandbox_id: Optional[str] = None, | |
| metadata: Optional[Dict[str, str]] = None, | |
| timeout: Optional[int] = None, | |
| mcp_servers: Optional[List[str]] = None, | |
| mcp_config: Optional[Any] = None, | |
| **kwargs | |
| ) -> Sandbox: | |
| """ | |
| Factory function to create a sandbox instance based on the environment type. | |
| Args: | |
| env_type: The environment type. Defaults to LOCAL if None. | |
| sandbox_id: Unique identifier for the sandbox. If None, one will be generated. | |
| 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. | |
| **kwargs: Additional parameters for specific sandbox types. | |
| Returns: | |
| Sandbox: An instance of a sandbox implementation. | |
| Raises: | |
| ValueError: If an invalid environment type is provided. | |
| """ | |
| env_type = env_type or SandboxEnvType.LOCAL | |
| if env_type == SandboxEnvType.LOCAL: | |
| return LocalSandbox( | |
| sandbox_id=sandbox_id, | |
| metadata=metadata, | |
| timeout=timeout, | |
| mcp_servers=mcp_servers, | |
| mcp_config=mcp_config, | |
| **kwargs | |
| ) | |
| elif env_type == SandboxEnvType.K8S: | |
| return KubernetesSandbox( | |
| sandbox_id=sandbox_id, | |
| metadata=metadata, | |
| timeout=timeout, | |
| mcp_servers=mcp_servers, | |
| mcp_config=mcp_config, | |
| **kwargs | |
| ) | |
| elif env_type == SandboxEnvType.SUPERCOMPUTER: | |
| return SuperSandbox( | |
| sandbox_id=sandbox_id, | |
| metadata=metadata, | |
| timeout=timeout, | |
| mcp_servers=mcp_servers, | |
| mcp_config=mcp_config, | |
| **kwargs | |
| ) | |
| else: | |
| raise ValueError(f"Invalid environment type: {env_type}") | |
| # Monkey patch the Sandbox class to make direct instantiation work | |
| old_init = Sandbox.__init__ | |
| def _sandbox_init(self, *args, **kwargs): | |
| if type(self) is Sandbox: | |
| # This should never be called directly, as __new__ will return a different type | |
| pass | |
| else: | |
| # Pass through to the original __init__ for actual implementations | |
| old_init(self, *args, **kwargs) | |
| # Store the original __new__ method | |
| original_new = object.__new__ | |
| # Create a new __new__ method that intercepts Sandbox instantiation | |
| def _sandbox_new(cls, *args, **kwargs): | |
| if cls is Sandbox: | |
| # If trying to instantiate Sandbox directly, use our factory instead | |
| return create_sandbox(**kwargs) | |
| else: | |
| # For subclasses, use the original __new__ | |
| return original_new(cls) | |
| # Apply the monkey patches | |
| Sandbox.__init__ = _sandbox_init | |
| Sandbox.__new__ = _sandbox_new | |
| # Expose key classes and functions | |
| __all__ = [ | |
| 'Sandbox', | |
| 'BaseSandbox', | |
| 'LocalSandbox', | |
| 'KubernetesSandbox', | |
| 'SuperSandbox', | |
| 'DefaultSandbox', | |
| 'SandboxEnvType', | |
| 'create_sandbox' | |
| ] | |