|
|
"""Centralized application settings loaded from environment variables. |
|
|
|
|
|
Uses pydantic-settings so both backend and frontend can share defaults and |
|
|
override them through a `.env` file or process environment variables. |
|
|
""" |
|
|
|
|
|
from functools import lru_cache |
|
|
from typing import Optional |
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict |
|
|
|
|
|
|
|
|
class APISettings(BaseSettings): |
|
|
"""Configuration for the FastAPI backend.""" |
|
|
|
|
|
host: str = "0.0.0.0" |
|
|
port: int = 8000 |
|
|
log_level: str = "INFO" |
|
|
|
|
|
model_config = SettingsConfigDict( |
|
|
env_prefix="API_", |
|
|
env_file=".env", |
|
|
env_file_encoding="utf-8", |
|
|
extra="ignore", |
|
|
) |
|
|
|
|
|
|
|
|
class LLMSettings(BaseSettings): |
|
|
"""Configuration for the language model backend.""" |
|
|
|
|
|
backend: str = "ollama" |
|
|
host: str = "http://localhost:11434" |
|
|
model: str = "llama3.2:latest" |
|
|
timeout: int = 120 |
|
|
max_retries: int = 3 |
|
|
retry_delay: float = 1.0 |
|
|
api_key: Optional[str] = None |
|
|
site_url: Optional[str] = None |
|
|
app_name: Optional[str] = None |
|
|
|
|
|
model_config = SettingsConfigDict( |
|
|
env_prefix="LLM_", |
|
|
env_file=".env", |
|
|
env_file_encoding="utf-8", |
|
|
extra="ignore", |
|
|
) |
|
|
|
|
|
|
|
|
class FrontendSettings(BaseSettings): |
|
|
"""Configuration for the Gradio frontend.""" |
|
|
|
|
|
backend_base_url: str = "http://localhost:8000" |
|
|
websocket_url: str = "ws://localhost:8000/ws/conversation" |
|
|
|
|
|
model_config = SettingsConfigDict( |
|
|
env_prefix="FRONTEND_", |
|
|
env_file=".env", |
|
|
env_file_encoding="utf-8", |
|
|
extra="ignore", |
|
|
) |
|
|
|
|
|
|
|
|
class DBSettings(BaseSettings): |
|
|
"""Configuration for persistent storage.""" |
|
|
|
|
|
path: str = ".localdata/converta.db" |
|
|
|
|
|
model_config = SettingsConfigDict( |
|
|
env_prefix="DB_", |
|
|
env_file=".env", |
|
|
env_file_encoding="utf-8", |
|
|
extra="ignore", |
|
|
) |
|
|
|
|
|
|
|
|
class AppSettings(BaseSettings): |
|
|
"""Aggregate configuration exposed to the application.""" |
|
|
|
|
|
api: APISettings = APISettings() |
|
|
llm: LLMSettings = LLMSettings() |
|
|
frontend: FrontendSettings = FrontendSettings() |
|
|
db: DBSettings = DBSettings() |
|
|
log_level: str = "INFO" |
|
|
|
|
|
model_config = SettingsConfigDict( |
|
|
env_file=".env", |
|
|
env_file_encoding="utf-8", |
|
|
extra="ignore", |
|
|
) |
|
|
|
|
|
|
|
|
@lru_cache |
|
|
def get_settings() -> AppSettings: |
|
|
"""Return the singleton settings instance.""" |
|
|
return AppSettings() |
|
|
|