sentinel-backend / src /utils /config.py
Penguindrum920's picture
Deploy SENTINEL backend to Hugging Face Spaces
6a09e49 verified
Raw
History Blame Contribute Delete
2.47 kB
"""Configuration for the SENTINEL market simulator."""
import os
from dataclasses import dataclass, field
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
_UTILS_DIR = Path(__file__).resolve().parent
_BACKEND_ROOT = _UTILS_DIR.parents[1]
_PROJECT_ROOT = _UTILS_DIR.parents[2]
def _split_csv(value: str) -> list[str]:
return [item.strip().rstrip("/") for item in value.split(",") if item.strip()]
def _get_bool(name: str, default: bool) -> bool:
value = os.getenv(name)
if value is None:
return default
return value.strip().lower() not in {"0", "false", "no", "off"}
def _resolve_repo_path(value: str) -> str:
path = Path(value).expanduser()
if path.is_absolute():
return str(path)
candidates = [
Path.cwd() / path,
_BACKEND_ROOT / path,
_PROJECT_ROOT / path,
]
for candidate in candidates:
if candidate.exists():
return str(candidate.resolve())
return str((_BACKEND_ROOT / path).resolve())
def _default_allowed_origins() -> list[str]:
origins = [
"http://localhost:3000",
"http://127.0.0.1:3000",
]
frontend_url = os.getenv("FRONTEND_URL", "").strip().rstrip("/")
if frontend_url:
origins.append(frontend_url)
origins.extend(_split_csv(os.getenv("ALLOWED_ORIGINS", "")))
deduped: list[str] = []
for origin in origins:
if origin not in deduped:
deduped.append(origin)
return deduped
@dataclass
class Config:
"""Global configuration loaded from environment variables."""
# Simulation
simulation_mode: str = os.getenv("SIMULATION_MODE", "SANDBOX")
initial_price: float = float(os.getenv("INITIAL_PRICE", "100.0"))
simulation_duration: int = int(os.getenv("SIMULATION_DURATION", "23400"))
# Server
host: str = os.getenv("HOST", "0.0.0.0")
port: int = int(os.getenv("PORT", "8000"))
allowed_origins: list[str] = field(default_factory=_default_allowed_origins)
# Feature baselines
baseline_spread: float = 0.001
baseline_depth: float = 1000.0
baseline_volatility: float = 0.02
# RL policy
rl_policy_enabled: bool = _get_bool("RL_POLICY_ENABLED", False)
rl_policy_kind: str = os.getenv("RL_POLICY_KIND", "ppo").strip().lower()
rl_model_path: str = _resolve_repo_path(
os.getenv("RL_MODEL_PATH", os.path.join("models", "ppo_market_maker.zip"))
)
config = Config()