This commit is contained in:
team3
2026-06-18 14:30:21 +02:00
parent d8932c90d6
commit 9c0f622e0c
30 changed files with 45808 additions and 217 deletions

View File

@@ -407,13 +407,26 @@ async def _generate_sections(
"Wähle, was diesem Zweck dient — lass weg, was dafür nicht nötig ist."
)
# Schritt 0: Auswahl-Konsens (5 Agenten → Voting → Mapping → Klärungs-Loop)
auswahl = await _konsens_auswahl(
ctx, files, entries, k_min, k_max, auswahl_auftrag, format_name,
bausteine_liste, instructions,
)
if auswahl is None:
return None
# Subbausteine je Baustein (Sidecar) — früh geladen: ProGuide wählt darüber aus,
# Nicht-FullGuide filtert später Rand-Subbausteine. Fehlt sie → {} (Fallback).
subs_raw = _load_subbausteine(topic)
# Schritt 0: Auswahl. ProGuide ist deterministisch — alle Bausteine mit ≥1
# relevantem Subbaustein. Fallback (keine Relevanz-Daten): alle Bausteine.
if format_name == "ProGuide":
auswahl = [num for num in entries
if any(s.get("relevanz") == "relevant" for s in subs_raw.get(_titel(entries[num]), []))]
if not auswahl:
_log(topic, "ProGuide: keine Relevanz-Daten — alle Bausteine genommen")
auswahl = list(entries)
else:
# Auswahl-Konsens (5 Agenten → Voting → Mapping → Klärungs-Loop)
auswahl = await _konsens_auswahl(
ctx, files, entries, k_min, k_max, auswahl_auftrag, format_name,
bausteine_liste, instructions,
)
if auswahl is None:
return None
sel_entries = {num: entries[num] for num in auswahl}
soll = len(sel_entries)
@@ -487,9 +500,16 @@ async def _generate_sections(
# dieselbe Aufteilung: 1 Agent je ~30 Bausteine (gedeckelt).
total_sections = sum(len(c["nums"]) for c in plan)
chunks = _split_chunks(plan, min(WRITER_MAX, max(1, math.ceil(total_sections / WRITER_SECTIONS))))
# Subbausteine je Baustein (Sidecar). Fehlt sie → leer → Inhalte/Writer laufen
# auf Baustein-Granularität weiter (Fallback für Alt-Themen ohne Sidecar).
subs_by_titel = _load_subbausteine(topic)
# Subbausteine je Baustein. Rand-Subbausteine fliegen aus allen Guides AUSSER
# FullGuide (Fokus). Subs ohne Relevanz-Feld (Alt-Themen) bleiben erhalten.
# Fehlt die Sidecar → leer → Inhalte/Writer laufen auf Baustein-Granularität.
subs_by_titel = subs_raw
if format_name != "FullGuide":
subs_by_titel = {
t: [s for s in subs if s.get("relevanz") != "rand"]
for t, subs in subs_raw.items()
}
subs_by_titel = {t: subs for t, subs in subs_by_titel.items() if subs}
zuteilungen = [_zuteilung_subs(chunk, entries, subs_by_titel) for chunk in chunks]
chunk_sizes = [sum(len(c["nums"]) for c in chunk) for chunk in chunks]
writer_count = len(chunks)