""" Конфигурация RAG сервиса через переменные окружения. """ import os import secrets from dataclasses import dataclass, field from typing import Optional @dataclass class Settings: """ Настройки RAG сервиса. Все параметры загружаются из переменных окружения. """ # Модель model_name: str = field( default_factory=lambda: os.getenv("RAG_MODEL", "sentence-transformers/all-MiniLM-L12-v2") ) cache_dir: str = field( default_factory=lambda: os.getenv("RAG_CACHE_DIR", "data/models") ) # VectorStore vectors_path: str = field( default_factory=lambda: os.getenv("RAG_VECTORS_PATH", "data/vectors/vectors.npz") ) max_examples: int = field( default_factory=lambda: int(os.getenv("RAG_MAX_EXAMPLES", "10000")) ) score_multiplier: float = field( default_factory=lambda: float(os.getenv("RAG_SCORE_MULTIPLIER", "5.0")) ) # Батч-обработка batch_size: int = field( default_factory=lambda: int(os.getenv("RAG_BATCH_SIZE", "16")) ) # Минимальная длина текста min_text_length: int = field( default_factory=lambda: int(os.getenv("RAG_MIN_TEXT_LENGTH", "3")) ) # API настройки api_host: str = field( default_factory=lambda: os.getenv("RAG_API_HOST", "0.0.0.0") ) api_port: int = field( default_factory=lambda: int(os.getenv("RAG_API_PORT", "8000")) ) # Безопасность # API ключ для авторизации (обязателен в продакшене!) api_key: Optional[str] = field( default_factory=lambda: os.getenv("RAG_API_KEY") ) # Разрешить запросы без ключа (только для разработки) allow_no_auth: bool = field( default_factory=lambda: os.getenv("RAG_ALLOW_NO_AUTH", "false").lower() == "true" ) # Логирование log_level: str = field( default_factory=lambda: os.getenv("LOG_LEVEL", "INFO") ) # Автосохранение (интервал в секундах, 0 = отключено) autosave_interval: int = field( default_factory=lambda: int(os.getenv("RAG_AUTOSAVE_INTERVAL", "600")) # 10 минут ) # Размерность векторов (384 для all-MiniLM-L12-v2) vector_dim: int = 384 @property def is_auth_required(self) -> bool: """Проверяет, требуется ли авторизация.""" return self.api_key is not None and not self.allow_no_auth @staticmethod def generate_api_key() -> str: """Генерирует случайный API ключ.""" return secrets.token_urlsafe(32) # Глобальный экземпляр настроек _settings: Optional[Settings] = None def get_settings() -> Settings: """ Возвращает глобальный экземпляр настроек. Returns: Settings: Настройки приложения """ global _settings if _settings is None: _settings = Settings() return _settings