my_voice_assistant_v3_jamulix/CHANGELOG.md
dschlueter 55d07187bb fix(api): /api/chat 500 (NameError emergency) beheben + Version 0.3.7
Toter Verweis auf die in 3389f75 entfernte Auto-Notfallerkennung entfernt
(if emergency/X-Emergency-Header). /ws/chat war nicht betroffen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 02:54:28 +02:00

157 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.7] — 2026-07-01
### Behoben
- **`/api/chat` (REST) warf HTTP 500** (`NameError: emergency`) — toter Verweis auf
die in `3389f75` entfernte automatische Notfallerkennung. Block entfernt; der
Web-UI-Weg (`/ws/chat`) war nicht betroffen.
## [0.3.6] — 2026-07-01
### Hinzugefügt
- **Modell-Browser (Cloud) im Admin** (System-Tab): durchsuchbare OpenRouter-Modelle
mit Tool-Badge (✅ im Eval bestätigt / 🔧 laut Anbieter), ⬆/⬇-Preisen pro Mio.
Token und geschätzter „$/Antwort" (aus live gemessenem Turn-Token-Profil).
„Verwenden" setzt `openrouter_llm_model`. Lokale Modelle: spätere Phase.
- Token je Turn werden nun erfasst (Turn-Token-Profil, EMA) — Basis für „$/Antwort".
- `qwen/qwen3.5-35b-a3b` als **eval-verifiziert** aufgenommen (Tool-Calling-Test
bestanden).
## [0.3.5] — 2026-06-30
### Hinzugefügt
- **Kostenerfassung vervollständigt:**
- **Filler-Übersetzung** (OpenRouter) bucht jetzt ihre Ist-Kosten (Kategorie `llm`).
- **OpenRouter-TTS** wird geschätzt erfasst (Zeichen × `openrouter_tts_usd_per_char`,
Kategorie `tts`) — der Audio-Endpunkt liefert keine inline-`usage`. Preis im Admin
live einstellbar (Default ≈ $15/1M Zeichen, an Modellpreis anpassen).
## [0.3.4] — 2026-06-30
### Hinzugefügt
- **Admin: Daten je Nutzer gezielt löschen** — neue Knöpfe pro Nutzerkarte
„Statistik zurücksetzen" (Anfragen/Web-Suchen/Kosten inkl. Budget-Zähler) und
„Erinnerungen löschen". Konto und Verlauf bleiben; audit-geloggt.
- **Admin: Bulk „Alle Nutzerdaten löschen (Konten behalten)"** (Gefahrenzone,
doppelte Bestätigung): löscht für alle Nutzer Verlauf, Statistik, Erinnerungen
und Notruf-Protokolle auf einmal; die Konten selbst bleiben. Das Audit-Log
(System-Logger) bleibt unberührt.
### Geändert
- **Nutzerliste alphabetisch** (case-insensitive) statt nach Anlagedatum.
- **Nutzungsstatistik-Tabelle alphabetisch** sortiert; die „Anfragen je Nutzer"-
Balken bleiben nach Aktivität.
## [0.3.3] — 2026-06-30
### Hinzugefügt
- **Tarife der Kostenschätzung im Admin live einstellbar:** Strompreis (€/kWh),
Notruf-Kosten (€/Alarm), Cartesia ($/Zeichen).
- **`local_llm_base_url` live-setzbar** (Admin-Live-Config; wirkt pro Request ohne
Deploy) — lokale LLM-Basis-URL ohne Neustart umstellbar.
- **15 weitere Beruhigungssätze** für die Web-Suche (Opening 12 → 27, zufällige Auswahl).
### Behoben
- **Stille bei „kein Treffer":** Kommt keine Antwort (z. B. Web-Suche ohne Ergebnis),
sagt das System jetzt eine freundliche, lokalisierte Mitteilung („Dazu konnte ich
leider keine Informationen finden.") statt stumm zu bleiben.
- **Immer gleicher Beruhigungssatz** lag an einem alten Übersetzungs-Cache; wird beim
Start mit der formalen „Sie"-Übersetzung neu gefüllt.
## [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.