Phase 8: Lokale KI
Wiki mit semantischer Suche ueber pgvector, Diktat ueber faster-whisper, Berichtsassistent und Belegerfassung — alles gegen selbst betriebene Modelle. Dazu zwei Protokollansichten: was die Maschine getan hat und was Menschen getan haben. Nichts, was ein Modell erzeugt, gelangt ungeprueft in einen Nachweis. Jede Ausgabe ist zuerst ein eigener Datensatz, gekennzeichnet, mit zwei gleich grossen Knoepfen davor. Die Datenbank haelt gegen: Eingabe, Ausgabe und Modell sind unveraenderlich, geloescht wird nicht, entschieden wird einmal. Kein Rueckfall auf einen Anbieter: fehlen die Container, fehlt die Funktion. Dafuer bleibt alles andere ohne Modell vollstaendig benutzbar — geprueft von vierzehn E2E-Tests, die ohne laufendes Modell durchlaufen. Postgres bringt jetzt PostGIS und pgvector mit (eigenes Image), Ollama und faster-whisper stehen im Compose-Profil "ki". 73 neue Unit-Tests, 14 neue E2E-Tests, Version 0.9.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
12243f177d
commit
f7ccd9a908
@@ -21,6 +21,7 @@ import {
|
||||
morgenlauf,
|
||||
zustellen,
|
||||
} from "@/worker/benachrichtigung";
|
||||
import { diktatErkennen, veralteteSeitenEinbetten, wikiEinbetten } from "@/worker/ki";
|
||||
|
||||
/**
|
||||
* Hintergrundprozess.
|
||||
@@ -166,6 +167,34 @@ async function benachrichtigungErinnern(auftrag: Job<AuftragsDaten>) {
|
||||
return ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* Eine Wiki-Seite durchsuchbar machen.
|
||||
*
|
||||
* Im Hintergrund, weil eine lange Seite zwanzig Modellaufrufe bedeutet. Bis
|
||||
* es durch ist, bleibt der alte Suchstand nutzbar — und die Seitenansicht
|
||||
* sagt, dass er veraltet ist.
|
||||
*/
|
||||
async function wikiEinbettenAuftrag(auftrag: Job<AuftragsDaten>) {
|
||||
const { organisationId, seiteId } = auftrag.data as AuftragsDaten & { seiteId?: string };
|
||||
|
||||
if (!seiteId) {
|
||||
throw new Error("Einbettungsauftrag ohne Angabe, wofür — seiteId fehlt.");
|
||||
}
|
||||
|
||||
return wikiEinbetten(organisationId, seiteId);
|
||||
}
|
||||
|
||||
/** Eine Diktataufnahme in Text verwandeln. */
|
||||
async function diktatErkennenAuftrag(auftrag: Job<AuftragsDaten>) {
|
||||
const { organisationId, diktatId } = auftrag.data as AuftragsDaten & { diktatId?: string };
|
||||
|
||||
if (!diktatId) {
|
||||
throw new Error("Diktatauftrag ohne Angabe, wofür — diktatId fehlt.");
|
||||
}
|
||||
|
||||
return diktatErkennen(organisationId, diktatId);
|
||||
}
|
||||
|
||||
async function aufbewahrungPruefen(auftrag: Job<AuftragsDaten>): Promise<{ entfernt: number }> {
|
||||
protokoll(`Aufbewahrungsfristen prüfen für Organisation ${auftrag.data.organisationId}`);
|
||||
|
||||
@@ -173,6 +202,13 @@ async function aufbewahrungPruefen(auftrag: Job<AuftragsDaten>): Promise<{ entfe
|
||||
// Fehlgeschlagene bleiben — sie zeigen einen kaputten Kanal an.
|
||||
const benachrichtigungen = await benachrichtigungenAufraeumen(auftrag.data.organisationId);
|
||||
|
||||
// Seit Phase 8: Wiki-Seiten nachziehen, deren Suchstand veraltet ist. Fängt
|
||||
// den Fall ab, dass der Worker stand oder das Modell nicht erreichbar war,
|
||||
// als jemand gespeichert hat.
|
||||
await veralteteSeitenEinbetten(auftrag.data.organisationId).catch((fehler) => {
|
||||
console.error("[worker] Nachträgliches Einbetten fehlgeschlagen:", fehler);
|
||||
});
|
||||
|
||||
// Ab Phase 8: Audit-Log exportieren und danach abräumen,
|
||||
// ausgetretene Mitglieder nach PERSON_ANONYMISIERUNG_TAGE anonymisieren.
|
||||
return { entfernt: benachrichtigungen.entfernt };
|
||||
@@ -186,6 +222,8 @@ const bearbeiter: Record<string, (auftrag: Job<AuftragsDaten>) => Promise<unknow
|
||||
[AUFTRAG.ATEMSCHUTZPROTOKOLL_ERZEUGEN]: atemschutzprotokollErzeugenAuftrag,
|
||||
[AUFTRAG.BENACHRICHTIGUNG_ZUSTELLEN]: benachrichtigungZustellen,
|
||||
[AUFTRAG.BENACHRICHTIGUNG_ERINNERN]: benachrichtigungErinnern,
|
||||
[AUFTRAG.WIKI_EINBETTEN]: wikiEinbettenAuftrag,
|
||||
[AUFTRAG.DIKTAT_ERKENNEN]: diktatErkennenAuftrag,
|
||||
[AUFTRAG.AUFBEWAHRUNG_PRUEFEN]: aufbewahrungPruefen,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user