Zum Inhalt springen

KI-Provider, Rollen und Datenschutz

Code: backend/src/justai/ai/. BegrĂŒndung: ADR 0006.

Jede Aufgabe ist eine Rolle mit einer Provider-Kette (erster Eintrag = primÀr, danach Fallbacks), einer LokalitÀtsregel und einem Timeout:

Rolle WofĂŒr Standard ohne Google-Key Standard mit Google-Key
conversation Antworten im Pipeline-Modus – (zuordnen!) gemini-3.8-flash → gemini-flash-lite-latest
reasoning komplexe Fragen, Sicherheitsreview generierter Tools – wie oben
vision „Was siehst du?“ – wie oben
memory Extraktion/Konsolidierung von Erinnerungen – wie oben
tool_generation neue Tools schreiben – wie oben
background Zusammenfassungen u. a. – wie oben
realtime Sprache-zu-Sprache (Gemini Live) – gemini-3.8-live
stt Spracherkennung faster-whisper small (lokal) gleich
tts Sprachausgabe Piper (lokal) gleich
embedding GedÀchtnis-Vektoren fastembed multilingual (nur lokal) gleich

Wakeword und VAD laufen immer lokal und sind keine KI-Rollen.

Ohne Google-Key und ohne lokales LLM kann der Assistent hören und sprechen, aber nicht antworten. Ein lokales LLM (z. B. Ollama, DEPLOYMENT.md) muss unter KI-Provider → Modelle & Fallbacks den Rollen zugeordnet werden. Das geschieht nicht automatisch, weil GrĂ¶ĂŸe und QualitĂ€t lokaler Modelle stark variieren.

Sobald ein Google-Key eingetragen wird, fĂŒllt JuStAI leere Rollen mit den Gemini-Standards. Vom Admin konfigurierte Rollen bleiben unverĂ€ndert.

Der Assistent versteht und spricht Deutsch, Englisch und Italienisch (Einstellung languages, Hauptsprache default_language unter KI-Provider).

  • Er antwortet in der Sprache, in der er angesprochen wurde, und wechselt mit, wenn jemand mitten im GesprĂ€ch die Sprache wechselt.
  • Alles, was das Sprachmodell liest, ist englisch: System-Prompt, Tool-Beschreibungen und -Ergebnisse, Fehlermeldungen, Event-Katalog. Die Anweisung „antworte immer in der Sprache des Benutzers“ sorgt fĂŒr die richtige Antwortsprache.
  • Texte, die ohne Modell gesprochen oder gespeichert werden, stehen ĂŒbersetzt in justai/i18n.py: die Entschuldigung nach einem Fehler, der Hinweis auf eine Cloud-Antwort, Durchsagen von ÜberwachungsauftrĂ€gen, die Episoden-Erinnerung.
  • Erinnerungen werden in der Sprache des GesprĂ€chs gespeichert; die Suche funktioniert sprachĂŒbergreifend (mehrsprachige Embeddings).
  • Piper-Stimmen pro Sprache (voices; mitgeliefert de_DE-thorsten, en_US-lessac, it_IT-paola); Gemini Live spricht jede Sprache selbst.

Mit Gemini kann der Assistent im Internet nachschlagen (Google-Suche, von Gemini neben den eigenen Tools von JuStAI ausgefĂŒhrt): Orte, Öffnungszeiten, Nachrichten, Preise. Das geht im Realtime- und im Pipeline-Modus. Schalter: Plugins → Gemini → Google-Suche (Standard an). Die Suchanfragen gehen an Google; ĂŒber das kostenlose Kontingent hinaus kann Google die Suche berechnen.

Einstellungen → System → Standort des Hauses (Ort oder Adresse) bekommt der Assistent als Bezugspunkt fĂŒr „hier“, „in der NĂ€he“ und „das nĂ€chste 
“.

Fehlt eine FĂ€higkeit ganz, bietet der Assistent an, ein Plugin zu bauen (tools.develop), statt zu sagen, dass es nicht geht, und legt los, sobald man ihn darum bittet (PLUGINS.md).

  • Realtime (Standard mit Google-Key): Audio geht direkt an Gemini Live, Antworten kommen als Audio zurĂŒck. Niedrigste Latenz, Unterbrechen im Modell. JuStAI schickt nur Audio, das das Echo-Gate passiert hat.
  • Pipeline: lokale STT → LLM der Rolle conversation → lokale TTS. Jeder Schritt ist einzeln austauschbar und kann komplett lokal laufen. SĂ€tze werden gestreamt (TTS beginnt mit dem ersten Satz).

