WP15 #9
|
|
@ -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":
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user