from __future__ import annotations import os from dataclasses import dataclass try: from dotenv import load_dotenv load_dotenv() except ImportError: pass @dataclass(frozen=True) class Settings: # Model IDs — each maps to a sponsor prize ocr_model_id: str # MiniCPM-V 4.6 → 🏆 Best MiniCPM Build reasoning_model_id: str # Nemotron 3 Nano 4B → 🏆 Nemotron Hardware Prize multilingual_model_id: str # Tiny Aya 3.3B → multilingual demo speech_model_id: str # Whisper large-v3 → voice mode # API keys — two providers only hf_api_key: str # HuggingFace (MiniCPM, Aya, Whisper) featherless_api_key: str # Featherless (Nemotron) # Generation params max_new_tokens: int temperature: float # Storage db_path: str # Quiz config questions_per_quest: int # regular questions per quest (boss always +1) default_language: str def load_settings() -> Settings: return Settings( ocr_model_id=os.getenv("OCR_MODEL_ID", "openbmb/MiniCPM-V-4_6"), reasoning_model_id=os.getenv("REASONING_MODEL_ID", "nvidia/Nemotron-3-Nano-4B"), multilingual_model_id=os.getenv("MULTILINGUAL_MODEL_ID", "CohereForAI/aya-23-35B"), speech_model_id=os.getenv("SPEECH_MODEL_ID", "openai/whisper-large-v3"), hf_api_key=os.getenv("HF_API_KEY", ""), featherless_api_key=os.getenv("FEATHERLESS_API_KEY", ""), max_new_tokens=int(os.getenv("MAX_NEW_TOKENS", "1024")), temperature=float(os.getenv("TEMPERATURE", "0.3")), db_path=os.getenv("DB_PATH", "studywithchampai.db"), questions_per_quest=int(os.getenv("QUESTIONS_PER_QUEST", "3")), default_language=os.getenv("DEFAULT_LANGUAGE", "en"), ) SETTINGS = load_settings()