# Configuration settings for the Recipe Recommendation Bot import os from typing import Optional, List from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() class Settings: """Simple settings class that reads environment variables directly""" def __init__(self): # =========================================== # Server Configuration # =========================================== self.PORT = int(os.getenv("PORT", 8000)) self.HOST = os.getenv("HOST", "0.0.0.0") self.ENVIRONMENT = os.getenv("ENVIRONMENT", "development") self.DEBUG = os.getenv("DEBUG", "true").lower() == "true" # =========================================== # CORS Configuration # =========================================== cors_origins = os.getenv("CORS_ORIGINS", '["http://localhost:3000","http://localhost:5173","http://localhost:8080"]') self.CORS_ORIGINS = self._parse_list(cors_origins) self.CORS_ALLOW_CREDENTIALS = os.getenv("CORS_ALLOW_CREDENTIALS", "true").lower() == "true" cors_methods = os.getenv("CORS_ALLOW_METHODS", '["GET","POST","PUT","DELETE","OPTIONS"]') self.CORS_ALLOW_METHODS = self._parse_list(cors_methods) cors_headers = os.getenv("CORS_ALLOW_HEADERS", '["*"]') self.CORS_ALLOW_HEADERS = self._parse_list(cors_headers) # =========================================== # LLM & Embedding Provider Configuration # =========================================== self.LLM_PROVIDER = os.getenv("LLM_PROVIDER", "google") self.EMBEDDING_PROVIDER = os.getenv("EMBEDDING_PROVIDER", self.LLM_PROVIDER) # Default to same as LLM # OpenAI Configuration self.OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") self.OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-5-nano") self.OPENAI_TEMPERATURE = float(os.getenv("OPENAI_TEMPERATURE", "0.7")) self.OPENAI_MAX_TOKENS = int(os.getenv("OPENAI_MAX_TOKENS", "1000")) # Google AI Configuration self.GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") self.GOOGLE_MODEL = os.getenv("GOOGLE_MODEL", "gemini-2.5-flash") self.GOOGLE_TEMPERATURE = float(os.getenv("GOOGLE_TEMPERATURE", "0.7")) self.GOOGLE_MAX_TOKENS = int(os.getenv("GOOGLE_MAX_TOKENS", "1000")) # Hugging Face Configuration self.HUGGINGFACE_API_TOKEN = os.getenv("HUGGINGFACE_API_TOKEN") self.HUGGINGFACE_MODEL = os.getenv("HUGGINGFACE_MODEL", "microsoft/DialoGPT-medium") self.HUGGINGFACE_API_URL = os.getenv("HUGGINGFACE_API_URL", "https://api-inference.huggingface.co/models/") self.HUGGINGFACE_USE_GPU = os.getenv("HUGGINGFACE_USE_GPU", "false").lower() == "true" self.HUGGINGFACE_USE_API = os.getenv("HUGGINGFACE_USE_API", "false").lower() == "true" # Ollama Configuration self.OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") self.OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "llama3.1:8b") self.OLLAMA_TEMPERATURE = float(os.getenv("OLLAMA_TEMPERATURE", "0.7")) # =========================================== # Embedding Model Configuration # =========================================== # Note: Embedding provider is determined by LLM_PROVIDER setting above # OpenAI Embeddings self.OPENAI_EMBEDDING_MODEL = os.getenv("OPENAI_EMBEDDING_MODEL", "text-embedding-ada-002") # Google Embeddings self.GOOGLE_EMBEDDING_MODEL = os.getenv("GOOGLE_EMBEDDING_MODEL", "models/embedding-001") # Hugging Face Embeddings self.HUGGINGFACE_EMBEDDING_MODEL = os.getenv("HUGGINGFACE_EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2") # Ollama Embeddings self.OLLAMA_EMBEDDING_MODEL = os.getenv("OLLAMA_EMBEDDING_MODEL", "nomic-embed-text") # =========================================== # Logging Configuration # =========================================== self.LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") self.LOG_FORMAT = os.getenv("LOG_FORMAT", "%(asctime)s - %(name)s - %(levelname)s - %(message)s") self.LOG_FILE = os.getenv("LOG_FILE", "./logs/app.log") # =========================================== # Langchain Debugging Configuration # =========================================== # Note: set to "true" to enable detailed Langchain logs self.LANGCHAIN_DEBUG = os.getenv("LANGCHAIN_DEBUG", "false").lower() == "true" def _parse_list(self, value: str) -> List[str]: """Parse a string representation of a list into an actual list""" try: # Remove brackets and quotes, split by comma if value.startswith('[') and value.endswith(']'): value = value[1:-1] items = [item.strip().strip('"').strip("'") for item in value.split(',')] return [item for item in items if item] # Remove empty items except: return ["*"] # Fallback to allow all def get_llm_config(self): """Get LLM configuration based on selected provider""" if self.LLM_PROVIDER == "openai": return { "provider": "openai", "api_key": self.OPENAI_API_KEY, "model": self.OPENAI_MODEL, "temperature": self.OPENAI_TEMPERATURE, "max_tokens": self.OPENAI_MAX_TOKENS } elif self.LLM_PROVIDER == "google": return { "provider": "google", "api_key": self.GOOGLE_API_KEY, "model": self.GOOGLE_MODEL, "temperature": self.GOOGLE_TEMPERATURE, "max_tokens": self.GOOGLE_MAX_TOKENS } elif self.LLM_PROVIDER == "huggingface": return { "provider": "huggingface", "api_token": self.HUGGINGFACE_API_TOKEN, "model": self.HUGGINGFACE_MODEL, "api_url": self.HUGGINGFACE_API_URL, "use_gpu": self.HUGGINGFACE_USE_GPU, "use_api": self.HUGGINGFACE_USE_API } elif self.LLM_PROVIDER == "ollama": return { "provider": "ollama", "base_url": self.OLLAMA_BASE_URL, "model": self.OLLAMA_MODEL, "temperature": self.OLLAMA_TEMPERATURE } else: raise ValueError(f"Unsupported LLM provider: {self.LLM_PROVIDER}") def get_embedding_config(self): """Get embedding configuration based on EMBEDDING_PROVIDER setting""" provider = self.EMBEDDING_PROVIDER if provider == "openai": return { "provider": "openai", "api_key": self.OPENAI_API_KEY, "model": self.OPENAI_EMBEDDING_MODEL } elif provider == "google": return { "provider": "google", "api_key": self.GOOGLE_API_KEY, "model": self.GOOGLE_EMBEDDING_MODEL } elif provider == "huggingface": return { "provider": "huggingface", "model": self.HUGGINGFACE_EMBEDDING_MODEL } elif provider == "ollama": return { "provider": "ollama", "base_url": self.OLLAMA_BASE_URL, "model": self.OLLAMA_EMBEDDING_MODEL } else: raise ValueError(f"Unsupported provider: {provider}. Supported providers: openai, google, huggingface, ollama") # Create global settings instance settings = Settings() # Note: Vector store and database configuration is in database.py # from config.database import db_settings