2026-06-27 07:02:02 +02:00
|
|
|
|
# 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`).
|
|
|
|
|
|
|
2026-07-01 02:54:28 +02:00
|
|
|
|
## [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.
|
|
|
|
|
|
|
2026-07-01 02:49:28 +02:00
|
|
|
|
## [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).
|
|
|
|
|
|
|
2026-06-30 19:27:08 +02:00
|
|
|
|
## [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).
|
|
|
|
|
|
|
2026-06-30 19:13:05 +02:00
|
|
|
|
## [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.
|
|
|
|
|
|
|
2026-06-30 14:15:30 +02:00
|
|
|
|
## [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.
|
|
|
|
|
|
|
2026-06-30 13:31:31 +02:00
|
|
|
|
## [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`).
|
|
|
|
|
|
|
2026-06-30 09:32:56 +02:00
|
|
|
|
## [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).
|
|
|
|
|
|
|
2026-06-30 08:11:40 +02:00
|
|
|
|
## [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.
|
|
|
|
|
|
|
2026-06-27 07:02:02 +02:00
|
|
|
|
## [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.
|