"Praxis-Telefon-Agent... Hausarztpraxis" stimmte nicht mehr - das Projekt ist
seit dem Branchen-Profil-Umbau universell konfigurierbar (praxis,
aufzug-notdienst als Beispiele). Einleitung + "Vollstaendig on-prem"-Zeile
generalisiert, Link auf den Branchen-Profil-Abschnitt ergaenzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
Kategorien, Prompt und Notfall-Sicherheitsnetz waren fest auf eine
Hausarztpraxis zugeschnitten (categorize.py: KATEGORIEN-Liste, _NOTFALL_MUSTER-
Regex). Fuer einen anderen Einsatzzweck (z.B. 24h-Aufzug-Notdienst) musste
bisher Python-Code geaendert werden.
Neu: profile/<name>/ buendelt prompt.txt, kategorien.json, sicherheitsnetz.txt
und ansage.txt - alles, was fachlich vom Einsatzzweck abhaengt, an einer
Stelle. PROFIL in der .env waehlt den aktiven Ordner (Default "praxis", altes
Verhalten bleibt exakt gleich - per Test verifiziert: identische Kategorien-
Liste und Sicherheitsnetz-Muster). profile/aufzug-notdienst/ liegt als
ausformuliertes Beispielprofil bei (eigene Kategorien, eigenes
Sicherheitsnetz, eigene Ansage).
Dringlichkeitsstufen (niedrig/normal/hoch/notfall) bleiben bewusst fest -
nur die Kategorien sind einsatzzweck-spezifisch. Neues pipe/kategorien.py
laedt das Profil-Schema einmal fuer categorize.py, dashboard.py, deck.py und
server.py (Leitstand-JS: Kategorie-Label kommen jetzt vom Server statt fest
im Frontend zu stehen).
prompts/categorize_de.txt und telefon/ansage.txt sind nach profile/praxis/
umgezogen (git erkennt es als Rename).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
Dienste-Ampel (Telefon, Verarbeitung, Spracherkennung, Nextcloud) alarmierte
bisher nur im offenen Leitstand. pipe/monitor.py laeuft jetzt als eigener
Dauerprozess, prueft dieselbe Ampel (neu ausgelagert nach pipe/dienste.py)
periodisch und alarmiert bei Stoerung lokal per macOS-Benachrichtigung + Ton
(pipe/alarm.py) - unabhaengig davon, ob pipe.watch oder pipe.server laufen.
Wird ab jetzt von telefon/starten.sh mitgestartet.
Verschluesselung at rest: keine App-eigene Verschluesselung eingebaut,
stattdessen im README als Betreiber-Pflicht dokumentiert (FileVault aktivieren)
- App verlaesst sich auf Festplattenverschluesselung durch das Betriebssystem.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ
Erste stabile Version - Kernpipeline, Telefonie, Leitstand mit Sicher-Modus/
Notfall-Alarm/Bewertungssystem, Notfall-Sicherheitsnetz, Audit-Log +
Loeschfristen, Modell-Vergleich mit Failover. Details in CHANGELOG.md.
Vorher geprueft: Git-Historie sauber (keine Secrets), alle Python-Dateien
syntaktisch valide, Watcher/Leitstand/FreeSWITCH/Ollama live und
funktionsfaehig, telefon/fehler leer.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
Ersetzt docs/leitstand.png (alter Hell-Modus-Stand) durch einen aktuellen
Dark-Mode-Screenshot nach dem Karten-Redesign.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
README-Titel, Leitstand-Browsertitel/-Header und Footer angepasst. Technischer
Name bleibt vorerst fonagent-one (Repo-Slug, Python-Package, Ordnerpfade) -
Rename dort waere ein groesserer, schwerer umkehrbarer Schritt (bricht den
bereits geteilten GitHub-Link), dafuer erst Rueckmeldung einholen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
pipe.watch prueft die Aufbewahrungsfrist jetzt selbst alle 24h mit (kein
Cron/launchd noetig - der Watcher laeuft ohnehin dauerhaft). README ergaenzt
um Sicher-Modus, Notfall-Alarm, Loeschfristen/Audit-Log und korrigiert eine
falsche Behauptung zur Ansage (Notruf-Hinweis/Aufnahme-Einwilligung fehlen
in der aktuellen telefon/ansage.txt noch tatsaechlich).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
Aus einem Security-Review: 0.0.0.0 bindet nicht nur ein VPN wie Tailscale,
sondern jedes Netzwerk-Interface des Rechners - laeuft er zusaetzlich in
einem normalen WLAN/LAN, ist der (passwortgeschuetzte) Leitstand auch dort
erreichbar. Fuer diese Installation ist die Tailscale-Erreichbarkeit
gewollt; der Hinweis dokumentiert das Verhalten fuer kuenftige Einrichtungen,
die versehentlich mehr oeffnen als beabsichtigt. Alternative: die konkrete
VPN-IP statt 0.0.0.0 eintragen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PuP3zfgYqhnrwyEne2ejG7
Sammelt, was beim Aufsetzen auf einer frischen Maschine fehlt: die nicht im
Repo liegenden Teile, der kurze Weg über Stufe 1 ohne Telefonie, eine
Prüfleiter und die Fallen aus dem ersten Volltest.
Dabei drei Lücken geschlossen, die drüben zugeschlagen hätten:
- NEXTCLOUD_DECK fehlte in .env.example. DECK_STAPEL und DECK_TEILEN stehen
dort, der Hauptschalter nicht — die Pipe legt dann kein Board an, obwohl
alles richtig aussieht.
- WHISPER_MODELL/WHISPER_COMPUTE galten laut Vorlage allgemein, greifen aber
nur bei STT_BACKEND=faster. Standard ist whispercpp. Jetzt sind beide Blöcke
getrennt und STT_BACKEND, WHISPERCPP_BIN/_MODELL, WHISPER_THREADS,
NEXTCLOUD_USERID und FREESWITCH_LOG dokumentiert.
- README hatte eine doppelte Überschrift.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pj3mSmL397czPaCfbL27Z
Die bisherigen "Voraussetzungen" reichten für eine Neuinstallation nicht: Es
fehlten FreeSWITCH, Piper samt Stimme, der Download des Whisper-Modells und
zwei Python-Pakete. Wer das Repository frisch geklont hat, wäre damit nicht
weit gekommen.
- requirements.txt: piper-tts und certifi ergänzt. certifi ist keine Kür — das
Python von python.org bringt keinen System-Zertifikatsspeicher mit, ohne das
Bundle scheitern die HTTPS-Aufrufe zu Nextcloud und der Stimmen-Download.
- README: Einrichtung in sechs Schritten, alle Befehle gegengeprüft (Formeln
vorhanden, Modell-Links erreichbar).
- Abschnitt "Stolpersteine" mit den vier Dingen, die hier Zeit gekostet haben:
FreeSWITCH liest aus dem Cellar, belegter Event-Socket-Port, rotierende
Provider-Adressen als Ursache für abbrechende Registrierungen, und der
Leitstand, der ohne Passwort nicht ins Netz geht.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017V57oXiDLi4nSsyau5qaA2
Der Screenshot zeigt das Board mit allen vier Spalten, dem Verlauf darüber und
den Dienste-Ampeln darunter. Die Anrufe darin sind erfunden — er wurde aus einem
eigens angelegten Beispieldatensatz erzeugt, nicht aus dem Betrieb, damit keine
echten Rufnummern ins Repository gelangen.
Dazu ein Hinweis in der README, dass alle Namen, Nummern und Anliegen im
Repository Platzhalter sind, "Praxis Musterhausen" eingeschlossen.
Außerdem: Der Pfad zum Log der Telefonanlage ist jetzt über FREESWITCH_LOG
konfigurierbar statt fest verdrahtet — nötig, um den Leitstand gegen einen
anderen Datenbestand laufen zu lassen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017V57oXiDLi4nSsyau5qaA2
Nimmt Anrufe einer Hausarztpraxis entgegen, transkribiert sie lokal,
kategorisiert das Anliegen und legt es strukturiert ab. Keine Patientendaten
verlassen den Rechner: Spracherkennung, Sprachmodell und Sprachsynthese laufen
lokal, im Datenpfad steht kein Cloud-Dienst.
Aufbau:
- FreeSWITCH nimmt über einen SIP-Trunk an, spielt die Ansage und nimmt auf.
- pipe.watch erkennt fertige Aufnahmen und schiebt sie durch die Pipe.
- whisper.cpp transkribiert, ein lokales Sprachmodell (Ollama) ordnet in
Kategorie und Dringlichkeit ein — mit erzwungenem JSON-Schema.
- Ablage lokal, optional Nextcloud (WebDAV) und ein Deck-Board.
- Leitstand (pipe.server): Board mit Eingang/In Bearbeitung/Rückfragen/Erledigt,
Aufnahmen zum Anhören, Verlauf und Ampeln für alle beteiligten Dienste.
Zugangsdaten und Anrufdaten liegen außerhalb des Repositorys (.env, ablage/,
telefon/). Konfiguration siehe .env.example, Einrichtung siehe README.