92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
"""
|
||
Конфигурация RAG сервиса через переменные окружения.
|
||
"""
|
||
|
||
import os
|
||
import secrets
|
||
from dataclasses import dataclass, field
|
||
|
||
|
||
@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")))
|
||
max_submitted: int = field(default_factory=lambda: int(os.getenv("RAG_MAX_SUBMITTED", "5000")))
|
||
submitted_path: str = field(
|
||
default_factory=lambda: os.getenv("RAG_SUBMITTED_PATH", "data/vectors/submitted.npz")
|
||
)
|
||
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: str | None = 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: Settings | None = None
|
||
|
||
|
||
def get_settings() -> Settings:
|
||
"""
|
||
Возвращает глобальный экземпляр настроек.
|
||
|
||
Returns:
|
||
Settings: Настройки приложения
|
||
"""
|
||
global _settings
|
||
if _settings is None:
|
||
_settings = Settings()
|
||
return _settings
|