Nextcloud in Open WebUI integrieren
So wird die lokale KI mit Zugriff auf den eigenen Nextcloud-Kalender zum perfekten Sekretär.
In Teil 1 meiner Nextcloud-KI Reihe geht es um die Anbindung der heimischen Nextcloud an einen lokalen KI-Assistenten. Sie eröffnet völlig neue Möglichkeiten für die Organisation des digitalen Alltags. Mit dem Community-Werkzeug owuinc (Open WebUI Nextcloud Integration) lassen sich Kalender, Aufgaben und Dateien direkt über Open WebUI verwalten. Der Weg zu einem reibungslos funktionierenden KI-Sekretär erfordert jedoch einige gezielte Anpassungen unter der Haube, insbesondere wenn das System von starren Standardvorgaben abweicht.
Installation und maßgeschneiderte Konfiguration
Das Werkzeug lässt sich komfortabel über den Workspace in Open WebUI importieren.



Im Hintergrund greift das Python-Skript auf die CalDAV- und WebDAV-Schnittstellen der Nextcloud zu. Standardmäßig geht der Code davon aus, dass der Hauptkalender und die Aufgabenliste den Namen Personal beziehungsweise Tasks tragen.
Wird in der Nextcloud jedoch ein individueller Name, beispielsweise Michael, verwendet, läuft die KI unweigerlich ins Leere. Nextcloud ist bei diesen Bezeichnungen strikt case-sensitive – ein kleines m führt unweigerlich zu einem Fehler. Um das Problem zu lösen, müssen die sogenannten Valves (die extern steuerbaren Parameter des Tools) über das Zahnrad-Symbol im Open WebUI-Werkzeugmenü angepasst werden. Hier werden die Felder Default Calendar, Default Task List, Calendar Whitelist und Task List Whitelist schlichtweg auf den korrekten Namen (im Beispiel Michael) gesetzt. Code-Änderungen sind an dieser Stelle noch nicht erforderlich.
Phantom-Werkzeuge und der System-Prompt
Selbst mit der korrekten Kalenderbezeichnung stößt man schnell auf ein faszinierendes Phänomen großer Sprachmodelle: Die KI beginnt zu halluzinieren. Da LLMs in ihrem Training millionenfach mit Standard-Kalender-APIs konfrontiert wurden, "erfindet" das Modell gerne ein Werkzeug namens search_calendar_events und versucht, Start- und Enddaten für Suchanfragen zu übergeben. Da dieses Werkzeug im owuinc-Quellcode jedoch gar nicht existiert, wird der Fehler im Hintergrund geschluckt und die KI erhält eine leere Dummy-Antwort ({"events": [], "total": 0}). Das System zieht daraus fälschlicherweise den Schluss, der Kalender sei leer.
Um der KI diese Eigenart abzugewöhnen, muss der System-Prompt des Modells mit strikten Regeln ausgestattet werden. Es ist entscheidend, dass die KI ausschließlich das echte Werkzeug get_calendar_events verwendet – und zwar komplett parameterlos. Die Filterung der Termine erledigt das Modell nach dem Herunterladen der gesamten Liste im eigenen "Kopf".
Ein funktionierender Block für den System-Prompt sieht folgendermaßen aus:
WICHTIGE REGELN FÜR DEN KALENDER:
1. Nutze zum Abfragen von Terminen IMMER UND AUSSCHLIESSLICH das Werkzeug `get_calendar_events`. Das Werkzeug `search_calendar_events` existiert nicht und ist verboten!
2. Rufe `get_calendar_events` IMMER GANZ OHNE PARAMETER auf! Übergib niemals einen `calendar_name`, kein `start` und kein `end`. (Dein Standardkalender wird vom System im Hintergrund völlig automatisch geladen).
3. Sobald du das Werkzeug ohne Parameter aufgerufen hast, erhältst du die komplette Liste aller anstehenden Termine.
4. Filtere diese Liste selbst in deinem Kopf (z.B. wenn nach "Terminen im Juli" gefragt wird, suche dir die Juli-Termine aus der gelieferten Liste heraus).
Ein entscheidender Stolperstein: Open WebUI friert System-Prompts und Werkzeuge zu Beginn eines Chats ein. Nach Änderungen an diesen Regeln muss zwingend ein neuer Chat gestartet werden, damit der Cache geleert wird und die KI die Geister-Tools "vergisst".
Feinschliff am Python-Skript
Nachdem die KI nun das korrekte Werkzeug ansteuert, offenbaren sich in der Praxis oft zwei kleine Bugs im Quellcode von owuinc, die zu kompletten Abstürzen führen können. Beide lassen sich direkt im Code-Editor von Open WebUI beheben.
Das erste Problem ist eine fehlende Fallback-Lösung für die Zeitzone. Das Skript erwartet zwingend, dass Open WebUI die Variable __user__["timezone"] mitsendet. Fehlt diese, kommt es zu einem Absturz (KeyError). Um dies zu beheben, wird jedes Vorkommen (etwa 7 Stück) im Code durch eine sichere Abfrage ersetzt:
# M. Meister - Vorher:
__user__["timezone"]
# Nachher (inklusive Fallback auf deutsche Zeit):
__user__.get("timezone", "Europe/Berlin")
Das zweite Problem betrifft Termine in der Nextcloud, denen eine Kategorie (z.B. "Privat" oder "Arbeit") zugewiesen wurde. Nextcloud liefert diese als spezielles Objekt (vCategory) zurück. Das Open WebUI-Backend erwartet jedoch reinen Text für die JSON-Serialisierung und stürzt mit der Meldung Object of type vCategory is not JSON serializable ab.
Die Lösung liegt in der Funktion get_calendar_events. Der Block, der die Event-Felder ausliest, wird so angepasst, dass spezielle Kalender-Objekte vor dem Senden ordnungsgemäß in lesbaren Text konvertiert werden:
# M. Meister - Fix für vCategory JSON Serialisierung
for field in [
"uid",
"summary",
"description",
"location",
"categories",
"organizer",
"url",
]:
if val := e.component.get(field):
# Prüfung auf iCal-Objekte und Konvertierung
if hasattr(val, "to_ical"):
event_dict[field] = val.to_ical().decode("utf-8")
else:
event_dict[field] = str(val)
Funktionsprüfung
Da jetzt endlich die Daten abgefragt werden können, sollte man sie auch leicht mit normaler Sprache abfragen können:

Das war leicht. Doch kann ich auch Termine anlegen? Auch das wird noch schnell getestet:

Tatsächlich. Dieser Termin ist auf meinem anderen Bildschirm fast zeitgleich erschienen:

Diese Eigenschaften sollen sich noch als sehr nützlich erweisen, da ich nun auch ohne den Google-Assistenten Gemini auskomme. Eine nützliche App stelle ich am Ende der Reihe vor:

Fazit
Die Anbindung der Nextcloud an lokale LLMs über das owuinc-Tool ist eine überaus mächtige Funktion, verlangt jedoch initial ein wenig technisches Fingerspitzengefühl. Durch das Anpassen der Valves, strikte Vorgaben im System-Prompt gegen KI-Halluzinationen, und zwei kleine Patches im Python-Code entsteht ein hochzuverlässiges System. Der KI-Assistent kann fortan Termine fehlerfrei auslesen und logisch filtern, ganz ohne dass private Daten das eigene Netzwerk verlassen.