Files
zeekay 74110d03f8 chat-rag-api: add Qdrant (hanzoai/vector) backend
Extracted from the deployed chat-rag-api:0.7.8-hanzo image; adds a Qdrant
vector store targeting hanzoai/vector as a drop-in for pgvector.

- app/services/vector_store/qdrant_vector.py: QdrantVector(QdrantVectorStore)
  with the id helpers (get_all_ids/get_filtered_ids/get_documents_by_ids),
  delete-by-file_id, and the route's Mongo-style file_id filter translated to
  native Qdrant filters. file_id stored in payload metadata (unique point ids).
- factory.get_vector_store: mode='qdrant' (lazy import; pg/atlas deploys
  unaffected).
- config: VectorDBType.QDRANT + QDRANT_URL/QDRANT_API_KEY/QDRANT_DISTANCE/
  EMBEDDINGS_DIM(1536) + construction branch.
- health: qdrant_health_check (client.get_collections()).
- requirements: langchain-qdrant==0.2.0, qdrant-client==1.12.1.

Verified: pytest tests/test_qdrant_vector.py (4 tests) against in-memory
Qdrant; factory builds QdrantVector with all route methods present.
2026-06-23 21:47:45 -07:00

57 lines
1.9 KiB
Python

from typing import Optional
from pymongo import MongoClient
from langchain_core.embeddings import Embeddings
from .async_pg_vector import AsyncPgVector
from .atlas_mongo_vector import AtlasMongoVector
from .extended_pg_vector import ExtendedPgVector
def get_vector_store(
connection_string: str,
embeddings: Embeddings,
collection_name: str,
mode: str = "sync",
search_index: Optional[str] = None,
# qdrant-only options (hanzoai/vector)
qdrant_url: Optional[str] = None,
qdrant_api_key: Optional[str] = None,
qdrant_dim: Optional[int] = None,
qdrant_distance: str = "cosine",
qdrant_prefer_grpc: bool = False,
):
if mode == "sync":
return ExtendedPgVector(
connection_string=connection_string,
embedding_function=embeddings,
collection_name=collection_name,
)
elif mode == "async":
return AsyncPgVector(
connection_string=connection_string,
embedding_function=embeddings,
collection_name=collection_name,
)
elif mode == "atlas-mongo":
mongo_db = MongoClient(connection_string).get_database()
mong_collection = mongo_db[collection_name]
return AtlasMongoVector(
collection=mong_collection, embedding=embeddings, index_name=search_index
)
elif mode == "qdrant":
# Imported lazily so pgvector/atlas deployments don't need qdrant deps.
from .qdrant_vector import QdrantVector
return QdrantVector.from_config(
url=qdrant_url,
api_key=qdrant_api_key,
collection_name=collection_name,
embeddings=embeddings,
dim=qdrant_dim,
distance=qdrant_distance,
prefer_grpc=qdrant_prefer_grpc,
)
else:
raise ValueError(
"Invalid mode specified. Choose 'sync', 'async', 'atlas-mongo', or 'qdrant'."
)