Files
buchwerk/API.md
team3 1b6899638b Versionen je Thema
Ein Thema hat Versionen storage/<Thema>/v<N>/ mit eigenem Lauf, Buch und
Leseposition; bestehende Ablagen wandern beim Start nach v1/. Intern ist
„Thema/vN“ der Schlüssel aller Zustandsfunktionen. API: ?v=N an allen
Themen-Endpunkten, POST /version, DELETE ?v=N. Oberfläche: Versionsliste
unter dem Thema (Klick auf Thema → Lauf der neuesten, auf Version → Buch),
Knopf „Neue Version“ mit gleichen Eingaben. make loeschen kennt V=<Nr>.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 17:01:40 +02:00

92 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# buchwerk – Schnittstelle Backend ↔ Frontend
Backend: FastAPI auf Port 8020, liefert `frontend/dist/` aus. Alle Pfade unter `/api`.
## Themen
- `GET /api/topics` → `[{name, titel, status, laeuft, stufe}]`
- `status`: `neu | laeuft | pausiert | fertig | fehler`
- `POST /api/topics` `{name, hinweise}` → Topic (name = Thema, z. B. „Godot 4“; hinweise optional, z. B. „für Entwickler, ab Version 4.6“)
- `DELETE /api/topics/{name}`
- `POST /api/topics/{name}/start` – startet oder setzt fort (resümiert an der Stufe, die noch offen ist)
- `POST /api/topics/{name}/pause` – bricht laufende Agenten ab; Neustart mit `start`
- `POST /api/topics/{name}/reset` – löscht alles außer `thema.json`
## Zustand eines Laufs
`GET /api/topics/{name}/state` →
```json
{
"name": "Godot 4", "titel": "Godot 4", "hinweise": "…",
"status": "laeuft", "grund": "", "stufe": "schreiben",
"deutung": {"titel": "Godot 4", "untertitel": "…", "deutung": "…", "buchtyp": "werkzeug|wissen", "zielgruppe": "…"},
"stufen": [
{"id": "recherche", "titel": "Thema deuten und Quellen beschaffen", "status": "fertig", "fertig": 1, "gesamt": 1,
"kosten_usd": 1.2, "tokens": 250000, "gestartet": "2026-09-28T10:00:00Z", "beendet": "…"},
{"id": "gliederung", "titel": "Gliederung", …},
{"id": "schreiben", "titel": "Kapitel schreiben", "status": "laeuft", "fertig": 3, "gesamt": 18, …},
{"id": "pruefung", "titel": "Kapitel prüfen", …},
{"id": "konsistenz", "titel": "Querverweise und Vorwort", …},
{"id": "montage", "titel": "Buch zusammensetzen", …}
],
"kosten_usd": 12.3, "tokens": 4100000,
"agenten": [
{"id": "schreiben-03", "stufe": "schreiben", "name": "Kapitel 3 schreiben", "status": "laeuft|fertig|fehler|abgebrochen",
"kosten_usd": 0.9, "tokens": 180000, "werkzeuge": 41, "gestartet": "…", "beendet": "…", "bericht": "<Abschlussbericht des Agenten, Markdown>"}
],
"ereignisse": [{"zeit": "…", "agent": "schreiben-03", "art": "tool|text|start|ende|fehler", "text": "Write buch/03-dal.md"}]
}
```
`stufen[].status`: `offen | laeuft | fertig | fehler`. `ereignisse` sind die letzten 100.
## Buch
`GET /api/topics/{name}/guide` →
```json
{
"titel": "Godot 4", "untertitel": "Architektur, Konzepte und Praxis der Engine", "status": "fertig",
"vorwort": "<Markdown ohne H1>",
"kapitel": [
{"id": "03", "ord": 3, "titel": "GDScript", "teil": "Teil I – Grundlagen", "datei": "buch/03-gdscript.md",
"status": "fehlt|geschrieben|geprueft|konsistent", "intro": "<Markdown vor dem ersten Abschnitt>",
"abschnitte": [{"id": "03-1", "nr": "3.1", "titel": "Sprache und Syntax", "text": "<Markdown ohne die ##-Überschrift>", "woerter": 1400, "minuten": 8}],
"woerter": 7000, "minuten": 39,
"berichte": {"autor": "<Markdown>", "pruefer": "<Markdown>"}}
],
"woerter": 130000, "minuten": 720,
"gliederung": "<GLIEDERUNG.md>", "quellen": "<QUELLEN.md, Markdown>",
"pdf": true
}
```
- `GET /api/topics/{name}/guide.md` – ganzes Buch als Markdown
- `GET /api/topics/{name}/buch.pdf` – PDF (404, solange nicht gebaut)
Solange ein Lauf läuft, enthält `guide` die bereits geschriebenen Kapitel (Status `geschrieben` bis der Prüfer fertig ist).
## Dateien im Speicher
```
storage/<name>/
thema.json {name, titel, hinweise, angelegt}
state.json Zustand wie oben (ohne guide)
deutung.json vom Recherche-Agenten
quellen/ QUELLEN.md + geklonte/geladene Quellen
buch/ STIL.md, GLIEDERUNG.md, 00-vorwort.md, NN-*.md, README.md, buch.md, buch.pdf
berichte/ <agent-id>.md (Abschlussberichte)
log.jsonl Ereignisse
```
## Versionen
Ein Thema kann mehrere Versionen haben (gleiche Eingaben, unabhängiger Lauf, eigenes Buch und eigene Leseposition).
Ablage: `storage/<Thema>/thema.json` und `storage/<Thema>/v<N>/…`. Alte Ablagen werden beim Start nach `v1/` verschoben.
- `GET /api/topics` liefert je Thema `versionen: [{v, status, laeuft, stufe, angelegt, kosten_usd}]`; die Felder `status/laeuft/stufe` gelten für die neueste Version.
- `POST /api/topics/{name}/version` → `{"v": N}` legt die nächste Version an (ohne Start).
- Alle Endpunkte unter `/api/topics/{name}/…` nehmen `?v=N`; ohne Angabe gilt die neueste Version.
- `DELETE /api/topics/{name}?v=N` löscht nur diese Version, ohne `v` das ganze Thema.