import os import re import urllib.parse from dotenv import load_dotenv class Config: def __init__(self): load_dotenv() # Detect if running on HF Spaces self.is_hf_space = bool(os.getenv("SPACE_ID")) # API tokens self.hf_token = os.getenv("HF_TOKEN") self.openai_api_key = os.getenv("OPENAI_API_KEY") # API endpoints self.hf_api_url = self._sanitize_url(os.getenv("HF_API_ENDPOINT_URL", "https://api-inference.huggingface.co/v1/")) # Fallback settings self.use_fallback = os.getenv("USE_FALLBACK", "true").lower() == "true" # Redis configuration (optional for HF) self.redis_host = self._sanitize_host(os.getenv("REDIS_HOST", "")) self.redis_port = int(os.getenv("REDIS_PORT", "6379")) self.redis_username = os.getenv("REDIS_USERNAME", "") self.redis_password = os.getenv("REDIS_PASSWORD", "") self.redis_retries = int(os.getenv("REDIS_RETRIES", "3")) self.redis_retry_delay = int(os.getenv("REDIS_RETRY_DELAY", "1")) self.redis_disable_ssl = os.getenv("REDIS_DISABLE_SSL", "false").lower() == "true" # Local model configuration self.local_model_name = os.getenv("LOCAL_MODEL_NAME", "mistral:latest") self.ollama_host = self._sanitize_url(os.getenv("OLLAMA_HOST", "")) # OpenWeather API self.openweather_api_key = os.getenv("OPENWEATHER_API_KEY") def _sanitize_url(self, url: str) -> str: """Sanitize URL by removing whitespace and control characters""" if not url: return "" # Remove leading/trailing whitespace and control characters url = url.strip() # Remove any newlines, carriage returns, tabs, and null bytes url = re.sub(r'[\r\n\t\0\x0b\x0c]+', '', url) # Remove any trailing URL encoding artifacts url = url.rstrip('%0a').rstrip('%0d') # Validate URL format - if it looks like a URL but missing scheme if url and not re.match(r'^https?://', url): # Check if it looks like a domain if re.match(r'^[a-zA-Z0-9.-]+(?:\.[a-zA-Z]{2,})+', url) or 'ngrok' in url: # Assume https for ngrok and domains url = 'https://' + url else: # Otherwise default to http url = 'http://' + url return url def _sanitize_host(self, host: str) -> str: """Sanitize host by removing whitespace and control characters""" if not host: return "" # Remove leading/trailing whitespace and control characters host = host.strip() # Remove any newlines, carriage returns, tabs, and null bytes host = re.sub(r'[\r\n\t\0\x0b\x0c]+', '', host) # Remove any trailing URL encoding artifacts host = host.rstrip('%0a').rstrip('%0d') return host # Global config instance config = Config()