Spaces:
Sleeping
Sleeping
Update backend/app/config/settings.py
Browse files- backend/app/config/settings.py +37 -19
backend/app/config/settings.py
CHANGED
|
@@ -1,38 +1,56 @@
|
|
| 1 |
-
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 2 |
from pathlib import Path
|
| 3 |
from pydantic import Field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
class Settings(BaseSettings):
|
| 6 |
-
|
| 7 |
model_config = SettingsConfigDict(
|
| 8 |
env_file=".env",
|
| 9 |
-
extra="ignore",
|
| 10 |
-
case_sensitive=False,
|
| 11 |
populate_by_name=True,
|
| 12 |
)
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
# Models
|
| 17 |
OPENAI_API_KEY: str | None = None
|
| 18 |
OPENAI_MODEL_AGENT: str = "gpt-4o"
|
| 19 |
OPENAI_MODEL_CLASSIFIER: str = "gpt-4o-mini"
|
| 20 |
|
| 21 |
-
#
|
| 22 |
-
DATA_DIR: Path =
|
| 23 |
-
REPORTS_DB: Path =
|
| 24 |
-
SESSIONS_DB: Path =
|
| 25 |
-
UPLOADS_DIR: Path =
|
|
|
|
| 26 |
|
| 27 |
# Defaults
|
| 28 |
-
DEFAULT_RADIUS_KM: float = 40.0
|
| 29 |
DEFAULT_LIMIT: int = 10
|
| 30 |
MAX_AGE_HOURS: int = 48
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
settings = Settings()
|
| 37 |
-
settings.
|
| 38 |
-
settings.UPLOADS_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
|
| 1 |
from pathlib import Path
|
| 2 |
from pydantic import Field
|
| 3 |
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
| 4 |
+
|
| 5 |
+
# Resolve repo root no matter where uvicorn is launched from
|
| 6 |
+
REPO_ROOT = Path(__file__).resolve().parents[3]
|
| 7 |
+
|
| 8 |
+
def _default_data_dir() -> Path:
|
| 9 |
+
return (REPO_ROOT / "data").resolve()
|
| 10 |
+
|
| 11 |
+
def _default_uploads_dir() -> Path:
|
| 12 |
+
return (_default_data_dir() / "uploads").resolve()
|
| 13 |
+
|
| 14 |
+
def _default_frontend_dist() -> Path:
|
| 15 |
+
return (REPO_ROOT / "web" / "dist").resolve()
|
| 16 |
|
| 17 |
class Settings(BaseSettings):
|
|
|
|
| 18 |
model_config = SettingsConfigDict(
|
| 19 |
env_file=".env",
|
| 20 |
+
extra="ignore",
|
| 21 |
+
case_sensitive=False,
|
| 22 |
populate_by_name=True,
|
| 23 |
)
|
| 24 |
+
|
| 25 |
+
# Models / API keys
|
|
|
|
|
|
|
| 26 |
OPENAI_API_KEY: str | None = None
|
| 27 |
OPENAI_MODEL_AGENT: str = "gpt-4o"
|
| 28 |
OPENAI_MODEL_CLASSIFIER: str = "gpt-4o-mini"
|
| 29 |
|
| 30 |
+
# Paths (env may override with absolute or relative; we resolve below)
|
| 31 |
+
DATA_DIR: Path = Field(default_factory=_default_data_dir)
|
| 32 |
+
REPORTS_DB: Path = Field(default_factory=lambda: _default_data_dir() / "pulsemaps_reports.db")
|
| 33 |
+
SESSIONS_DB: Path = Field(default_factory=lambda: _default_data_dir() / "pulsemap_sessions.db")
|
| 34 |
+
UPLOADS_DIR: Path = Field(default_factory=_default_uploads_dir)
|
| 35 |
+
FRONTEND_DIST: Path = Field(default_factory=_default_frontend_dist)
|
| 36 |
|
| 37 |
# Defaults
|
| 38 |
+
DEFAULT_RADIUS_KM: float = 40.0
|
| 39 |
DEFAULT_LIMIT: int = 10
|
| 40 |
MAX_AGE_HOURS: int = 48
|
| 41 |
|
| 42 |
+
# Optional extras you had in .env
|
| 43 |
+
firms_map_key: str | None = None
|
| 44 |
+
gdacs_rss_url: str | None = "https://www.gdacs.org/xml/rss.xml"
|
| 45 |
+
nvidia_api_key: str | None = None
|
| 46 |
+
|
| 47 |
+
def ensure_dirs(self) -> None:
|
| 48 |
+
# Resolve in case env provided relative strings
|
| 49 |
+
self.DATA_DIR = self.DATA_DIR.resolve()
|
| 50 |
+
self.UPLOADS_DIR = self.UPLOADS_DIR.resolve()
|
| 51 |
+
# Create everything robustly
|
| 52 |
+
self.DATA_DIR.mkdir(parents=True, exist_ok=True)
|
| 53 |
+
self.UPLOADS_DIR.mkdir(parents=True, exist_ok=True)
|
| 54 |
|
| 55 |
settings = Settings()
|
| 56 |
+
settings.ensure_dirs()
|
|
|