From 30047f8e006394957f5375a242007fc94a5f1d94 Mon Sep 17 00:00:00 2001 From: Lars Date: Fri, 12 Dec 2025 15:55:08 +0100 Subject: [PATCH] ui fix prompt fix --- app/frontend/ui.py | 23 ++++++++++++++++++++--- config/prompts.yaml | 11 +++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/frontend/ui.py b/app/frontend/ui.py index c0079f1..c27d3b2 100644 --- a/app/frontend/ui.py +++ b/app/frontend/ui.py @@ -113,11 +113,13 @@ def parse_markdown_draft(full_text): """Robustes Parsing + Sanitization.""" clean_text = full_text + # 1. Markdown Code-Blöcke entfernen pattern_block = r"```(?:markdown|md)?\s*(.*?)\s*```" match_block = re.search(pattern_block, full_text, re.DOTALL | re.IGNORECASE) if match_block: clean_text = match_block.group(1).strip() + # 2. Split YAML / Body parts = re.split(r"^---+\s*$", clean_text, maxsplit=2, flags=re.MULTILINE) meta = {} @@ -126,14 +128,29 @@ def parse_markdown_draft(full_text): if len(parts) >= 3: yaml_str = parts[1] body_candidate = parts[2] + + # --- FIX 1: Hashtag-Cleaner für YAML --- + # Entfernt #, wenn sie innerhalb von [] stehen, um YAML-Kommentare zu verhindern. + # Wir entfernen pauschal # im YAML-Block, da Tags dort keine brauchen. + yaml_str_clean = yaml_str.replace("#", "") + try: - parsed = yaml.safe_load(yaml_str) + parsed = yaml.safe_load(yaml_str_clean) if isinstance(parsed, dict): meta = parsed body = body_candidate.strip() - except Exception: - pass + except Exception as e: + print(f"YAML Parsing Warning: {e}") + # Fallback: Body retten, Meta leer lassen + body = body_candidate.strip() + # --- FIX 2: Type/Status Swap Korrektur --- + # Wenn das LLM halluziniert hat: type='draft' -> Das ist eigentlich der Status. + if meta.get("type") == "draft": + meta["status"] = "draft" + # Wir raten einen besseren Typ oder setzen default + meta["type"] = "experience" # Da Interviews oft Experiences sind + return normalize_meta_and_body(meta, body) def build_markdown_doc(meta, body): diff --git a/config/prompts.yaml b/config/prompts.yaml index cacd2da..6e00918 100644 --- a/config/prompts.yaml +++ b/config/prompts.yaml @@ -97,7 +97,6 @@ technical_template: | # --------------------------------------------------------- # 5. INTERVIEW: Der "One-Shot Extractor" (Performance Mode) # --------------------------------------------------------- - interview_template: | TASK: Erstelle einen Markdown-Entwurf für eine Notiz vom Typ '{target_type}'. @@ -114,14 +113,14 @@ interview_template: | OUTPUT REGELN (STRIKT BEACHTEN): A. FRONTMATTER (YAML): - - Darf NUR folgende Felder enthalten: [type, status, title, tags]. - - Schreibe KEINE inhaltlichen Sätze (wie 'Situation', 'Ziel') in das YAML! - - Setze 'status: draft'. + - 'type': Muss '{target_type}' sein (oder 'experience', 'project' etc.). NIEMALS 'draft'. + - 'status': Muss IMMER 'draft' sein. + - 'tags': Eine JSON-Liste von Strings OHNE Hashtags. Beispiel: ['Recycling', 'Konflikt']. NICHT: [#Recycling]. + - Keine Sätze im YAML, nur Daten. B. BODY (Markdown): - Nutze für jedes Schema-Feld eine Markdown-Überschrift (## Feldname). - Schreibe den Inhalt DARUNTER. - - Nutze "[TODO: Ergänzen]", wenn Infos fehlen. HINWEIS ZUM TYP: {schema_hint} @@ -132,7 +131,7 @@ interview_template: | type: {target_type} status: draft title: ... - tags: [...] + tags: ["Tag1", "Tag2"] --- # Titel der Notiz