#!/usr/bin/env python3 """ article_pipeline.py — Stage 0: Input-Preparation für den BSN-Artikel-Workflow. Liest Topic, PDFs, URLs und baut einen strukturierten Prompt für den Hermes-Agenten, der dann via delegate_task Research (Stage 1) und Write+QC (Stage 2+3) durchführt. Stage 4 (Git, Verify) macht der Agent selbst. """ import argparse import json import os import sys from datetime import datetime WORKSPACE = "/home/hermes/workspace" DOC_CACHE = os.path.expanduser("~/.hermes/cache/documents") def ocr_pdf(pdf_path: str) -> str: """PDF mit pymupdf OCRen und Text extrahieren.""" import pymupdf doc = pymupdf.open(pdf_path) texts = [] for page in doc: texts.append(page.get_text()) doc.close() return "\n\n".join(texts) def build_prompt(topic: str, sources: list[str], rubric: str, category_id: int, image_urls: list[str], deadline: str | None, pdf_texts: dict[str, str]) -> str: """Direkten Agent-Prompt für den Artikel-Workflow bauen.""" now = datetime.now() date_str = now.strftime("%d. %B %Y") slug = topic.lower().replace(" ", "_").replace(":", "").replace("×", "x")[:40] date_slug = now.strftime("%Y-%m-%d") filename = f"artikel_{slug}_{date_slug}.html" # --- WRITE+QC CONTEXT (most complex part) --- write_context = ( "STRUKTUR (exakt einhalten, nummeriert):\n" "1.
\n' '5. INFOBOX (PFLICHT bei Unternehmen/Produkt-News): ' '
| ' 'Label | Wert |
)\n' '7.
Recherchestand: DATUM. ' 'Basierend auf QUELLEN.
\n' '\n' 'KRITISCHE REGELN (QC-Fail bei Verstoß):\n' '- Read-More NACH allen Inhalten, VOR Quellen (NICHT nach Absatz 1!)\n' '- JEDE Quelle als mit target="_blank" — KEINE unverlinkten Quellen!\n' '- Dachzeile + Infobox sind PFLICHT\n' '- Quellen-Überschrift: font-size:1.17em (NICHT 0.9rem)\n' '- Kein "XML API v2", kein "Betriebsgeheimnis", keine Emojis\n' '- Datei endet mit