From c492f97a678cb2f10e688c2532f95a9b45a01891 Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 11 Nov 2025 17:40:34 +0100 Subject: [PATCH] Dateien nach "scripts" hochladen --- scripts/reset_qdrant.py | 43 +++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/scripts/reset_qdrant.py b/scripts/reset_qdrant.py index 4a04daa..015fa2d 100644 --- a/scripts/reset_qdrant.py +++ b/scripts/reset_qdrant.py @@ -2,28 +2,33 @@ # -*- coding: utf-8 -*- """ Name: scripts/reset_qdrant.py -Version: v1.1.1 (2025-09-05) +Version: v1.2.0 (2025-11-11) Kurzbeschreibung: Sicheres Zurücksetzen der Qdrant-Collections für EIN Projektpräfix. Das Skript ermittelt zunächst die tatsächlich betroffenen Collections und zeigt eine Übersicht an. Anschließend wird der User um Bestätigung gebeten (interaktive - Abfrage), bevor eine der beiden Aktionen ausgeführt wird: + Abfrage), bevor eine der Aktionen ausgeführt wird: - - wipe: Löscht die Collections komplett und legt sie gemäß Projekt-Defaults neu an - - truncate: Löscht nur alle Points (Inhalte), behält die Collection-Settings + - wipe: Löscht die Collections komplett und legt sie gemäß Projekt-Defaults neu an. + **Neu**: Danach werden *immer* die Payload-Indizes & Schema-Ergänzungen + über ensure_payload_indexes() idempotent eingerichtet (falls nicht mit --no-indexes deaktiviert). + - truncate: Löscht nur alle Points (Inhalte), behält die Collection-Settings. + **Neu**: Optional (Default) werden im Anschluss die Payload-Indizes geprüft/ergänzt. Aufruf (aus Projekt-Root, im venv): python3 -m scripts.reset_qdrant --mode wipe [--prefix PREFIX] [--yes] [--dry-run] python3 -m scripts.reset_qdrant --mode truncate [--prefix PREFIX] [--yes] [--dry-run] Parameter: - --mode wipe | truncate (Pflicht) - --prefix Collection-Prefix (Default: env COLLECTION_PREFIX oder 'mindnet') - --yes Keine Rückfrage, direkt ausführen (CI/CD geeignet) - --dry-run Nur anzeigen, was passieren würde; nichts ändern + --mode wipe | truncate (Pflicht) + --prefix Collection-Prefix (Default: env COLLECTION_PREFIX oder 'mindnet') + --yes Keine Rückfrage, direkt ausführen (CI/CD geeignet) + --dry-run Nur anzeigen, was passieren würde; nichts ändern + --no-indexes Überspringt den Schritt ensure_payload_indexes() (Standard: Indizes/Schema werden geprüft/ergänzt) Umgebungsvariablen (optional): QDRANT_URL, QDRANT_API_KEY, COLLECTION_PREFIX, VECTOR_DIM (Default 384) + (Zusätzliche ENV für Named Vectors etc. werden innerhalb ensure_collections/ensure_payload_indexes berücksichtigt.) Sicherheitsmerkmale: - Betrachtet ausschließlich Collections des angegebenen Präfixes. @@ -34,6 +39,8 @@ Exitcodes: 0 = OK, 1 = abgebrochen/keine Aktion, 2 = Verbindungs-/Konfigurationsfehler Changelog: + v1.2.0: ensure_payload_indexes() nach wipe/truncate standardmäßig ausführen (idempotent); --no-indexes Flag ergänzt. + v1.1.1: Stabilisierung & Preview (2025-09-05). v1.1.0: Interaktive Bestätigung, --yes/--dry-run hinzugefügt, Preview der betroffenen Collections. v1.0.0: Wipe/Truncate ohne Bestätigungsabfrage. """ @@ -46,7 +53,13 @@ from typing import List from qdrant_client import QdrantClient from qdrant_client.http import models as rest -from app.core.qdrant import QdrantConfig, get_client, ensure_collections, collection_names +from app.core.qdrant import ( + QdrantConfig, + get_client, + ensure_collections, + ensure_payload_indexes, + collection_names, +) def resolve_existing_collections(client: QdrantClient, prefix: str) -> List[str]: @@ -111,12 +124,13 @@ def wipe_collections(client: QdrantClient, all_col_names: List[str], existing: L def main(): - ap = argparse.ArgumentParser(description="Wipe oder truncate mindnet-Collections in Qdrant (mit Bestätigung).") + ap = argparse.ArgumentParser(description="Wipe oder truncate mindnet-Collections in Qdrant (mit Bestätigung & Index-Setup).") ap.add_argument("--mode", choices=["wipe", "truncate"], required=True, help="wipe = Collections löschen & neu anlegen; truncate = nur Inhalte löschen") ap.add_argument("--prefix", help="Collection-Prefix (Default: env COLLECTION_PREFIX oder 'mindnet')") ap.add_argument("--yes", action="store_true", help="Ohne Rückfrage ausführen (CI/CD)") ap.add_argument("--dry-run", action="store_true", help="Nur anzeigen, was passieren würde; nichts ändern") + ap.add_argument("--no-indexes", action="store_true", help="Überspringt ensure_payload_indexes()") args = ap.parse_args() # Qdrant-Konfiguration @@ -155,13 +169,22 @@ def main(): if args.mode == "wipe": wipe_collections(client, all_col_names, existing) ensure_collections(client, cfg.prefix, cfg.dim) + if not args.no_indexes: + ensure_payload_indexes(client, cfg.prefix) print(f"Wiped & recreated (Prefix={cfg.prefix}): {all_col_names}") + if not args.no_indexes: + print("Payload-Indizes & Schema-Ergänzungen geprüft/ergänzt (ensure_payload_indexes).") else: if not existing: print("Keine existierenden Collections zum Truncaten gefunden. Beende ohne Aktion.") sys.exit(0) delete_all_points(client, existing) + if not args.no_indexes: + # Auch nach truncate sicherstellen, dass neue/fehlende Indizes ergänzt werden + ensure_payload_indexes(client, cfg.prefix) print(f"Truncated (deleted all points in): {existing}") + if not args.no_indexes: + print("Payload-Indizes & Schema-Ergänzungen geprüft/ergänzt (ensure_payload_indexes).") if __name__ == "__main__":