WP15 #9

Merged
Lars merged 54 commits from WP15 into main 2025-12-13 06:39:48 +01:00
Showing only changes of commit 9a38daafc0 - Show all commits

View File

@ -7,42 +7,39 @@ import yaml
from pathlib import Path from pathlib import Path
from markdown_it import MarkdownIt from markdown_it import MarkdownIt
from markdown_it.token import Token from markdown_it.token import Token
import asyncio # Notwendig für asynchrone Chunking-Strategien import asyncio
# NEUE IMPORTS # NEUE IMPORTS
# Import der benötigten Klassen direkt (ersetzt get_semantic_analyzer)
try: try:
from app.services.semantic_analyzer import SemanticAnalyzer, SemanticChunkResult from app.services.semantic_analyzer import SemanticAnalyzer, SemanticChunkResult
except ImportError: 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.") print("WARNUNG: SemanticAnalyzer Service nicht gefunden. Semantic Chunking wird fehlschlagen.")
class SemanticAnalyzer: 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 @dataclass
class SemanticChunkResult: class SemanticChunkResult:
content: str 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]: 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. 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) fm_match = re.match(r'^---\s*\n(.*?)\n---', md_text, re.DOTALL)
if not fm_match: if not fm_match:
# Kein Frontmatter gefunden, gib leeres Dict und gesamten Text zurück
return {}, md_text return {}, md_text
frontmatter_yaml = fm_match.group(1) frontmatter_yaml = fm_match.group(1)
try: try:
# Nutzung von safe_load
frontmatter = yaml.safe_load(frontmatter_yaml) frontmatter = yaml.safe_load(frontmatter_yaml)
if not isinstance(frontmatter, dict): if not isinstance(frontmatter, dict):
frontmatter = {} 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) # 1. Frontmatter prüfen (Double-LLM-Prevention)
# Nutzen der lokalen, robusten Funktion
fm, body = extract_frontmatter_from_text(md_text) fm, body = extract_frontmatter_from_text(md_text)
note_status = fm.get("status", "").lower() note_status = fm.get("status", "").lower()
@ -369,10 +367,9 @@ async def assemble_chunks(note_id: str, md_text: str, note_type: str) -> List[Ch
# 3. Execution (Dispatcher) # 3. Execution (Dispatcher)
# Wir müssen den md_text neu zusammensetzen, falls der Body abgeschnitten wurde # Der Text, der an die Chunker-Strategie geht.
if body: # Da extract_frontmatter_from_text den Frontmatter entfernt hat,
md_to_chunk = md_text # Bei LLM oder By_Heading # ist der Body der saubere Text. md_text enthält ihn noch für non-Frontmatter-Logik.
else:
md_to_chunk = md_text md_to_chunk = md_text
if strategy == "semantic_llm": if strategy == "semantic_llm":