| | """ |
| | Configuration settings management. |
| | """ |
| |
|
| | import os |
| | import yaml |
| | from typing import Dict, Any, Optional |
| | from pathlib import Path |
| |
|
| | class Settings: |
| | """Application settings manager.""" |
| | |
| | def __init__(self, config_file: str = "config/config.yaml"): |
| | """ |
| | Initialize settings from config file and environment variables. |
| | |
| | Args: |
| | config_file (str): Path to configuration file |
| | """ |
| | self.config_file = config_file |
| | self.config = self._load_config() |
| | self._override_with_env() |
| | |
| | def _load_config(self) -> Dict[str, Any]: |
| | """Load configuration from YAML file.""" |
| | try: |
| | config_path = Path(self.config_file) |
| | if config_path.exists(): |
| | with open(config_path, 'r', encoding='utf-8') as f: |
| | return yaml.safe_load(f) or {} |
| | else: |
| | return self._get_default_config() |
| | except Exception as e: |
| | print(f"Error loading config file: {e}") |
| | return self._get_default_config() |
| | |
| | def _get_default_config(self) -> Dict[str, Any]: |
| | """Get default configuration.""" |
| | return { |
| | 'app': { |
| | 'title': 'AI-Powered YouTube Transcript Tutor', |
| | 'description': 'Ask questions from YouTube lecture transcripts using AI', |
| | 'version': '1.0.0' |
| | }, |
| | 'ui': { |
| | 'theme': 'light', |
| | 'sidebar_width': 300, |
| | 'max_chat_history_display': 50, |
| | 'enable_animations': True |
| | }, |
| | 'processing': { |
| | 'default_chunk_size': 1000, |
| | 'chunk_overlap': 200, |
| | 'max_transcript_length': 1000000, |
| | 'supported_languages': ['en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'ja', 'ko', 'zh'], |
| | 'default_language': 'en' |
| | }, |
| | 'ai': { |
| | 'model_temperature': 0.7, |
| | 'max_tokens': 2000, |
| | 'retrieval_k': 4, |
| | 'chain_type': 'stuff' |
| | }, |
| | 'export': { |
| | 'formats': ['pdf', 'txt', 'json'], |
| | 'max_export_entries': 1000, |
| | 'pdf_page_size': 'A4' |
| | }, |
| | 'cache': { |
| | 'enable_vectorstore_cache': True, |
| | 'cache_directory': 'cache', |
| | 'max_cache_size_mb': 500 |
| | }, |
| | 'logging': { |
| | 'level': 'INFO', |
| | 'file': 'logs/app.log', |
| | 'max_file_size_mb': 10, |
| | 'backup_count': 5 |
| | }, |
| | 'security': { |
| | 'max_url_length': 2048, |
| | 'allowed_domains': ['youtube.com', 'youtu.be', 'm.youtube.com'], |
| | 'rate_limit_requests': 100, |
| | 'rate_limit_window_minutes': 60 |
| | } |
| | } |
| | |
| | def _override_with_env(self): |
| | """Override configuration with environment variables.""" |
| | |
| | openai_key = os.getenv('OPENAI_API_KEY') |
| | if openai_key: |
| | if 'ai' not in self.config: |
| | self.config['ai'] = {} |
| | self.config['ai']['openai_api_key'] = openai_key |
| | |
| | |
| | log_level = os.getenv('LOG_LEVEL') |
| | if log_level: |
| | self.config['logging']['level'] = log_level.upper() |
| | |
| | |
| | cache_dir = os.getenv('CACHE_DIRECTORY') |
| | if cache_dir: |
| | self.config['cache']['cache_directory'] = cache_dir |
| | |
| | def get(self, key: str, default: Any = None) -> Any: |
| | """ |
| | Get configuration value using dot notation. |
| | |
| | Args: |
| | key (str): Configuration key (e.g., 'app.title') |
| | default (Any): Default value if key not found |
| | |
| | Returns: |
| | Any: Configuration value |
| | """ |
| | keys = key.split('.') |
| | value = self.config |
| | |
| | try: |
| | for k in keys: |
| | value = value[k] |
| | return value |
| | except (KeyError, TypeError): |
| | return default |
| | |
| | def set(self, key: str, value: Any): |
| | """ |
| | Set configuration value using dot notation. |
| | |
| | Args: |
| | key (str): Configuration key (e.g., 'app.title') |
| | value (Any): Value to set |
| | """ |
| | keys = key.split('.') |
| | config = self.config |
| | |
| | for k in keys[:-1]: |
| | if k not in config: |
| | config[k] = {} |
| | config = config[k] |
| | |
| | config[keys[-1]] = value |
| | |
| | def get_openai_api_key(self) -> Optional[str]: |
| | """Get OpenAI API key from config or environment.""" |
| | return self.get('ai.openai_api_key') or os.getenv('OPENAI_API_KEY') |
| | |
| | def get_app_config(self) -> Dict[str, Any]: |
| | """Get application configuration.""" |
| | return self.get('app', {}) |
| | |
| | def get_ui_config(self) -> Dict[str, Any]: |
| | """Get UI configuration.""" |
| | return self.get('ui', {}) |
| | |
| | def get_processing_config(self) -> Dict[str, Any]: |
| | """Get processing configuration.""" |
| | return self.get('processing', {}) |
| | |
| | def get_ai_config(self) -> Dict[str, Any]: |
| | """Get AI configuration.""" |
| | return self.get('ai', {}) |
| | |
| | def get_export_config(self) -> Dict[str, Any]: |
| | """Get export configuration.""" |
| | return self.get('export', {}) |
| | |
| | def get_cache_config(self) -> Dict[str, Any]: |
| | """Get cache configuration.""" |
| | return self.get('cache', {}) |
| | |
| | def get_logging_config(self) -> Dict[str, Any]: |
| | """Get logging configuration.""" |
| | return self.get('logging', {}) |
| | |
| | def get_security_config(self) -> Dict[str, Any]: |
| | """Get security configuration.""" |
| | return self.get('security', {}) |
| |
|
| | |
| | settings = Settings() |
| |
|