Backend:
- POST /api/jobs/{id}/retry — löscht summary/protocol/docx, queued den Job
neu und startet Pipeline. Transkript bleibt erhalten (teurer Schritt).
- Pipeline überspringt Steps, deren Output-Datei schon existiert →
retry rennt direkt in summarize ohne erneute Transkription.
Frontend:
- Kleiner gelber '↻ Erneut versuchen'-Button in jeder Job-Zeile/-Karte
wenn Status != done
- Confirm-Dialog erklärt was passiert
- Event-Delegation, funktioniert für Tabelle (Desktop) und Cards (Mobile)
Voice-Agent — LXC-Frontend
FastAPI + statisches HTML/JS. Läuft im LXC-Container, stellt die Weboberfläche, verwaltet Jobs (SQLite) und ruft den Mac-Worker per HTTP an. Macht selbst keine AI-Verarbeitung.
Lokal starten (Entwicklung)
cd lxc-frontend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Für lokalen Test ohne Mac kann der Mac-Worker mit WHISPER_ENGINE=mock laufen
uvicorn app.main:app --reload --port 8000
Öffnen: http://localhost:8000
Auf LXC deployen
deploy/install.sh macht alles: Repo klonen, venv anlegen, systemd-Service und Nginx einrichten. Siehe Haupt-README.md.
API
| Methode | Pfad | Zweck |
|---|---|---|
| GET | / |
Web-UI |
| GET | /health |
LXC-Health |
| GET | /api/mac/health |
Mac-Worker-Erreichbarkeit |
| POST | /api/jobs |
multipart: audio, title → Job anlegen |
| GET | /api/jobs |
Liste aller Jobs |
| GET | /api/jobs/{id} |
Job-Detail |
| GET | /api/jobs/{id}/download/{kind} |
kind ∈ docx, transcript, summary, protocol |
Datenfluss
Upload → SQLite-Job → BackgroundTask
→ Mac: /api/transcribe (multipart)
→ Mac: /api/summarize (JSON)
→ Mac: /api/protocol (JSON)
→ Mac: /api/export/docx (JSON) → DOCX
→ Ergebnisse landen in /var/lib/voice-agent/results/{job_id}/