|
|
""" |
|
|
Application configuration settings |
|
|
""" |
|
|
import os |
|
|
from pathlib import Path |
|
|
from typing import ClassVar |
|
|
|
|
|
|
|
|
class AppConfig: |
|
|
""" |
|
|
ποΈ CENTRALIZED APPLICATION CONFIGURATION |
|
|
""" |
|
|
|
|
|
|
|
|
ENV: ClassVar[str] = os.getenv('APP_ENV', 'development') |
|
|
DEBUG: ClassVar[bool] = ENV == 'development' |
|
|
|
|
|
|
|
|
MAX_HISTORY_LENGTH: ClassVar[int] = int(os.getenv('MAX_HISTORY_LENGTH', '10')) |
|
|
MAX_CONVERSATION_STORAGE: ClassVar[int] = int(os.getenv('MAX_CONVERSATION_STORAGE', '1000')) |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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_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_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' |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
THEME_PRIMARY: ClassVar[str] = os.getenv('THEME_PRIMARY', 'purple') |
|
|
THEME_SECONDARY: ClassVar[str] = os.getenv('THEME_SECONDARY', 'blue') |
|
|
|
|
|
|
|
|
AUTO_SAVE_INTERVAL: ClassVar[int] = 300 |
|
|
ENABLE_ANALYTICS: ClassVar[bool] = True |
|
|
ANALYTICS_BATCH_SIZE: ClassVar[int] = 10 |
|
|
|
|
|
|
|
|
MAX_WORKERS: ClassVar[int] = int(os.getenv('MAX_WORKERS', '3')) |
|
|
ENABLE_PARALLEL_PROCESSING: ClassVar[bool] = True |
|
|
|
|
|
|
|
|
MAX_INPUT_LENGTH: ClassVar[int] = 10000 |
|
|
ENABLE_XSS_PROTECTION: ClassVar[bool] = True |
|
|
ALLOWED_EXPORT_FORMATS: ClassVar[list] = ['json', 'markdown', 'txt', 'pdf'] |
|
|
|
|
|
|
|
|
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""" |
|
|
|
|
|
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""" |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
AppConfig.create_directories() |
|
|
if not AppConfig.validate(): |
|
|
raise RuntimeError("β Configuration validation failed") |
|
|
|