"""Служебная задача: состояние векторного индекса для панели отладки. Индекс живёт в памяти и на диске worker-gpu, у API к нему доступа нет. Без этой задачи админка показывала покрытие L3 по колонке `documents.faiss_id` — а она врёт: пометка остаётся и тогда, когда вектор в индекс не попал (или индекс был пересоздан после смены модели эмбеддингов). Здесь возвращается то, что в индексе есть на самом деле. """ from typing import Any from celery.utils.log import get_task_logger from app.celery_app import celery_app from app.config import settings from app.vector_store import get_backend logger = get_task_logger(__name__) @celery_app.task(name="gpu.index_stats") def index_stats() -> dict[str, Any]: """Реальное число векторов в активном бэкенде (FAISS или Qdrant).""" backend = get_backend() try: # У FAISS индекс ленивый: без обращения ntotal вернёт 0 на холодном воркере if hasattr(backend, "_ensure"): backend._ensure() total = backend.total_vectors() except Exception as e: logger.warning(f"index_stats: не удалось прочитать индекс: {e}") return {"backend": settings.VECTOR_BACKEND, "error": str(e)[:200]} return { "backend": settings.VECTOR_BACKEND, "vectors": total, "dim": settings.EMBED_DIM, "embed_model": settings.EMBED_MODEL, }