Stufe „Stoff auswählen“ vor der Gliederung: Auswahl und Tiefe je Thema
Neuer Agent entscheidet aus Quellen und Leitfrage, welche Themen ins Buch kommen und wie tief (herleiten, erklären, nennen, weggelassen), mit Begründung in buch/STOFF.md. Die Gliederung baut nur daraus, das Gewicht folgt der Tiefe. Autoren und Prüfer halten sich an STOFF.md. Nachgetragene Stufen gelten als fertig, wenn eine spätere schon fertig ist. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ LESE_WPM = 120
|
||||
|
||||
STUFEN = [
|
||||
("recherche", "Thema deuten und Quellen beschaffen"),
|
||||
("stoff", "Stoff auswählen"),
|
||||
("gliederung", "Gliederung"),
|
||||
("schreiben", "Kapitel schreiben"),
|
||||
("pruefung", "Kapitel prüfen"),
|
||||
|
||||
@@ -136,6 +136,25 @@ async def st_recherche(name: str) -> None:
|
||||
s["fertig"] = 1
|
||||
|
||||
|
||||
async def st_stoff(name: str) -> None:
|
||||
"""Auswahl vor der Struktur: welche Themen ins Buch kommen und wie tief (buch/STOFF.md); die Gliederung baut nur daraus."""
|
||||
thema, hinweise, spez = _thema(name)
|
||||
s = state.stufe(name, "stoff")
|
||||
s.update(gesamt=1, fertig=0)
|
||||
v = state.verzeichnis(name)
|
||||
if not state.bericht_lesen(name, "stoff") or not (v / "buch" / "STOFF.md").exists():
|
||||
(v / "berichte" / "stoff.md").unlink(missing_ok=True)
|
||||
p = prompts.laden("stoff", thema=thema, hinweise_block=prompts.hinweise_block(hinweise),
|
||||
spezialisierung_block=prompts.spezialisierung_block(spez))
|
||||
r = await agenten.laufen(name, "stoff", "stoff", "Stoff auswählen", p)
|
||||
if r["status"] != "fertig":
|
||||
raise Abbruch("Stoffauswahl gescheitert: " + r["bericht"][:200])
|
||||
if not (v / "buch" / "STOFF.md").exists():
|
||||
(v / "berichte" / "stoff.md").unlink(missing_ok=True)
|
||||
raise Abbruch("Stoffauswahl unvollständig: buch/STOFF.md fehlt")
|
||||
s["fertig"] = 1
|
||||
|
||||
|
||||
async def st_gliederung(name: str) -> None:
|
||||
thema, hinweise, spez = _thema(name)
|
||||
s = state.stufe(name, "gliederung")
|
||||
@@ -242,5 +261,5 @@ async def st_montage(name: str) -> None:
|
||||
s["fertig"] = 1
|
||||
|
||||
|
||||
STUFEN_FN = {"recherche": st_recherche, "gliederung": st_gliederung, "schreiben": st_schreiben,
|
||||
STUFEN_FN = {"recherche": st_recherche, "stoff": st_stoff, "gliederung": st_gliederung, "schreiben": st_schreiben,
|
||||
"pruefung": st_pruefung, "lektorat": st_lektorat, "konsistenz": st_konsistenz, "montage": st_montage}
|
||||
|
||||
@@ -190,13 +190,15 @@ def zustand(name: str) -> dict:
|
||||
for a in st["agenten"]:
|
||||
if a["status"] == "laeuft":
|
||||
a["status"] = "abgebrochen"
|
||||
# Später hinzugekommene Stufen (z. B. Lektorat) in alte Zustände einfügen, in der Reihenfolge der Konfiguration
|
||||
# Später hinzugekommene Stufen (z. B. Lektorat, Stoff) in alte Zustände einfügen, in der Reihenfolge der Konfiguration;
|
||||
# eine nachgetragene Stufe gilt als fertig, wenn eine spätere Stufe schon fertig ist (der Lauf ist darüber hinaus).
|
||||
vorhanden = {x["id"] for x in st["stufen"]}
|
||||
if vorhanden != {sid for sid, _ in config.STUFEN}:
|
||||
alt = {x["id"]: x for x in st["stufen"]}
|
||||
fertig = st.get("status") == "fertig"
|
||||
st["stufen"] = [alt.get(sid) or {"id": sid, "titel": t, "status": "fertig" if fertig else "offen", "fertig": 0, "gesamt": 0,
|
||||
"kosten_usd": 0.0, "tokens": 0, "gestartet": "", "beendet": ""} for sid, t in config.STUFEN]
|
||||
reihe = [sid for sid, _ in config.STUFEN]
|
||||
fertig_bis = max((reihe.index(x["id"]) for x in st["stufen"] if x["status"] == "fertig" and x["id"] in reihe), default=-1)
|
||||
st["stufen"] = [alt.get(sid) or {"id": sid, "titel": t, "status": "fertig" if i <= fertig_bis else "offen", "fertig": 0, "gesamt": 0,
|
||||
"kosten_usd": 0.0, "tokens": 0, "gestartet": "", "beendet": ""} for i, (sid, t) in enumerate(config.STUFEN)]
|
||||
_cache[name] = st
|
||||
return _cache[name]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user