| 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 | |
| def groq_keys_list(self) -> list[str]: | |
| return [k.strip() for k in self.groq_api_key.split(",") if k.strip()] | |
| 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) | |