Live-Monitoring: Parser toleranter (Dash optional, Datum ohne zweiten Punkt) + Backfill-Script
Claude Haiku 4.5 laesst gelegentlich den fuehrenden Dash oder den zweiten
Datums-Punkt im Bullet-Format weg (z.B. "[18.04 21:49]" statt
"- [18.04. 21:49]"). Der strikte Parser-Regex verwarf dadurch alle Bullets.
- Regex akzeptiert nun Dash als optional und zweiten Datums-Punkt als optional
- Parser normalisiert Datum + Zeit auf kanonisches Format "DD.MM. HH:MM" mit Zero-Padding
- Frontend-Regex analog toleranter (auch fuer Altdaten-Mix)
- OUTPUT-FORMAT-Hinweis im Prompt verschaerft ("JEDE Zeile beginnt mit - ")
Backfill-Skript (scripts/backfill_latest_developments.py): Laedt die N
neuesten Artikel einer Lage aus der DB und ruft generate_latest_developments
mit previous_developments=None auf — nuetzlich nach DB-Cleanups, wenn die
inkrementelle Logik zu wenige Bullets liefert.
Einmaliger Run fuer Lage #66 (Militaerblogger): 8 Bullets vom 18.04. mit
aufgeloesten Quellen (Spiegel, Guardian, Bloomberg, n-tv, Telegram-Kanaele).
Dieser Commit ist enthalten in:
@@ -238,7 +238,7 @@ REGELN:
|
||||
- KEINE Einleitung, KEINE Überschrift, KEINE Nachbemerkungen.
|
||||
- Wenn aus den neuen Meldungen kein neues Ereignis extrahierbar ist: BISHERIGE ENTWICKLUNGEN unverändert zurückgeben.
|
||||
|
||||
OUTPUT-FORMAT (ausschliesslich, keine Anführungszeichen, kein Code-Fence):
|
||||
OUTPUT-FORMAT (ausschliesslich, keine Anführungszeichen, kein Code-Fence, JEDE Zeile beginnt mit "- "):
|
||||
- [DD.MM. HH:MM] Ereignistext neu. {{M<ID>}}
|
||||
- [DD.MM. HH:MM] Ereignistext neu mit mehreren Belegen. {{M<ID1>, M<ID2>}}
|
||||
- [DD.MM. HH:MM] Ereignistext aus BISHERIGE ENTWICKLUNGEN. {{Quellenname1, Quellenname2}}
|
||||
@@ -447,7 +447,10 @@ class AnalyzerAgent:
|
||||
articles_by_id[str(aid)] = name
|
||||
|
||||
bullets: list[str] = []
|
||||
bullet_re = re.compile(r"^\s*[-*•]\s*\[(\d{1,2}\.\d{1,2}\.(?:\d{2,4})?\s+\d{1,2}:\d{2})\]\s*(.+?)\s*$")
|
||||
# Dash-Praefix + zweiter Datums-Punkt + optionales Jahr: Claude Haiku laesst diese gelegentlich weg.
|
||||
bullet_re = re.compile(
|
||||
r"^\s*(?:[-*•]\s*)?\[\s*(\d{1,2})\.(\d{1,2})\.?(?:\d{2,4})?\s+(\d{1,2}:\d{2})\s*\]\s*(.+?)\s*$"
|
||||
)
|
||||
trailing_braces = re.compile(r"\{([^{}]+)\}\s*\.?\s*$")
|
||||
id_item = re.compile(r"^[M#]\s*(\d+)$", re.IGNORECASE)
|
||||
junk_item = re.compile(r"^(unbekannt|unknown|n/?a|keine|keine quelle|tba)$", re.IGNORECASE)
|
||||
@@ -459,8 +462,9 @@ class AnalyzerAgent:
|
||||
m = bullet_re.match(line)
|
||||
if not m:
|
||||
continue
|
||||
ts = m.group(1)
|
||||
body = m.group(2).rstrip()
|
||||
day, month, time = m.group(1), m.group(2), m.group(3)
|
||||
ts = f"{int(day):02d}.{int(month):02d}. {time}"
|
||||
body = m.group(4).rstrip()
|
||||
|
||||
brace_match = trailing_braces.search(body)
|
||||
if not brace_match:
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren