from flask import Flask, request, jsonify from flask_cors import CORS from chromadb.errors import ChromaError from chromedb_service import ( add_document, search, delete_document, delete_collection, add_image_to_chroma ) app = Flask(__name__) CORS(app) # Permettre les requêtes cross-origin @app.route("/delete", methods=["GET"]) def delete(): try: delete_collection("D24F9DF2BB1C815C9A267C7DB5E3C9B9") return "Collection supprimée avec succès !", 200 except ChromaError as e: return jsonify({"error": str(e)}), 500 @app.route("/embedding", methods=["POST"]) def embedding(): data = request.json collection_name = data.get("collectionName") doc_id = data.get("id") text = data.get("text") metadata = data.get("metadata") try: add_document(collection_name, doc_id, text, metadata) return jsonify({"message": "Document ajouté avec succès"}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/image-embedding", methods=["POST"]) def image_embedding(): data = request.json collection_name = data.get("collectionName") doc_id = data.get("id") image_path = data.get("imagePath") metadata = data.get("metadata") try: add_image_to_chroma(collection_name, doc_id, image_path, metadata) return jsonify({"message": "Image ajoutée avec succès"}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/search", methods=["POST"]) def search_query(): data = request.json query = data.get("query") collection_name = data.get("collectionName") metadata = data.get("metadata") n_results = data.get("nResults", 10) try: results = search(collection_name, query, metadata, n_results) return jsonify({"results": results}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/search-multi", methods=["POST"]) def search_multi_query(): """ Recherche avec une liste de queries (multi-query) pour style / contexte. """ data = request.json queries = data.get("queries") # ATTENTION : maintenant on attend une liste collection_name = data.get("collectionName") metadata = data.get("metadata") n_results = data.get("nResults", 10) if not queries or not isinstance(queries, list): return jsonify({"error": "Le champ 'queries' doit être une liste de chaînes"}), 400 try: all_results = [] for query in queries: results = search(collection_name, query, metadata, n_results) all_results.extend(results) # 🔥 Fusion et tri par score décroissant # si plusieurs résultats avec le même id, garder le max score merged = {} for r in all_results: if r["id"] not in merged or r["score"] > merged[r["id"]]["score"]: merged[r["id"]] = r final_results = sorted(merged.values(), key=lambda x: x["score"], reverse=True) return jsonify({"results": final_results[:n_results]}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == "__main__": app.run(host="0.0.0.0",debug=True, port=7860)