API

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

REST-API Endpoints und HTMX-Integration für das Content Studio.

ControllerContentController.php
Backendweb_generate.py
Base-URL/content

Web-UI Endpoints (RESTful)

MethodeRouteControllerBeschreibung
GET/contentindex()Auftrags-Liste
GET/content/newcontentNew()Erstellungs-Formular
POST/contentstore()Auftrag speichern
GET/content/{id}show()Auftrags-Details
GET/content/{id}/editedit()Bearbeitungs-Formular

HTMX-Endpoints

Diese Endpoints liefern HTML-Fragmente für dynamische Updates.

MethodeRouteControllerResponse
POST/content/{id}/generategenerate()Polling-Partial
GET/content/{id}/generation-statusgenerationStatus()Status/Version-Partial
POST/content/{id}/critiquecritique()Polling-Partial
GET/content/{id}/critique-statuscritiqueStatus()Status/Critique-Partial
POST/content/{id}/reviserevise()Version-Partial
POST/content/{id}/approveapprove()Success-Alert + Reload
POST/content/{id}/declinedecline()Warning-Alert + Reload

Asynchroner Workflow (Polling)

Die Generierung und Kritik laufen asynchron. Der Ablauf ist:

  1. POST /content/{id}/generate startet die Generierung und liefert ein Polling-Partial
  2. Das Partial pollt via HTMX automatisch GET /content/{id}/generation-status
  3. Bei Status generating: Polling-Partial mit Log wird zurückgegeben
  4. Bei Status completed: Fertiges Version-Partial wird zurückgegeben
  5. Bei Status failed: Fehler-Alert wird zurückgegeben

Gleiches Prinzip für Kritik:

  1. POST /content/{id}/critique startet die Kritik
  2. Polling via GET /content/{id}/critique-status

Status-Werte

StatusBedeutungResponse
idleKeine Operation aktivLeerer Response
generating / critiquingOperation läuftPolling-Partial mit Log
completedErfolgreich abgeschlossenErgebnis-Partial
failedFehlgeschlagenFehler-Alert

REST-API Endpoint

MethodeRouteBeschreibung
PUT/api/v1/content/{id}Auftrag aktualisieren

Generate-Endpoint

Request

POST /content/{id}/generate
Content-Type: application/x-www-form-urlencoded

model=anthropic&collection=documents&context_limit=5

Parameter

ParameterTypDefaultBeschreibung
modelstringanthropicLLM-Backend (anthropic, ollama)
collectionstringdocumentsQdrant-Collection
context_limitint5Anzahl RAG-Chunks

Response (Polling-Partial)

<div hx-get="/content/{id}/generation-status"
     hx-trigger="every 2s"
     hx-swap="outerHTML">
  <div class="spinner">Generiere...</div>
  <pre class="log">...</pre>
</div>

Generation-Status Endpoint

Request

GET /content/{id}/generation-status

Response bei completed (Version-Partial)

<div class="version-content">
  <div class="version-header">
    <span class="version-number">Version 1</span>
    <span class="badge success">Generiert</span>
  </div>
  <div class="content-text">...</div>
  <div class="sources">...</div>
</div>

Critique-Endpoint

Request

POST /content/{id}/critique
Content-Type: application/x-www-form-urlencoded

model=anthropic

Response (Polling-Partial)

<div hx-get="/content/{id}/critique-status"
     hx-trigger="every 2s"
     hx-swap="outerHTML">
  <div class="spinner">Analysiere...</div>
</div>

Critique-Status Endpoint

Request

GET /content/{id}/critique-status

Response bei completed (Critique-Partial)

<div class="critique-results">
  <div class="critique-header">
    <span>Kritik-Runde 1</span>
    <span class="badge warning">Revision nötig</span>
  </div>
  <div class="critique-item failed">...</div>
</div>

Python-Backend

Die Controller-Methoden rufen web_generate.py via Shell auf:

python web_generate.py generate <order_id> [model] [collection] [limit]
python web_generate.py critique <version_id> [model] [order_id]
python web_generate.py revise <version_id> [model]

Hinweis: Der optionale [order_id] Parameter bei critique aktiviert Live-Logging in der Datenbank (critique_log, critique_step). Ohne order_id läuft die Kritik im synchronen Modus ohne Live-Updates.

API-Update (curl)

curl -X PUT https://dev.campus.systemische-tools.de/api/v1/content/1 \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Blogpost über Teamcoaching",
    "briefing": "Schreibe einen informativen Artikel..."
  }'

Fehlerbehandlung

Bei Fehlern wird ein HTML-Alert zurückgegeben:

<div class="alert error">Fehler: [Fehlermeldung]</div>