from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") # Database database_url: str = "postgresql+asyncpg://stock_backend:changeme@localhost:5432/stock_data_backend" # Auth jwt_secret: str = "change-this-to-a-random-secret" jwt_expiry_minutes: int = 60 # OHLCV Provider — Alpaca Markets alpaca_api_key: str = "" alpaca_api_secret: str = "" # Sentiment Provider — Gemini with Search Grounding (legacy) gemini_api_key: str = "" gemini_model: str = "gemini-2.0-flash" # Sentiment Provider — OpenAI openai_api_key: str = "" openai_model: str = "gpt-4o-mini" openai_sentiment_batch_size: int = 5 # Fundamentals Provider — Financial Modeling Prep fmp_api_key: str = "" # Fundamentals Provider — Finnhub (optional fallback) finnhub_api_key: str = "" # Fundamentals Provider — Alpha Vantage (optional fallback) alpha_vantage_api_key: str = "" # Scheduled Jobs data_collector_frequency: str = "daily" sentiment_poll_interval_minutes: int = 30 fundamental_fetch_frequency: str = "daily" rr_scan_frequency: str = "daily" fundamental_rate_limit_retries: int = 3 fundamental_rate_limit_backoff_seconds: int = 15 # Scoring Defaults default_watchlist_auto_size: int = 10 default_rr_threshold: float = 1.5 # Database Pool db_pool_size: int = 5 db_pool_timeout: int = 30 # Logging log_level: str = "INFO" settings = Settings()