Spaces:
Running
Running
| 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 | |
| def delete(): | |
| try: | |
| delete_collection("D24F9DF2BB1C815C9A267C7DB5E3C9B9") | |
| return "Collection supprimée avec succès !", 200 | |
| except ChromaError as e: | |
| return jsonify({"error": str(e)}), 500 | |
| 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 | |
| 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 | |
| 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 | |
| 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) | |