From 58bce0ea19d19b69cf1c4ea8f0271348a470cf91 Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 9 Sep 2025 19:57:32 +0200 Subject: [PATCH] scripts/import_markdown.py aktualisiert --- scripts/import_markdown.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/import_markdown.py b/scripts/import_markdown.py index 546b4e9..b8339fa 100644 --- a/scripts/import_markdown.py +++ b/scripts/import_markdown.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- """ Script: scripts/import_markdown.py — Markdown → Qdrant (Notes, Chunks, Edges) -Version: 3.6.1 +Version: 3.6.2 Datum: 2025-09-09 Kurzbeschreibung @@ -11,6 +11,8 @@ Kurzbeschreibung - Robuste Änderungserkennung: Mehrfach-Hashes werden parallel in der Note gespeichert (Option C). Vergleich erfolgt **modusgenau** anhand von `hashes[::]`. Ein Wechsel des Vergleichsmodus führt so **nicht** zu Massenänderungen. +- **Fix (v3.6.2):** Bei **erstem Import** (kein Alt-Payload) wird die Note als **geändert** + behandelt → Create (Notes/Chunks/Edges) findet zuverlässig statt. - Baseline-Modus: Mit `--baseline-modes` werden **fehlende** Hash-Varianten im Feld `hashes` „still“ nachgetragen (Upsert NUR Notes; Legacy-Hashfelder bleiben unangetastet). @@ -257,6 +259,8 @@ def main() -> None: # -------- Fetch old payload -------- old_payload = None if args.force_replace else fetch_existing_note_payload(client, cfg.prefix, note_id) + has_old = old_payload is not None + old_hashes = (old_payload or {}).get("hashes") or {} old_hash_exact = old_hashes.get(key_current) @@ -265,8 +269,10 @@ def main() -> None: needs_baseline = (old_hash_exact is None) - # Change-Detection: nur wenn Baseline existiert und Hash differiert, - # oder wenn force/text_changed explizit Änderungen anzeigt. + # Change-Detection: + # - CREATE: wenn es KEIN Alt-Payload gibt -> changed=True + # - UPDATE: baseline existiert UND Hash differiert + # - force/text_changed wie gehabt hash_changed = (old_hash_exact is not None and new_hash_exact is not None and old_hash_exact != new_hash_exact) text_changed = False @@ -275,18 +281,18 @@ def main() -> None: new_text = note_pl.get("fulltext") or "" text_changed = (old_text != new_text) - changed = args.force_replace or hash_changed or text_changed + changed = args.force_replace or (not has_old) or hash_changed or text_changed - # Soll Baseline „still“ ergänzt werden? - do_baseline_only = (args.baseline_modes and needs_baseline and not changed) + # Baseline-only nur, wenn Alt-Payload existiert UND Key fehlt UND keine sonstige Änderung + do_baseline_only = (args.baseline_modes and has_old and needs_baseline and not changed) # -------- Optional: Chunks / Embeddings / Edges vorbereiten -------- - # Nur notwendig, wenn wir tatsächlich Änderungen schreiben (nicht für baseline-only). + # CREATE/UPDATE: wir brauchen Chunks/Edges; Baseline-only: nein chunks = [] chunk_pls = [] edges = [] vecs = [] - if (changed and args.apply): + if (args.apply and (changed and (not do_baseline_only))): try: chunks = assemble_chunks(fm["id"], getattr(parsed, "body", "") or "", fm.get("type", "concept")) chunk_pls = make_chunk_payloads(fm, note_pl["path"], chunks) @@ -352,11 +358,11 @@ def main() -> None: upsert_batch(client, notes_name, note_pts) continue - # Normale Änderungen schreiben (Notes + Chunks + Edges) + # Normale CREATE/UPDATE if not changed: continue - if args.purge_before_upsert: + if args.purge_before_upsert and has_old: try: purge_note_artifacts(client, cfg.prefix, note_id) except Exception as e: