diff --git a/article_pipeline.py b/article_pipeline.py index f461a20..128486c 100644 --- a/article_pipeline.py +++ b/article_pipeline.py @@ -5,30 +5,12 @@ 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. - -Usage: - # Thema + PDF - python3 article_pipeline.py --topic "Gamegenic × TCC" --pdf pm.pdf --rubric "Nachrichten" - - # Thema + URL - python3 article_pipeline.py --topic "Neue Kennerspiel-Nominierungen" --url "https://..." - - # Nur Thema (autonome Recherche) - python3 article_pipeline.py --topic "Spiel des Jahres 2026" --rubric "Nachrichten" - - # Batch (JSON) - python3 article_pipeline.py --batch topics.json - -Output: Strukturierter Prompt nach stdout (wird vom Hermes-Cronjob als Context injiziert) -Exit-Codes: 0 = Prompt bereit, 1 = Fehler in Stage 0 """ import argparse import json import os import sys -import subprocess -import tempfile from datetime import datetime WORKSPACE = "/home/hermes/workspace" @@ -46,23 +28,6 @@ def ocr_pdf(pdf_path: str) -> str: return "\n\n".join(texts) -def extract_url_text(url: str) -> str: - """URL-Inhalt via 5-Stufen-Eskalation abrufen.""" - import urllib.request - import urllib.error - - # Stufe 1: curl direkt - try: - req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - with urllib.request.urlopen(req, timeout=15) as resp: - return resp.read().decode("utf-8", errors="ignore")[:5000] - except Exception: - pass - - # Stufe 2-5 wäre hier — für Stage 0 reicht Stufe 1 - return f"[URL nicht direkt abrufbar: {url}]" - - def build_prompt(topic: str, sources: list[str], rubric: str, category_id: int, image_urls: list[str], deadline: str | None, @@ -72,7 +37,48 @@ def build_prompt(topic: str, sources: list[str], rubric: str, 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