438399646f
Consolidate onto PostgreSQL by using pgvector instead of a separate ChromaDB instance. This removes a Docker volume, a large dependency, and simplifies the stack without meaningful performance impact at our document scale. - Swap langchain-chroma for langchain-postgres (PGVector) - Use pgvector/pgvector:pg16 Docker image with init script - Lazy-initialize vector store to avoid eager DB connections - Add SQL helpers for stats/delete/list (replacing _collection access) - Remove legacy main.py, chunker, petmd scraper, and /api/query endpoint Re-index required after deploy (POST /api/rag/index + /index-obsidian). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
from quart import Blueprint, jsonify
|
|
from quart_jwt_extended import jwt_refresh_token_required
|
|
|
|
from .logic import (
|
|
delete_all_documents,
|
|
get_vector_store_stats,
|
|
index_documents,
|
|
index_obsidian_documents,
|
|
)
|
|
from blueprints.users.decorators import admin_required
|
|
|
|
rag_blueprint = Blueprint("rag_api", __name__, url_prefix="/api/rag")
|
|
|
|
|
|
@rag_blueprint.get("/stats")
|
|
@jwt_refresh_token_required
|
|
async def get_stats():
|
|
"""Get vector store statistics."""
|
|
stats = get_vector_store_stats()
|
|
return jsonify(stats)
|
|
|
|
|
|
@rag_blueprint.post("/index")
|
|
@admin_required
|
|
async def trigger_index():
|
|
"""Trigger indexing of documents from Paperless-NGX. Admin only."""
|
|
try:
|
|
await index_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|
|
|
|
|
|
@rag_blueprint.post("/reindex")
|
|
@admin_required
|
|
async def trigger_reindex():
|
|
"""Clear and reindex all documents. Admin only."""
|
|
try:
|
|
delete_all_documents()
|
|
await index_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|
|
|
|
|
|
@rag_blueprint.post("/index-obsidian")
|
|
@admin_required
|
|
async def trigger_obsidian_index():
|
|
"""Index all Obsidian markdown documents into vector store. Admin only."""
|
|
try:
|
|
result = await index_obsidian_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "result": result, "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|