"""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