Files
anti-plagiarism/services/worker-gpu/app/config.py
jze9 96a4530a93
All checks were successful
Deploy / test (push) Successful in 3m1s
Deploy / deploy (push) Successful in 19s
feat(llm): переключаемый бэкенд для L4 — Ollama или OpenRouter
LLM_BACKEND=ollama (дефолт, поведение не меняется) | openrouter (облачный
API, дешёвая модель — для да/нет+уверенность "ум" не критичен, зато
не нужен локальный GPU-хост вообще). Общая _complete() прячет разницу
форматов запроса/ответа за check_paraphrase/summarize.
2026-08-26 17:11:46 +05:00

83 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Конфигурация GPU воркера."""
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
"""Настройки GPU воркера."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore", # игнорировать поля общего .env, не относящиеся к воркеру
)
# PostgreSQL
POSTGRES_HOST: str = "postgres"
POSTGRES_PORT: int = 5432
POSTGRES_DB: str = "antiplagiator"
POSTGRES_USER: str = "antiplagiator"
POSTGRES_PASSWORD: str = "changeme"
# Redis
REDIS_URL: str = "redis://redis:6379/0"
# RabbitMQ
RABBITMQ_URL: str = "amqp://guest:guest@rabbitmq:5672/"
# MinIO
MINIO_ENDPOINT: str = "minio:9000"
MINIO_ACCESS_KEY: str = "minioadmin"
MINIO_SECRET_KEY: str = "changeme"
MINIO_BUCKET_DOCS: str = "documents"
# Elasticsearch
ELASTICSEARCH_URL: str = "http://elasticsearch:9200"
# Ollama
OLLAMA_URL: str = "http://ollama:11434"
# LLM_BACKEND: "ollama" (локальная модель, нужен GPU-хост) или "openrouter"
# (облачный API, дешёвая модель — для L4-проверки парафраза "умность" не
# критична, это не творческая задача). Переключается без изменения кода.
LLM_BACKEND: str = "ollama"
OPENROUTER_API_KEY: str = ""
OPENROUTER_MODEL: str = "deepseek/deepseek-chat"
OPENROUTER_URL: str = "https://openrouter.ai/api/v1/chat/completions"
# FAISS / ML
FAISS_INDEX_PATH: str = "/data/index/faiss.index"
FAISS_ID_MAP_PATH: str = "/data/index/faiss_id_map.json"
# EMBED_BACKEND: "ollama" (GGUF-модель через Vulkan, для AMD GPU без ROCm/atomics)
# или "sentence_transformers" (локальная загрузка, CUDA/CPU)
EMBED_BACKEND: str = "ollama"
EMBED_MODEL: str = "bge-m3"
EMBED_DEVICE: str = "cuda" # используется только при EMBED_BACKEND=sentence_transformers
EMBED_BATCH_SIZE: int = 64
EMBED_DIM: int = 1024 # bge-m3; было 768 у paraphrase-multilingual-mpnet-base-v2
FAISS_NLIST: int = 1024 # Количество кластеров для IVFFlat
FAISS_NPROBE: int = 64 # Количество кластеров для поиска
# Векторный бэкенд: "faiss" (файловый синглтон, дефолт) или "qdrant" (сервис,
# снимает SPOF и конкурентную запись). Переключается без изменения кода.
VECTOR_BACKEND: str = "faiss"
QDRANT_URL: str = "http://qdrant:6333"
QDRANT_COLLECTION: str = "documents"
# App
APP_URL: str = "https://academic.jze9.ru"
ENVIRONMENT: str = "development"
DEBUG: bool = False
@property
def database_url_sync(self) -> str:
"""Синхронный URL для SQLAlchemy (psycopg2)."""
return (
f"postgresql+psycopg2://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}"
f"@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}"
)
settings = Settings()