Files
buchwerk/API.md
team3 fb95558657 Kernblock je Kapitel: Frage-Antwort-Paare zum Auffrischen, KERN.md in der Montage
Jedes Kapitel endet mit „## Kern“. Die Montage sammelt alle Blöcke in
buch/KERN.md, die API liefert sie unter kern.md. Stilregel, Kapitel- und
Prüfprompt angepasst.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 15:42:01 +02:00

107 lines
5.4 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`.
## Adressen
Ein Thema hat einen Slug („Godot 4“ → `godot-4`) und Versionen `v1`, `v2`, … mit eigenem Lauf, Buch, Quellen und Leseposition.
Die Version ist in der API immer Teil des Pfads; „neueste“ löst die Oberfläche selbst auf.
Seite: `/<slug>`, `/<slug>/v2/lauf`, `/<slug>/v2/buch`, `/<slug>/v2/buch/3.4` (Abschnitt; `3` = Kapitel, `vorwort`), `/<slug>/v2/lesen`.
Ohne `v2` gilt die neueste Version.
## Themen und Versionen
- `GET /api/themen` → `[{slug, name, titel, hinweise, angelegt, status, laeuft, stufe, versionen: [{v, status, laeuft, stufe, angelegt, kosten_usd}]}]`
– `status/laeuft/stufe` gelten für die neueste Version; `status`: `neu | laeuft | pausiert | fertig | fehler`
- `POST /api/themen` `{name, hinweise}` → Thema wie oben (legt `v1` an)
- `GET /api/themen/{slug}` → Thema wie oben
- `DELETE /api/themen/{slug}` – ganzes Thema
- `POST /api/themen/{slug}/versionen` → `{"v": N}` – nächste Version, gleiche Eingaben, ohne Start
- `DELETE /api/themen/{slug}/v{N}` – nur diese Version
- `POST /api/themen/{slug}/v{N}/start` – startet oder setzt fort (resümiert an der offenen Stufe)
- `POST /api/themen/{slug}/v{N}/pause` – bricht laufende Agenten ab; Neustart mit `start`
- `POST /api/themen/{slug}/v{N}/reset` – löscht alles in der Version außer dem Zustand „neu“
- `GET|PUT /api/themen/{slug}/v{N}/position` – Leseposition `{abschnitt, lesemodus}`
## Stufen
`recherche → gliederung → schreiben → pruefung → lektorat → konsistenz → montage`. Das Lektorat glättet jedes geprüfte Kapitel
Abschnitt für Abschnitt sprachlich (ohne Werkzeuge, `prompts/lektorat.md`); ein Abschnitt wird nur übernommen, wenn Bezeichner,
Zahlen, Überschriften, Codeblöcke und Diagramme erhalten sind und der Umfang nicht über 20 % wächst. Marker: `berichte/lektorat-NN.md`.
Alte Zustände ohne diese Stufe bekommen sie beim Laden nachgetragen.
## Zustand eines Laufs
`GET /api/themen/{slug}/v{N}` →
```json
{
"slug": "godot-4", "name": "Godot 4", "version": 1, "titel": "Godot 4", "hinweise": "…",
"status": "laeuft", "grund": "", "stufe": "schreiben", "angelegt": "2026-09-28T10:00:00Z",
"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": "Doppelungen und Vorwort", …},
{"id": "montage", "titel": "Buch zusammensetzen", …}
],
"kosten_usd": 12.3, "tokens": 4100000,
"agenten": [
{"id": "kapitel-03", "stufe": "schreiben", "name": "Kapitel 3 schreiben", "status": "laeuft|fertig|fehler|abgebrochen",
"kosten_usd": 0.9, "tokens": 180000, "werkzeuge": 41, "gestartet": "…", "beendet": "…", "bericht": "<Abschlussbericht, Markdown>"}
],
"ereignisse": [{"zeit": "…", "agent": "kapitel-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/themen/{slug}/v{N}/buch` →
```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/themen/{slug}/v{N}/buch.md` – ganzes Buch als Markdown
- `GET /api/themen/{slug}/v{N}/kern.md` – alle `## Kern`-Blöcke der Kapitel (Frage-Antwort-Paare) in einer Datei, zum Auffrischen
- `GET /api/themen/{slug}/v{N}/buch.pdf` – PDF (404, solange nicht gebaut)
Solange ein Lauf läuft, enthält `buch` die bereits geschriebenen Kapitel (Status `geschrieben`, bis der Prüfer fertig ist).
## Dateien im Speicher
```
storage/<Thema>/
thema.json {name, slug, titel, hinweise, angelegt}
v1/, v2/, … je Version:
state.json Zustand wie oben (ohne Buch)
deutung.json vom Recherche-Agenten
position.json Leseposition
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)
arbeit/ Arbeitsdateien der Agenten
log.jsonl Ereignisse
```
Alte Ablagen (alles direkt unter `storage/<Thema>/`) werden beim Start nach `v1/` verschoben, fehlende Slugs nachgetragen.