Source code for agentscope_runtime.sandbox.manager.server.config

# -*- coding: utf-8 -*-
import os
import json

from typing import Optional, Tuple, Literal, Dict, Union, List
from pydantic_settings import BaseSettings
from pydantic import field_validator, ConfigDict
from dotenv import load_dotenv


[docs] class Settings(BaseSettings): """Runtime Manager Service Settings""" # Service settings HOST: str = "127.0.0.1" PORT: int = 8000 WORKERS: int = 1 DEBUG: bool = False BEARER_TOKEN: Optional[str] = None # Runtime Manager settings DEFAULT_SANDBOX_TYPE: Union[str, List[str]] = "base" POOL_SIZE: int = 1 AUTO_CLEANUP: bool = True CONTAINER_PREFIX_KEY: str = "runtime_sandbox_container_" CONTAINER_DEPLOYMENT: Literal[ "docker", "cloud", "k8s", "agentrun", "fc", ] = "docker" DEFAULT_MOUNT_DIR: str = "sessions_mount_dir" # Read-only mounts (host_path -> container_path) # Example in .env: # READONLY_MOUNTS={"\/opt\/shared": "\/mnt\/shared", "\/etc\/timezone": # "\/etc\/timezone"} READONLY_MOUNTS: Optional[Dict[str, str]] = None STORAGE_FOLDER: str = "runtime_sandbox_storage" PORT_RANGE: Tuple[int, int] = (49152, 59152) # Redis settings REDIS_ENABLED: bool = False REDIS_SERVER: str = "localhost" REDIS_PORT: int = 6379 REDIS_DB: int = 0 REDIS_USER: Optional[str] = None REDIS_PASSWORD: Optional[str] = None REDIS_PORT_KEY: str = "_runtime_sandbox_container_occupied_ports" REDIS_CONTAINER_POOL_KEY: str = "_runtime_sandbox_container_container_pool" # OSS settings FILE_SYSTEM: Literal["local", "oss"] = "local" OSS_ENDPOINT: str = "http://oss-cn-hangzhou.aliyuncs.com" OSS_ACCESS_KEY_ID: str = "your-access-key-id" OSS_ACCESS_KEY_SECRET: str = "your-access-key-secret" OSS_BUCKET_NAME: str = "your-bucket-name" # K8S settings K8S_NAMESPACE: str = "default" KUBECONFIG_PATH: Optional[str] = None # AgentRun settings AGENT_RUN_ACCOUNT_ID: Optional[str] = None AGENT_RUN_ACCESS_KEY_ID: Optional[str] = None AGENT_RUN_ACCESS_KEY_SECRET: Optional[str] = None AGENT_RUN_REGION_ID: str = "cn-hangzhou" AGENT_RUN_CPU: float = 2.0 AGENT_RUN_MEMORY: int = 2048 AGENT_RUN_VPC_ID: Optional[str] = None AGENT_RUN_VSWITCH_IDS: Optional[list[str]] = None AGENT_RUN_SECURITY_GROUP_ID: Optional[str] = None AGENT_RUN_PREFIX: str = "agentscope-sandbox" AGENT_RUN_LOG_PROJECT: Optional[str] = None AGENT_RUN_LOG_STORE: Optional[str] = None # FC settings FC_ACCOUNT_ID: Optional[str] = None FC_ACCESS_KEY_ID: Optional[str] = None FC_ACCESS_KEY_SECRET: Optional[str] = None FC_REGION_ID: str = "cn-hangzhou" FC_CPU: float = 2.0 FC_MEMORY: int = 2048 FC_VPC_ID: Optional[str] = None FC_VSWITCH_IDS: Optional[list[str]] = None FC_SECURITY_GROUP_ID: Optional[str] = None FC_PREFIX: str = "agentscope-sandbox" FC_LOG_PROJECT: Optional[str] = None FC_LOG_STORE: Optional[str] = None model_config = ConfigDict( case_sensitive=True, extra="allow", )
[docs] @field_validator("WORKERS", mode="before") @classmethod def validate_workers(cls, value, info): if not info.data.get("REDIS_ENABLED", False): return 1 return value
[docs] @field_validator("DEFAULT_SANDBOX_TYPE", mode="before") @classmethod def parse_default_type(cls, v): if isinstance(v, str): v = v.strip() if v.startswith("[") and v.endswith("]"): try: return json.loads(v) except json.JSONDecodeError: return [ item.strip() for item in v[1:-1].split(",") if item.strip() ] return [item.strip() for item in v.split(",") if item.strip()] return v
_settings: Optional[Settings] = None
[docs] def get_settings(config_file: Optional[str] = None) -> Settings: global _settings env_file = ".env" env_example_file = ".env.example" if _settings is None: if config_file and os.path.exists(config_file): load_dotenv(config_file, override=True) elif os.path.exists(env_file): load_dotenv(env_file) elif os.path.exists(env_example_file): load_dotenv(env_example_file) _settings = Settings() return _settings