"""Central configuration for the CineMatch engine (env-overridable).""" from __future__ import annotations from pathlib import Path from pydantic_settings import BaseSettings, SettingsConfigDict BACKEND_DIR = Path(__file__).resolve().parents[1] DATA_DIR = BACKEND_DIR / "data" class Settings(BaseSettings): model_config = SettingsConfigDict(env_prefix="CINEMATCH_", env_file=".env", extra="ignore") # ---- data / index paths ---- corpus_path: Path = DATA_DIR / "corpus.json" embeddings_path: Path = DATA_DIR / "embeddings.npy" faiss_path: Path = DATA_DIR / "faiss.index" meta_path: Path = DATA_DIR / "index_meta.json" # ---- models ---- embedding_model: str = "BAAI/bge-small-en-v1.5" reranker_model: str = "cross-encoder/ms-marco-MiniLM-L-6-v2" enable_reranker: bool = True # ---- BM25+ hyper-params (tuned for short keyword-dense docs) ---- bm25_k1: float = 1.5 bm25_b: float = 0.75 bm25_delta: float = 1.0 # ---- retrieval / fusion ---- candidate_pool: int = 80 # top-k pulled from each retriever before fusion rerank_pool: int = 40 # top-k of the fused list handed to the reranker rrf_k: int = 60 # RRF damping constant # ---- SLM (Ollama) ---- ollama_host: str = "http://localhost:11434" ollama_model: str = "qwen2.5:3b" enable_slm: bool = True # attempt Ollama; falls back to templates slm_timeout: float = 12.0 # ---- server ---- cors_origins: list[str] = ["http://localhost:3000", "http://127.0.0.1:3000"] settings = Settings()