Files
ARC/backend/app/repositories/qdrant_repository.py
Chevallier a7d8914e25 first push
2026-06-12 18:16:58 +02:00

58 lines
2.3 KiB
Python

# backend/app/repositories/qdrant_repository.py
from typing import Optional, List
from qdrant_client import AsyncQdrantClient
from qdrant_client.http import models
from app.core.config import settings
class QdrantRepository:
def __init__(self):
# Initialisation du client asynchrone
self.client = AsyncQdrantClient(
url=settings.qdrant_url,
# api_key=getattr(settings, "qdrant_api_key", None) # Qdrant Cloud
)
self.collection_name = settings.qdrant_collection
async def init_collection(self, vector_size: int = 1024):
"""
Crée la collection si elle n'existe pas encore.
1024 correspond à la taille des vecteurs de Snowflake Arctic Embed 2.0 (large).
"""
exists = await self.client.collection_exists(collection_name=self.collection_name)
if not exists:
print(f"[Qdrant] Création de la collection '{self.collection_name}'...")
await self.client.create_collection(
collection_name=self.collection_name,
vectors_config=models.VectorParams(
size=vector_size,
distance=models.Distance.COSINE
)
)
print("[Qdrant] Collection créée avec succès.")
else:
print(f"[Qdrant] La collection '{self.collection_name}' existe déjà.")
async def search_similar_project(self, query_vector: List[float], limit: int = 1) -> Optional[dict]:
"""
Effectue la vraie recherche vectorielle.
Note : On passe un 'query_vector' (généré par ton embedding_service) et non du texte brut.
"""
try:
results = await self.client.search(
collection_name=self.collection_name,
query_vector=query_vector,
limit=limit
)
if results:
# On retourne le payload (les métadonnées du projet) du meilleur match
return results[0].payload
return None
except Exception as e:
print(f"[Qdrant] Erreur lors de la recherche : {e}")
return None
async def close(self):
"""Ferme proprement la connexion au client"""
await self.client.close()