Pro Endpoint kann der Modus ĂŒberschrieben werden (conversation.mode).

  • Sprachen: Die konfigurierten Sprachen (Hauptsprache zuerst) gehen als erwartete Sprachen an die Erkennung, an Gemini Live als language_codes. Vorher erkannte die automatische Spracherkennung kurze Schnipsel oft als Spanisch oder Hindi. In der Pipeline wird ein Ergebnis in einer nicht erlaubten Sprache in der GesprĂ€chssprache neu erkannt.
  • Vokabular: Name des Assistenten, „Jarvis“, RĂ€ume und Namen von Personen und Tieren gehen als bevorzugte Begriffe an die Erkennung (Gemini custom_vocabulary, faster-whisper initial_prompt).
  • Pausen: Gemini beendet den Benutzerbeitrag erst nach 1,0 s Stille mit unempfindlicher Ende-Erkennung (Plugin-Einstellung vad_silence_ms). Vorher wurde eine Denkpause von 0,7 s als Satzende gewertet. Der Assistent begann zu antworten, und bei Halbduplex-Kameras fiel der Rest des Satzes in die Echosperre.
  • Messung: Jedes GesprĂ€ch speichert, wie viel sprachĂ€hnlicher Ton in die Echosperre fiel (gated_speech_ms im GesprĂ€chsverlauf, Log „speech during echo gate“). Viel davon heißt: Die Sperre ist fĂŒr dieses GerĂ€t zu lang.

PrĂŒfstand (scripts-unabhĂ€ngig, im Container): deutsche TestsĂ€tze in KameraqualitĂ€t (8 kHz, Raumrauschen) erkennt Gemini Live mit und ohne diese Einstellungen zu ~99 % richtig. Die Fehler im echten Betrieb entstehen also vor allem durch abgeschnittene oder zerteilte SĂ€tze, nicht durch die Erkennung selbst.

  • FĂ€llt der primĂ€re Provider aus (Fehler, Timeout, kein erstes Token nach 25 s), wird der nĂ€chste der Kette genommen. Der fehlerhafte Provider pausiert danach kurz (Cooldown), damit nicht jede Anfrage erst auf den Fehler wartet. Pausierte Modelle zeigt das Dashboard orange.
  • Jeder Fallback erzeugt ai.provider.fallback. Ein Wechsel von lokal zu Cloud steht immer im Audit-Log. Mit announce_cloud_fallback (Standard: an) sagt der Assistent im laufenden GesprĂ€ch (Pipeline-Modus) vor der Antwort, dass sie aus der Cloud kommt.
  • Beobachtet im Betrieb: gemini-3.8-flash lieferte zeitweise 503 (Überlastung) und 429 (Kontingent). Die Kette wechselte automatisch auf gemini-flash-lite-latest.

KI-Provider → Datenschutz & Kosten:

Schalter Wirkung
cloud_allowed global: Cloud-Provider ĂŒberhaupt zulassen
camera_images_to_cloud Kamerabilder an Cloud-Modelle
conversation_audio_to_cloud GesprÀchsaudio an Cloud (betrifft Realtime und Cloud-STT)
personal_memories_to_cloud Erinnerungen und persönliche Kontexte an Cloud-Modelle
announce_cloud_fallback Wechsel zur Cloud im GesprÀch ansagen (protokolliert wird er immer)
pro Rolle locality local_only / prefer_local / any
pro Raum cloud_media_allowed Bilder/Audio aus diesem Raum nie in die Cloud

Verbietet eine Regel alle Provider einer Kette, schlÀgt die Anfrage mit einem klaren Grund fehl, statt die Regel zu umgehen.

Jeder Aufruf wird mit Tokens, Audiosekunden, Latenz und geschĂ€tzten Kosten protokolliert (KI-Provider → Nutzung, Dashboard „KI-Kosten heute“). Tages- und Monatslimits (cost_limits.daily_usd, monthly_usd) sperren Cloud-Provider beim Erreichen; lokale laufen weiter. Die Kosten sind SchĂ€tzungen aus Token-Zahlen und Listenpreisen, keine Abrechnung.

Provider sind Plugins mit dem Recht ai.provide (Ports in justai_sdk.ports.ai: Chat mit Tools und Streaming, Realtime, STT, TTS, Embeddings). Jeder OpenAI-kompatible Server lĂ€sst sich ohne Code ĂŒber das Plugin OpenAI-kompatibel als weiterer Endpoint eintragen. Getestet wurde das mit der OpenAI-kompatiblen Schnittstelle von Gemini: Die Rolle conversation wurde nur per Konfiguration umgestellt (TESTING.md, Kriterium 16).