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; mitgeliefertde_DE-thorsten,en_US-lessac,it_IT-paola); Gemini Live spricht jede Sprache selbst.
Websuche und Standort
Abschnitt betitelt âWebsuche und Standortâ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).
GesprÀchsmodus
Abschnitt betitelt âGesprĂ€chsmodusâ- 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).
Spracherkennung
Abschnitt betitelt âSpracherkennungâ- 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-whisperinitial_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_msim 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.
Fallback und AusfÀlle
Abschnitt betitelt âFallback und AusfĂ€lleâ- 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. Mitannounce_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-flashlieferte zeitweise 503 (Ăberlastung) und 429 (Kontingent). Die Kette wechselte automatisch aufgemini-flash-lite-latest.
Datenschutzregeln
Abschnitt betitelt âDatenschutzregelnâ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 hinzufĂŒgen
Abschnitt betitelt âProvider hinzufĂŒgenâ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).