# Changelog Alle nennenswerten Änderungen an **Alexis**. Format lose nach [Keep a Changelog](https://keepachangelog.com/de/); Versionierung nach [SemVer](https://semver.org/lang/de/) (prä-1.0: `0.x`). ## [0.3.2] — 2026-06-30 ### Hinzugefügt - **Pro-Nutzer-Kostenerfassung (USD).** Zentraler `CostMeter` (ContextVars, multitool-ready, `app/core/costs.py`); Konzept in `Docs/kosten-erfassung.md`. - *Exakt:* Alle OpenRouter-Calls (LLM, Web-Suche/Sonar, Koreferenz, Fallback) senden `usage:{include:true}` und buchen die Ist-Kosten je Kategorie (`llm`/`web_search`) — inkl. finalem Streaming-`usage`-Chunk. - *Geschätzt:* lokales LLM (Call-Dauer × Strom-Formel, marginaler GPU-Verbrauch, `llm_local`), Cartesia-TTS (Zeichen × Preis, `tts`), Notruf (pro Webhook-Alarm, `alert`, nur Doku — nie Sperre). Sätze konfigurierbar (GPU-Watt/Last, Strompreis, `usd_per_eur`, Cartesia-Preis, Alarm-Preis). - `cost_usage`-Tabelle (Nutzer/Tag/Kategorie); Statistik-Spalten **„Kosten (Monat)"** + **„Ø/Anfrage"**, Tooltip „davon geschätzt" und Summenzeile **„exakt vs. geschätzt"**. - **$-Tagesbudget pro Nutzer** (`cost_daily_limit_usd`, Pref > global, 0 = unbegrenzt): ist das Web-Such- oder Kostenbudget aufgebraucht, wird die Web-Suche für den Turn ausgesetzt (+ freundlicher Hinweis). Admin-Eingabe + globales Live-Setting. - **Nutzungsstatistik: Spalte „mit Websuche"** je Nutzer (`total_web_searches`). ## [0.3.1] — 2026-06-30 ### Hinzugefügt - **Admin: „Verlauf löschen" pro Nutzer** — löscht Sessions + Nachrichten eines Nutzers, ohne Konto/Erinnerungen/Nutzungsdaten (Button + `DELETE /api/admin/users/{id}/history`, audit-geloggt). - **Web-Suche pro Nutzer ein-/ausschaltbar** (Admin-Checkbox). `web_search_enabled` fehlte im `AdminUserPrefsUpdate`-Schema und wurde still verworfen — jetzt wirksam. - **Web-Such-Budget pro Nutzer/Tag** (`web_search_daily_limit`, 0 = unbegrenzt; Pref > global): Tageszähler (`web_search_usage`); ist das Kontingent aufgebraucht, wird die Web-Suche für den Turn ausgesetzt. Admin-Eingabefeld. - **Freundliche Hinweise:** Ist die Web-Suche bei einer klar tagesaktuellen Frage nicht verfügbar (abgeschaltet oder Kontingent aufgebraucht), erscheint eine kleine, lokalisierte System-Notiz in der Unterhaltung. ### Behoben - Veraltete Dev-Datenbank (`data/voice-assistant.db`) entfernt; Produktiv-DB liegt unter `/var/lib/voice-assistant/` (Doku-Klarstellung der Prod/Dev-Trennung). ## [0.3.0] — 2026-06-30 ### Hinzugefügt - **Web-Suche per Tool-Calling („Weg 2"):** Das zentrale Modell entscheidet selbst, ob eine Frage tagesaktuelle Fakten braucht, holt sie über `perplexity/sonar` und formuliert die Antwort in Persona (Vorrang fürs frische Faktum). Standard **an**, pro Nutzer/Profil abschaltbar (`web_search_enabled`). **Quellen-Links** unter der Antwort. Ausführliche Referenz: `Docs/weg2-tool-calling.md`. - **Deterministischer Such-Backstop** für heikle Kategorien (aktuelle Amtsträger, Wohnort lebender Personen, „lebt X noch", Öffnungszeiten/Fahrpläne): diese suchen *immer* — auch auf einem tool-unfähigen Modell (Fakten als System-Kontext). - **Beruhigungssätze während der Recherche:** zufällige, in die Zielsprache übersetzte „Sie"-Sätze (sofort gesprochen — Server- *und* Geräte-TTS, sowie in der Status-Zeile); bei langer Recherche Geduldssätze (Abstand ≥ 10 s). Eine Pflege- Stelle (`app/pipeline/fillers.py`, Englisch). - **Zentrale Datum-/Uhrzeit-Auskunft** (`app/core/clock.py`): in alle LLM-System- Prompts injiziert → relative Zeitangaben („heute", „morgen", „nächsten Montag", „in 3 Stunden") werden aufgelöst. - **Koreferenz-Vorstufe** (Pronomen-Folgefragen) + Metriken `tool_calls_total`, `sonar_calls_total`, `search_forced_total`, `tool_unsupported_total`. ### Geändert - **Standard-LLM:** `mistralai/mistral-small-3.2-24b-instruct` (tool-fähig; im Tool-Calling-Eval einziger Recall-Gate-Passer). Die frühere Baseline `mistralai/mistral-small-24b-instruct-2501` kann **kein** Tool-Calling — nicht mehr dorthin zurückstellen, solange die Web-Suche aktiv ist. ## [0.2.0] — 2026-06-27 ### Geändert - **Marke:** Produkt heißt jetzt **Alexis** (Anzeigename); technische Identifier (Dienst, Pfade, Paketname, Konfig-/DB-Dateinamen) bleiben unverändert. - Version wird im UI (Kopfzeile) und unter `/api/config` (`version`) angezeigt; eine Quelle der Wahrheit ist `pyproject.toml`. ### Hinzugefügt - **Aufgeräumtes Vorlese-Menü:** nicht nutzbare TTS-Provider werden ausgeblendet (statt ausgegraut). Backend liefert die fertige Sichtbarkeit (`tts_menu`), „Im Gerät" nur auf Mobilgeräten. `/api/config` wird serverseitig gecacht (spart die zuvor pro Seitenladen ausgelöste, kostenpflichtige OpenRouter-Probe). - **GPU-Erkennung:** Setting `GPUS` (`auto|none|"0,1,2"`), an `CUDA_VISIBLE_DEVICES` gekoppelt; zentrale Erkennung in `app/capabilities.py`. ### Behoben - **Stimm-Geschlechtswahl wirkt wieder:** `voice_gender` fehlte im `UserPrefs`-Schema und wurde still verworfen → es kam immer die weibliche Stimme. Feld ergänzt (+ Regressions-Test). - **Geräte-TTS** folgt der Geschlechtswahl (Heuristik über Stimmname/voiceURI), sonst Server-Fallback. ## [0.1.0] - Erste interne Version: modulares Gateway (STT/LLM/TTS austauschbar), Profile, Provider-Registries, Notruf-Eskalation, Auto-Erinnerungen, Admin-Panel, Auth/SSO + Passwort-Login.