File size: 1,794 Bytes
732b14f
dc1b199
 
 
732b14f
dc1b199
 
 
 
faa8fb3
 
dc1b199
 
 
732b14f
 
dc1b199
 
732b14f
 
dc1b199
732b14f
dc1b199
732b14f
dc1b199
 
 
49f0cfb
 
732b14f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dc1b199
 
 
 
32c4506
732b14f
dc1b199
732b14f
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""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