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
@@ -143,10 +143,45 @@ const schema = z.object({
|
||||
/// Wie lange zugestellte Benachrichtigungen aufgehoben werden.
|
||||
BENACHRICHTIGUNG_AUFBEWAHRUNG_TAGE: zahl(90),
|
||||
|
||||
/**
|
||||
* Sprachmodelle, ausschließlich gegen einen selbst betriebenen Endpunkt
|
||||
* (Ollama, vLLM, llama.cpp). Ab Phase 8 tatsächlich benutzt.
|
||||
*
|
||||
* Es gibt keinen Rückfall auf einen Anbieter. Fehlt der Endpunkt, fehlt die
|
||||
* Funktion — sie wird nicht durch einen fremden Dienst ersetzt.
|
||||
*/
|
||||
LLM_ENABLED: boolAusText(false),
|
||||
LLM_BASE_URL: z.string().optional(),
|
||||
LLM_API_KEY: z.string().optional(),
|
||||
LLM_MODELL: z.string().optional(),
|
||||
/// Zeitlimit für eine Antwort. Ein Bericht darf dauern, aber nicht ewig.
|
||||
LLM_TIMEOUT: zahl(120),
|
||||
|
||||
/**
|
||||
* Modell für Einbettungen (semantische Suche im Wiki).
|
||||
*
|
||||
* ACHTUNG: Die Spalte wikiabschnitt.einbettung ist auf 768 Dimensionen
|
||||
* festgelegt — das liefert nomic-embed-text. Ein Modell mit anderer Länge
|
||||
* braucht eine Migration, siehe README.
|
||||
*/
|
||||
LLM_EINBETTUNG_MODELL: z.string().default("nomic-embed-text"),
|
||||
LLM_EINBETTUNG_DIMENSIONEN: zahl(768),
|
||||
|
||||
/// Modell, das Bilder lesen kann — für die Belegerfassung.
|
||||
LLM_VISION_MODELL: z.string().optional(),
|
||||
|
||||
/**
|
||||
* Spracherkennung über einen selbst betriebenen faster-whisper
|
||||
* (Compose-Profil "ki"). Ohne ihn ist das Diktat abgeschaltet.
|
||||
*/
|
||||
WHISPER_ENABLED: boolAusText(false),
|
||||
WHISPER_URL: z.string().url().optional(),
|
||||
WHISPER_MODELL: z.string().default("base"),
|
||||
WHISPER_SPRACHE: z.string().default("de"),
|
||||
/// Zeitlimit für eine Aufnahme. Zehn Minuten Sprache brauchen Zeit.
|
||||
WHISPER_TIMEOUT: zahl(300),
|
||||
/// Höchstlänge einer Aufnahme in Sekunden.
|
||||
DIKTAT_MAX_SEKUNDEN: zahl(600),
|
||||
|
||||
// Terminal im Gerätehaus (Phase 4)
|
||||
/// Wetterwarnungen des DWD auf dem Hallenmonitor. Die einzige Verbindung,
|
||||
|
||||
Reference in New Issue
Block a user