feat(admin): Dropdown „Zentrales KI-Modell" — erprobte Presets ruck-zuck umstellen

Neue Karte in Admin › System › Status: ein Dropdown kuratierter, erprobter
Modelle, das Provider + Modell in einem Klick als Laufzeit-Override umstellt
(wirkt sofort, kein Neustart).

- Presets in config/models.yaml (Label, optional note, set:{key:value} aus
  RUNTIME_SETTABLE, default:true = Config-Standard). Loader app/model_presets.py
  (nur erlaubte LLM-Keys: default_llm_provider, openrouter_llm_model,
  local_llm_model).
- Endpunkte: GET /api/admin/models (Presets + aktuell aktives LLM + active_index),
  POST /api/admin/models/select (Default -> Overrides löschen, sonst Override-Keys
  setzen) — nutzt set_/delete_config_override + invalidate_cache, mit Audit-Log.
- Frontend: Karte zeigt Dropdown + „Aktiv: <provider> · <modell>"; Auswahl wirkt
  sofort und lädt den Status neu. Bump app.js v=52 -> v=53.
- Startliste: Mistral Small 24B (Standard), DeepSeek V4 Flash/Pro, Ollama Gemma 3.

Tests: Laden/Default-aktiv/Select-setzt-Override/Default-löscht/404/Auth.
263 Offline-Tests grün. Live via Headless-Chrome verifiziert (Auswahl ->
Override gesetzt, Provider-Karte spiegelt das Modell).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-26 20:02:44 +02:00
commit 18ad442c94
6 changed files with 243 additions and 2 deletions

31
config/models.yaml Normal file
View file

@ -0,0 +1,31 @@
# Erprobte zentrale KI-Modelle für das Admin-Dropdown (System Status).
# Die Auswahl stellt Provider + Modell als Laufzeit-Override um (kein Neustart).
#
# Felder je Eintrag:
# label Anzeigename im Dropdown (Pflicht)
# note optionaler Hinweis (z. B. Voraussetzungen)
# default true = "Standard aus der Konfiguration"; Auswahl ENTFERNT die Overrides
# set Map von Laufzeit-Schlüsseln -> Wert (nur Keys aus RUNTIME_SETTABLE wirken)
#
# Nur diese LLM-Schlüssel werden ausgewertet:
# default_llm_provider, openrouter_llm_model, local_llm_model
presets:
- label: "Mistral Small 24B — Standard"
default: true
note: "Standard aus der Konfiguration (OpenRouter)"
- label: "DeepSeek V4 Flash (OpenRouter)"
set:
default_llm_provider: "openrouter"
openrouter_llm_model: "deepseek/deepseek-v4-flash"
- label: "DeepSeek V4 Pro (OpenRouter)"
set:
default_llm_provider: "openrouter"
openrouter_llm_model: "deepseek/deepseek-v4-pro"
- label: "Ollama: Gemma 3 (lokal)"
note: "Ollama muss laufen (make llm-ollama)"
set:
default_llm_provider: "local-openai-compatible"
local_llm_model: "gemma3:latest"