# Betrieb ## OpenWebUI-Filter und Stabilitätsschutz Die versionierten Filter liegen unter `platform/openwebui/filters/`. Ihre Reihenfolge ist absichtlich festgelegt: 1. `Reasoning Default Off`, Priorität 10: setzt jeden Request zunächst auf `reasoning_effort=none`. 2. `Thinking`, Priorität 20: läuft nur bei aktiviertem Brain-Schalter und überschreibt den Standard mit Low, Medium oder High. 3. `MikeAI Auto Tool Selector`, Priorität 25: betrachtet ausschließlich die jüngste Nutzernachricht und stellt pro Anfrage höchstens zwei passende MCPs bereit. Er erkennt GitHub, Home Assistant, Sonarr/Radarr, Navidrome, Unraid-Diagnose und Athena-Plattformwissen. Manuell gewählte Werkzeuge bleiben erhalten. MUA mit erweiterten Verwaltungsrechten wird nie automatisch zugeschaltet. Die Auswahl eines MCP ist ausdrücklich keine Freigabe für eine Zustandsänderung. 4. `MikeAI Stability Guard`, Priorität 30: begrenzt einzelne und gesamte Werkzeugresultate, verdichtet bei Bedarf zuerst alte Tool-Ausgaben und Dialogteile und stoppt identische beziehungsweise ausufernde Tool-Schleifen. 5. `MikeAI Secret Redaction`, Priorität 40: entfernt übliche API-Keys, Tokens, Passwörter, JWTs und private Schlüssel aus Tool-Ergebnissen, bevor sie das Modell erreichen, sowie aus fertigen Modellantworten. Nutzereingaben und Authentifizierungswege werden nicht verändert. Offensichtliche Dokumentationsplatzhalter, Beispielwerte und Dateipfade bleiben sichtbar. Eine Statusmeldung nennt nur Trefferzahl, sichere Kategorie und Ursprung (Werkzeugausgabe oder Modellantwort); der erkannte Wert wird weder angezeigt noch protokolliert. 6. `MikeAI Spoken Tool Status`, Priorität 80: erkennt den ersten echten Werkzeugaufruf eines Antwortlaufs und löst im Browser genau eine kurze, passende Ansage für Web, Unraid, Home Assistant, Medienverwaltung oder sonstige Werkzeuge aus. Die fünf MP3-Clips sind vorgerendert und liegen unter `platform/openwebui/theme/tool-status/`; dadurch blockiert die Ansage weder XTTS noch das Werkzeug. Sie wird nur abgespielt, wenn der Benutzer in OpenWebUI die automatische Sprachausgabe aktiviert hat. Endet ein sehr schneller Lauf innerhalb der kurzen Wartezeit, wird die Ansage verworfen. 7. `MikeAI Local Performance Metrics`, Priorität 90: erfasst nach Abschluss ausschließlich technische Zahlen wie Laufzeit, Tokenzähler, Token/s und Tool-Anzahl. Nutzer-, Chat- und Nachrichten-IDs sowie sämtliche Textinhalte werden weder geschrieben noch gehasht gespeichert. OpenWebUI sortiert kleinere Prioritäten zuerst. Nach dem ersten Anlegen eines Admin-Benutzers oder nach einer Datenwiederherstellung werden alle Filter mit einer vorherigen Datenbanksicherung installiert beziehungsweise aktualisiert: ```bash sudo /opt/mike-ai/stack/platform/openwebui/install-filters.sh ``` Die sichtbaren Arbeitsbereichsmodelle und die versteckten Router-Aliase werden separat und ebenfalls mit vorheriger Datenbanksicherung installiert: ```bash sudo /opt/mike-ai/stack/platform/openwebui/install-models.sh ``` Dadurch erscheinen ausschließlich `MikeAI · Fast`, `MikeAI · Medium`, `MikeAI · Large`, `MikeAI · Ultra` und `MikeAI · Uncensored`. Medium ist die Standardauswahl. Alle fünf erhalten die geprüften Filter und Quick Actions sowie Piper-Stimme `alloy`. Vision ist bei Fast, Medium, Large und Uncensored aktiviert; Ultra bleibt bewusst text-only. Bildgenerierung wird erst als Fähigkeit freigeschaltet, wenn ein echter Generator-Worker im Stack aktiv ist. Kein MCP ist statisch an jedes Profil gebunden. Der Auto Tool Selector stellt nur die zur jüngsten Anfrage passenden Werkzeuge bereit, damit irrelevante Schemas weder Kontext verbrauchen noch die Werkzeugwahl des Modells verschlechtern. Eine manuelle Auswahl im Chat bleibt zusätzlich möglich. Die Auswahl arbeitet bewusst regelbasiert und lokal. Sie sendet keine Texte an einen Klassifizierungsdienst, speichert keine Prompts und führt selbst keine Werkzeugaktion aus. Erkennt sie keine eindeutige Absicht, wird kein MCP automatisch ergänzt. Schreibende oder kritische Rechte werden weiterhin durch das jeweilige MCP, Bestätigungsregeln und die manuelle MUA-Auswahl begrenzt. Alle fünf Modelle erhalten außerdem dieselbe Evidenzregel: Aussagen über aktuelle externe oder Systemzustände benötigen im aktuellen Turn einen erfolgreichen Aufruf des zuständigen Fachwerkzeugs. Task-Verwaltung zählt nicht als Datenquelle und wird für einzelne Fragen, Nachschlageaufgaben, Diagnosen oder Dateiauswertungen nicht verwendet. Fehlt das Werkzeug oder schlägt es fehl, muss das Modell die fehlende Verifikation offen nennen, statt Werte oder Diagnosen zu erfinden. Bei mehreren Administratoren muss der gewünschte Eigentümer explizit über `OPENWEBUI_FILTER_OWNER_ID` gesetzt werden. Das Skript liest oder verändert keine Chats. Es deaktiviert zugleich global die automatisch erzeugten Folgefragen (`task.follow_up.enable=false`). Dieselbe Vorgabe steht zusätzlich als Container-Umgebungswert im Compose-Stack, damit bereits eine frische OpenWebUI-Datenbank ohne Folgefragen startet. Der Stabilitätsschutz kennt die fünf Profilgrenzen 76.800, 80.000, 160.000, 192.000 und 262.144 Token. Für unbekannte Modelle gilt Medium (160.000) als sichere Vorgabe. Er reserviert Ausgabetoken und greift vor der harten llama.cpp-Grenze ein. Bilder bleiben unangetastet; JSON-Werkzeugschemas werden niemals abgeschnitten. Sind allein die ausgewählten Schemas zu groß, wird der Werkzeugzugriff nur für diesen Schritt deaktiviert und das Modell erhält eine eindeutige Abschlussanweisung. Allgemeine Webrecherche läuft nativ über Open WebUIs `search_web` und `fetch_url`; der frühere Web-MCP ist nur noch ein manuell gewähltes Spezialwerkzeug. Pro Antwort sind global höchstens zwölf Werkzeugrunden erlaubt. Der Stability Guard stoppt den zweiten identischen Aufruf, begrenzt ein Resultat auf 10.000 und alle Resultate zusammen auf 36.000 Zeichen. `install-filters.sh` setzt die schlüssellose DuckDuckGo-Suche dabei reproduzierbar aktiv (fünf Treffer, maximal drei parallele Abrufe). CSV-, TSV-, Excel- und ODS-Dateien werden ausschließlich lokal verarbeitet. Die Profile aktivieren dafür den eingebauten Python-Code-Interpreter und die nativen Dateizugriffswerkzeuge. Tabellen werden nicht als Knowledge/RAG-Text behandelt; Web- und Web-MCP-Werkzeuge sind für private Tabellendaten gesperrt. Der Home-Assistant-Relay behält `https://ha.casaderoll.de` als TLS- und Hostnamen, löst ihn innerhalb des Containers aber über `extra_hosts` auf den privaten Reverse Proxy `${HOME_LAN_PROXY_IP:-192.168.1.2}` auf. Damit fließt der MCP-Verkehr über WireGuard ins Heimnetz und nicht über die öffentliche Fritzbox-Adresse. Bei einer abweichenden Heimserver-IP wird nur `HOME_LAN_PROXY_IP` in `/etc/mike-ai/stack.env` angepasst. Nach Installation, Update oder Recovery prüft der rein lesende Katalog-TÜV alle laufenden MCPs auf Handshake, Werkzeuganzahl, Schema-Größe, ungültige Regex-Muster und verbotene GitHub-Komplettbäume. Er ruft dabei kein fachliches Werkzeug auf und liest keine Chats oder Secrets: ```bash sudo /opt/mike-ai/stack/dev/verify_mcp_catalogs.sh ``` Die rotierende, inhaltsfreie Metrikdatei liegt im persistenten OpenWebUI-Volume unter `mike-ai-request-metrics.jsonl` (maximal 5 MiB plus eine Rotation). Sie darf für Benchmarks ausgewertet werden, ohne Chats auszulesen. Die Werkzeugansagen enthalten weder Prompt- noch Ergebnistext und werden nicht in die Unterhaltung oder den Modellkontext geschrieben. Der lokale OpenWebUI-Browser-Event prüft die persönliche Einstellung `responseAutoPlayback` über denselben Browser-Login. Ein Fehler, eine Browser-Autoplay-Sperre oder ein fehlender Clip bleibt folgenlos für den Chat. ## Aktionen an Modellantworten Die globale Action `MikeAI Quick Actions` ergänzt die Nachrichtenleiste um: - `Kurzfassung`, `Als Checkliste`, `Technische Diagnose` und `Unsicherheiten prüfen`: jeweils ein bewusster zusätzlicher lokaler Modellaufruf, dessen Ergebnis unter der gewählten Antwort ergänzt wird. - `Mit Thinking verbessern`: lokale erneute Prüfung mit Medium-Reasoning und festem Thinking-Budget; Werkzeuge werden dabei nicht injiziert. - `Quellen prüfen`: erstellt lokal eine knappe Suchanfrage, ruft ausschließlich den internen Web-MCP auf und lässt Qwen die Antwort gegen dessen begrenzte, als unvertrauenswürdig markierte Belege prüfen. - `Markdown kopieren`: kopiert den gewählten Antworttext im aktiven Browser ohne Modellaufruf und ohne serverseitige Datei. Die Aktionen schreiben nicht in Git oder Zielsysteme und schalten keine Routerprofile um. Action-Funktionen laufen mit Serverrechten; deshalb bleibt der geprüfte Quellcode Bestandteil dieses Repositorys und wird nicht aus dem Community Store nachgeladen. ## Profile | Profil | Virtuelles Modell | Kontext | Zweck | |---|---|---:|---| | Fast | `qwen-fast` | 76.800 | Alltag, Agenten, hohe Geschwindigkeit, integrierte Vision | | Medium **(Standard)** | `qwen-medium` | 160.000 | IQ4_XS Pure, beide GPUs 90:10, MTP3, integrierte Vision | | Large | `qwen-large` | 192.000 | IQ4_XS Pure, beide GPUs 86:14, MTP3, integrierte Vision | | Ultra | `qwen-ultra` | 262.144 | maximaler Textkontext, IQ4_XS Pure auf RTX 5080 + RTX 3060 (80:20), ohne Vision-Projektor | | Uncensored | `qwen-uncensored` | 80.000 | Abliterated Q4_K_M, 90:10, MTP2, integrierte Vision; nicht Default | Manuell wird mit `llama-profile fast|medium|large|ultra|uncensored` gewechselt. Über HTTP stehen `POST /fast`, `/medium`, `/large`, `/ultra` und `/uncensored` zur Verfügung. Ultra erreichte im Referenzlauf etwa 68 Token/s; ein Prompt-Fülltest mit rund 220.000 Tokens war erfolgreich. Medium ist das Start- und Standardprofil. Uncensored reduziert modellseitige Verweigerungen, hebt aber keinerlei Tool-Rechte auf. Destruktive Aktionen benötigen weiterhin Bestätigung und die zentralen Secret-, Prompt-Injection- und Tool-Output-Filter bleiben aktiv. ## Clients Clients verbinden sich mit: ```text http://192.168.1.212:8081/v1 ``` Dies ist die OpenAI-kompatible Router-API für Zettelrobbe, Hermes und andere Clients im Heimnetz. `http://192.168.1.212:8080` ist ausschließlich Open WebUI und darf nicht als API-Basisadresse eingetragen werden. Als API-Key verwenden sie den Inhalt von `/etc/mike-ai/router-api-key` über Bearer-Authentifizierung. Der Key gehört in den Secret-Store des Clients, nicht in Chat, Repository oder URL. Eine Rotation erfolgt atomar durch Ersetzen der Datei und Neustart des Routerdienstes. Nur lokal auf Athena anzeigen und direkt in den Zielclient kopieren: ```bash sudo cat /etc/mike-ai/router-api-key ``` Ein einfacher Verbindungstest ohne Ausgabe des Schlüssels: ```bash ROUTER_API_KEY=$(sudo cat /etc/mike-ai/router-api-key) curl -fsS http://192.168.1.212:8081/v1/models \ -H "Authorization: Bearer $ROUTER_API_KEY" unset ROUTER_API_KEY ``` Sie sollen nicht direkt Port 8080 verwenden, weil sie sonst Profilumschaltung, Vision, Bildgenerierung, STT und TTS umgehen. ## Status - `GET /health`: Routerprozess lebt; bleibt bei geplantem Hotswap grün - `GET /ready`: Router und Textmodell sind einsatzbereit - `GET /status`: authentifizierter Detailstatus, Profil, Upstream, aktive Jobs - `GET /v1/models`: virtuelle Modelle - llama.cpp-Metriken: ausschließlich Docker-intern abfragen - systemd-Journal: nur Metadaten und Fehler prüfen; keine Promptinhalte sammeln ## Upgrade-Regel Niemals Build, Quantisierung und Profil gleichzeitig ändern. Immer genau eine Variable ändern und anschließend denselben Benchmark ausführen. Profilkontext und Alias werden zusätzlich in `/etc/mike-ai/router-profiles.json` gepflegt. Änderungen an Override und Registry gehören in denselben getesteten Commit; andernfalls verweigert die Readiness bewusst die Freigabe. ## Fehler- und Recovery-Verhalten - Ein Profilwechsel bricht ab, wenn laufende Chats nicht innerhalb des Drain-Timeouts enden. Er beendet niemals absichtlich einen Chat. - Nach einem Routerabsturz wird das letzte stabile Profil aus der atomaren Zustandsdatei rekonstruiert. - `/health = 200`, aber `/ready = 503` bedeutet: Router lebt, Modell ist noch nicht bereit oder wird gerade gewechselt. - `429` bedeutet, dass die Parallelitätsgrenze erreicht ist; der Client soll mit Backoff erneut versuchen. ## Kapazitätsregeln - Systempartition dauerhaft unter 85 Prozent halten. - Mindestens 1 GiB Sicherheitsreserve für allgemeine GPU-Profile vorsehen; experimentelle Max-GPU-Profile klar kennzeichnen. - Nur ein Textmodell gleichzeitig laden. - Benchmarks sind deaktivierte, manuell gestartete Jobs und keine Boot-Dienste. ## Backup Gesichert werden: - dieses Repository, - lokale Modellmanifest-Datei mit Hashes, aber ohne Secrets, - `/etc/mike-ai` verschlüsselt, - systemd-Konfiguration, - Benchmarkresultate. Nicht gesichert werden müssen Build-Verzeichnisse, Venvs, Caches oder Modelle, wenn Downloadquelle und Prüfsumme dokumentiert sind.