petter2025's picture
Create config/settings.py
9846bab verified
raw
history blame
3.56 kB
"""
Configuration management for ARF Demo
"""
from pydantic import BaseSettings, Field, validator
from typing import Optional, Dict, Any, List
from enum import Enum
import os
class ARFMode(str, Enum):
"""ARF operation modes"""
DEMO = "demo"
OSS = "oss"
ENTERPRISE = "enterprise"
class SafetyMode(str, Enum):
"""Safety modes for execution"""
ADVISORY = "advisory"
APPROVAL = "approval"
AUTONOMOUS = "autonomous"
class Settings(BaseSettings):
"""
Application settings with environment variable support
"""
# ===== System Mode =====
arf_mode: ARFMode = Field(
default=ARFMode.DEMO,
description="ARF operation mode"
)
use_mock_arf: bool = Field(
default=True,
description="Use mock ARF implementation (for demo mode)"
)
# ===== ARF Configuration =====
arf_api_key: Optional[str] = Field(
default=None,
description="ARF API key for real integration"
)
arf_base_url: str = Field(
default="https://api.arf.dev",
description="ARF API base URL"
)
# ===== Business Configuration =====
engineer_hourly_rate: float = Field(
default=150.0,
ge=50.0,
le=500.0,
description="Engineer hourly rate in USD"
)
engineer_annual_cost: float = Field(
default=125000.0,
ge=50000.0,
le=250000.0,
description="Engineer annual cost in USD"
)
default_savings_rate: float = Field(
default=0.82,
ge=0.5,
le=0.95,
description="Default savings rate with ARF"
)
# ===== UI Configuration =====
auto_refresh_seconds: int = Field(
default=30,
ge=5,
le=300,
description="Auto-refresh interval in seconds"
)
max_history_items: int = Field(
default=100,
ge=10,
le=1000,
description="Maximum history items to display"
)
# ===== Demo Configuration =====
default_scenario: str = Field(
default="Cache Miss Storm",
description="Default incident scenario"
)
scenario_config_path: str = Field(
default="config/scenarios",
description="Path to scenario configuration files"
)
# ===== Safety Configuration =====
default_safety_mode: SafetyMode = Field(
default=SafetyMode.ADVISORY,
description="Default safety mode"
)
require_approval: bool = Field(
default=True,
description="Require human approval for execution"
)
# ===== Validation =====
@validator("arf_api_key")
def validate_api_key(cls, v: Optional[str], values: Dict[str, Any]) -> Optional[str]:
if values.get("arf_mode") == ARFMode.ENTERPRISE and not v:
raise ValueError("ARF API key required for Enterprise mode")
return v
@validator("use_mock_arf")
def validate_mock_mode(cls, v: bool, values: Dict[str, Any]) -> bool:
if values.get("arf_mode") == ARFMode.DEMO:
return True
return v
class Config:
env_file = ".env"
env_file_encoding = "utf-8"
case_sensitive = False
use_enum_values = True
# Global settings instance
settings = Settings()
def get_settings() -> Settings:
"""Get settings instance (singleton pattern)"""
return settings
def reload_settings() -> Settings:
"""Reload settings from environment"""
global settings
settings = Settings()
return settings