from pydantic_settings import BaseSettings, SettingsConfigDict from functools import lru_cache import itertools class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") database_url: str qdrant_url: str qdrant_api_key: str redis_url: str groq_api_key: str groq_model: str = "llama-3.3-70b-versatile" embedding_model: str = "BAAI/bge-small-en-v1.5" reranker_model: str = "BAAI/bge-reranker-v2-m3" collection_name: str = "candidates_v1" vector_size: int = 384 @property def groq_keys_list(self) -> list[str]: return [k.strip() for k in self.groq_api_key.split(",") if k.strip()] @lru_cache def get_settings() -> Settings: return Settings() # Global memory state for circular revolving queue inside this worker thread _groq_key_cycler = None def get_revolving_groq_key() -> str: global _groq_key_cycler if _groq_key_cycler is None: _groq_key_cycler = itertools.cycle(get_settings().groq_keys_list) return next(_groq_key_cycler)