Dhruv Pawar
Initial commit: add all project files
5e0ae28
"""
Application configuration settings
"""
import os
from pathlib import Path
from typing import ClassVar
class AppConfig:
"""
πŸŽ›οΈ CENTRALIZED APPLICATION CONFIGURATION
"""
# Environment
ENV: ClassVar[str] = os.getenv('APP_ENV', 'development')
DEBUG: ClassVar[bool] = ENV == 'development'
# Conversation Settings
MAX_HISTORY_LENGTH: ClassVar[int] = int(os.getenv('MAX_HISTORY_LENGTH', '10'))
MAX_CONVERSATION_STORAGE: ClassVar[int] = int(os.getenv('MAX_CONVERSATION_STORAGE', '1000'))
# Model Parameters
DEFAULT_TEMPERATURE: ClassVar[float] = float(os.getenv('DEFAULT_TEMPERATURE', '0.7'))
MIN_TEMPERATURE: ClassVar[float] = 0.0
MAX_TEMPERATURE: ClassVar[float] = 2.0
DEFAULT_MAX_TOKENS: ClassVar[int] = int(os.getenv('DEFAULT_MAX_TOKENS', '4000'))
MIN_TOKENS: ClassVar[int] = 100
MAX_TOKENS: ClassVar[int] = 32000
# API Settings
REQUEST_TIMEOUT: ClassVar[int] = int(os.getenv('REQUEST_TIMEOUT', '60'))
MAX_RETRIES: ClassVar[int] = int(os.getenv('MAX_RETRIES', '3'))
RETRY_DELAY: ClassVar[float] = float(os.getenv('RETRY_DELAY', '1.0'))
# Cache Settings
CACHE_SIZE: ClassVar[int] = int(os.getenv('CACHE_SIZE', '100'))
CACHE_TTL: ClassVar[int] = int(os.getenv('CACHE_TTL', '3600'))
ENABLE_CACHE: ClassVar[bool] = os.getenv('ENABLE_CACHE', 'true').lower() == 'true'
# Rate Limiting
RATE_LIMIT_REQUESTS: ClassVar[int] = int(os.getenv('RATE_LIMIT_REQUESTS', '50'))
RATE_LIMIT_WINDOW: ClassVar[int] = int(os.getenv('RATE_LIMIT_WINDOW', '60'))
ENABLE_RATE_LIMITING: ClassVar[bool] = os.getenv('ENABLE_RATE_LIMITING', 'true').lower() == 'true'
# File Storage
BASE_DIR: ClassVar[Path] = Path(__file__).parent.parent.parent
EXPORT_DIR: ClassVar[Path] = BASE_DIR / os.getenv('EXPORT_DIR', 'exports')
BACKUP_DIR: ClassVar[Path] = BASE_DIR / os.getenv('BACKUP_DIR', 'backups')
LOG_DIR: ClassVar[Path] = BASE_DIR / 'logs'
MAX_EXPORT_SIZE_MB: ClassVar[int] = 50
# UI Theme
THEME_PRIMARY: ClassVar[str] = os.getenv('THEME_PRIMARY', 'purple')
THEME_SECONDARY: ClassVar[str] = os.getenv('THEME_SECONDARY', 'blue')
# Analytics
AUTO_SAVE_INTERVAL: ClassVar[int] = 300
ENABLE_ANALYTICS: ClassVar[bool] = True
ANALYTICS_BATCH_SIZE: ClassVar[int] = 10
# Performance
MAX_WORKERS: ClassVar[int] = int(os.getenv('MAX_WORKERS', '3'))
ENABLE_PARALLEL_PROCESSING: ClassVar[bool] = True
# Security
MAX_INPUT_LENGTH: ClassVar[int] = 10000
ENABLE_XSS_PROTECTION: ClassVar[bool] = True
ALLOWED_EXPORT_FORMATS: ClassVar[list] = ['json', 'markdown', 'txt', 'pdf']
# Feature Flags
ENABLE_PDF_EXPORT: ClassVar[bool] = os.getenv('ENABLE_PDF_EXPORT', 'true').lower() == 'true'
ENABLE_SELF_CRITIQUE: ClassVar[bool] = True
ENABLE_SIDEBAR_TOGGLE: ClassVar[bool] = True
@classmethod
def validate(cls) -> bool:
"""Validates all configuration parameters"""
# Import logger here to avoid circular import
from src.utils.logger import logger
try:
assert cls.MIN_TEMPERATURE <= cls.DEFAULT_TEMPERATURE <= cls.MAX_TEMPERATURE
assert cls.MIN_TOKENS <= cls.DEFAULT_MAX_TOKENS <= cls.MAX_TOKENS
assert cls.MAX_HISTORY_LENGTH > 0
assert cls.MAX_CONVERSATION_STORAGE >= cls.MAX_HISTORY_LENGTH
assert cls.CACHE_SIZE > 0 and cls.CACHE_TTL > 0
assert cls.RATE_LIMIT_REQUESTS > 0 and cls.RATE_LIMIT_WINDOW > 0
assert cls.REQUEST_TIMEOUT > 0 and cls.MAX_RETRIES >= 0
assert 1 <= cls.MAX_WORKERS <= 10
assert cls.MAX_INPUT_LENGTH >= 1000
logger.info("βœ… Configuration validation passed")
return True
except AssertionError as e:
logger.error(f"❌ Configuration validation failed: {e}")
return False
@classmethod
def create_directories(cls) -> None:
"""Creates all required directories"""
# Import logger here to avoid circular import
from src.utils.logger import logger
directories = [cls.EXPORT_DIR, cls.BACKUP_DIR, cls.LOG_DIR]
try:
for directory in directories:
directory.mkdir(exist_ok=True, parents=True)
logger.debug(f"πŸ“ Directory ready: {directory}")
logger.info("βœ… All application directories initialized")
except Exception as e:
logger.error(f"❌ Failed to create directories: {e}")
raise
# Initialize directories and validate
AppConfig.create_directories()
if not AppConfig.validate():
raise RuntimeError("❌ Configuration validation failed")