From 9a38daafc0b8f6b07786289a64177549039b8e30 Mon Sep 17 00:00:00 2001 From: Lars Date: Fri, 12 Dec 2025 09:02:32 +0100 Subject: [PATCH] WP15 - Chunker --- app/core/chunker.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/core/chunker.py b/app/core/chunker.py index f521427..e75b835 100644 --- a/app/core/chunker.py +++ b/app/core/chunker.py @@ -7,42 +7,39 @@ import yaml from pathlib import Path from markdown_it import MarkdownIt from markdown_it.token import Token -import asyncio # Notwendig für asynchrone Chunking-Strategien +import asyncio # NEUE IMPORTS -# Import der benötigten Klassen direkt (ersetzt get_semantic_analyzer) try: from app.services.semantic_analyzer import SemanticAnalyzer, SemanticChunkResult except ImportError: - # Fallback für Tests, wenn der Service noch nicht auf dem Pfad ist + # Fallback für Tests print("WARNUNG: SemanticAnalyzer Service nicht gefunden. Semantic Chunking wird fehlschlagen.") class SemanticAnalyzer: - async def analyze_and_chunk(self, text, type): return [] + async def analyze_and_chunk(self, text, type): return [SemanticChunkResult(content=text, suggested_edges=[])] @dataclass class SemanticChunkResult: content: str - suggested_edges: List[str] # Format: "kind:Target" + suggested_edges: List[str] # ========================================== -# 1. FUNKTION ZUM AUSLESEN DES FRONTMATTERS +# 1. FUNKTION ZUM AUSLESEN DES FRONTMATTERS (Lokalisiert und stabil) # ========================================== def extract_frontmatter_from_text(md_text: str) -> Tuple[Dict[str, Any], str]: """ Extrakte das YAML Frontmatter aus dem Markdown-Text und gibt den Body zurück. - (Lokalisiert im Chunker zur Vermeidung von Import-Zyklen/Fehlern) """ - # Regulärer Ausdruck, der den YAML-Block findet fm_match = re.match(r'^---\s*\n(.*?)\n---', md_text, re.DOTALL) if not fm_match: - # Kein Frontmatter gefunden, gib leeres Dict und gesamten Text zurück return {}, md_text frontmatter_yaml = fm_match.group(1) try: + # Nutzung von safe_load frontmatter = yaml.safe_load(frontmatter_yaml) if not isinstance(frontmatter, dict): frontmatter = {} @@ -352,6 +349,7 @@ async def assemble_chunks(note_id: str, md_text: str, note_type: str) -> List[Ch """ # 1. Frontmatter prüfen (Double-LLM-Prevention) + # Nutzen der lokalen, robusten Funktion fm, body = extract_frontmatter_from_text(md_text) note_status = fm.get("status", "").lower() @@ -369,11 +367,10 @@ async def assemble_chunks(note_id: str, md_text: str, note_type: str) -> List[Ch # 3. Execution (Dispatcher) - # Wir müssen den md_text neu zusammensetzen, falls der Body abgeschnitten wurde - if body: - md_to_chunk = md_text # Bei LLM oder By_Heading - else: - md_to_chunk = md_text + # Der Text, der an die Chunker-Strategie geht. + # Da extract_frontmatter_from_text den Frontmatter entfernt hat, + # ist der Body der saubere Text. md_text enthält ihn noch für non-Frontmatter-Logik. + md_to_chunk = md_text if strategy == "semantic_llm": # LLM-Strategie nutzt den gesamten MD-Text zur Orientierung