RICS / app /vectorstore /factory.py
StormShadow308's picture
feat: async pipeline, job queue, generation hardening, and docs
732b14f
Raw
History Blame Contribute Delete
1.79 kB
"""Factory that returns the configured vector store singleton."""
import logging
from app.config import settings
from app.vectorstore.base import VectorStore
logger = logging.getLogger(__name__)
VECTORSTORE_BACKEND_LABEL = "faiss"
_instance: VectorStore | None = None
def _backend_label() -> str:
return (settings.vectorstore_backend or "faiss").strip().lower()
def get_vectorstore() -> VectorStore:
"""Return (or lazily create) the vector store singleton.
Backend is selected via ``settings.vectorstore_backend`` (``faiss`` or ``qdrant``).
"""
global _instance, VECTORSTORE_BACKEND_LABEL
if _instance is not None:
return _instance
from app.embeddings.factory import get_embedding_client
embedding = get_embedding_client()
backend = _backend_label()
VECTORSTORE_BACKEND_LABEL = backend
if backend == "qdrant":
from app.vectorstore.qdrant_wrapper import QdrantVectorStore
_instance = QdrantVectorStore(embedding=embedding)
logger.info("VectorStore: Qdrant (%s)", settings.qdrant_url)
else:
from app.vectorstore.faiss_wrapper import FAISSVectorStore
_instance = FAISSVectorStore(embedding=embedding)
logger.info("VectorStore: FAISS (LangChain, local disk)")
return _instance
def reset_vectorstore() -> None:
"""Reset the singleton (used in tests)."""
global _instance, VECTORSTORE_BACKEND_LABEL
_instance = None
VECTORSTORE_BACKEND_LABEL = "faiss"
try:
from app.retrieval.semantic_cache import reset_semantic_cache
reset_semantic_cache()
except ImportError:
pass
try:
from app.vectorstore.qdrant_async import reset_async_qdrant_client
reset_async_qdrant_client()
except ImportError:
pass