From 42ff0193fc6d3eaf8e00741a35188abd58c81bab Mon Sep 17 00:00:00 2001 From: Mortdecai Date: Fri, 10 Apr 2026 01:20:59 -0400 Subject: [PATCH] feat: add project config and test scaffolding --- .gitignore | 3 ++- requirements.txt | 14 +++++++++++++ server/__init__.py | 0 server/config.py | 47 ++++++++++++++++++++++++++++++++++++++++++++ tests/__init__.py | 0 tests/conftest.py | 1 + tests/test_config.py | 28 ++++++++++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 requirements.txt create mode 100644 server/__init__.py create mode 100644 server/config.py create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_config.py diff --git a/.gitignore b/.gitignore index c5cf098..0ae16ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ __pycache__/ .pytest_cache/ *.egg-info/ venv/ +.venv/ .env assets/ -samples/ +samples/*.wav .backup/ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..594f372 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +fastapi>=0.115.0 +uvicorn[standard]>=0.34.0 +torch>=2.2.0 +diffusers>=0.30.0 +transformers>=4.40.0 +accelerate>=0.30.0 +TTS>=0.22.0 +Pillow>=10.0.0 +numpy>=1.26.0 +pydantic>=2.0.0 +pytest>=8.0.0 +pytest-asyncio>=0.23.0 +httpx>=0.27.0 +websockets>=12.0 diff --git a/server/__init__.py b/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/config.py b/server/config.py new file mode 100644 index 0000000..82d2771 --- /dev/null +++ b/server/config.py @@ -0,0 +1,47 @@ +"""Application configuration with Pydantic models.""" + +from pydantic import BaseModel, Field + + +class EscalationConfig(BaseModel): + """Escalation engine parameters.""" + rate: float = 0.05 + initial_batch_size: int = 40 + max_images: int = 200 + max_audio_clips: int = 50 + asset_swap_min: float = 0.5 # seconds (at high intensity) + asset_swap_max: float = 15.0 # seconds (at low intensity) + voice_mean_interval: float = 60.0 # Poisson mean at intensity 0 + silence_gap_min: float = 2.0 + silence_gap_max: float = 30.0 + fake_calm_chance: float = 0.08 # probability per phase update + fake_calm_duration_min: float = 10.0 + fake_calm_duration_max: float = 30.0 + cluster_burst_chance: float = 0.1 + cluster_burst_count_min: int = 2 + cluster_burst_count_max: int = 5 + + +class ModelConfig(BaseModel): + """AI model identifiers and generation parameters.""" + sdxl_model_id: str = "stabilityai/sdxl-turbo" + sdxl_steps: int = 4 + sdxl_guidance_scale: float = 0.0 + sdxl_width: int = 512 + sdxl_height: int = 512 + xtts_model: str = "tts_models/multilingual/multi-dataset/xtts_v2" + xtts_language: str = "en" + + +class AppConfig(BaseModel): + """Top-level application config.""" + host: str = "0.0.0.0" + port: int = 8400 + device: str = "cuda" + assets_dir: str = "assets" + samples_dir: str = "samples" + escalation: EscalationConfig = Field(default_factory=EscalationConfig) + models: ModelConfig = Field(default_factory=ModelConfig) + + +config = AppConfig() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..5632edd --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1 @@ +"""Shared test fixtures.""" diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..a7db253 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,28 @@ +from server.config import config, EscalationConfig, ModelConfig, AppConfig + + +def test_config_defaults(): + """Config loads with sane defaults.""" + assert config.port == 8400 + assert config.host == "0.0.0.0" + assert config.device == "cuda" + + +def test_escalation_defaults(): + """Escalation config has correct default rate and timing.""" + assert config.escalation.rate == 0.05 + assert config.escalation.initial_batch_size == 40 + assert config.escalation.max_images == 200 + assert config.escalation.max_audio_clips == 50 + + +def test_model_defaults(): + """Model config points to correct model IDs.""" + assert "sdxl-turbo" in config.models.sdxl_model_id + assert "xtts" in config.models.xtts_model + + +def test_timing_defaults(): + """Timing ranges are ordered correctly.""" + assert config.escalation.asset_swap_min < config.escalation.asset_swap_max + assert config.escalation.voice_mean_interval > 0