WP15 - Chunker

This commit is contained in:
Lars 2025-12-12 09:02:32 +01:00
parent e5bc77b93e
commit 9a38daafc0

View File

@ -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,10 +367,9 @@ 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:
# 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":