KI: Modellauswahl als Dropdown + Abgleich mit Produktionsstand

Einstellungen -> KI: statt freiem Modellnamen ein Dropdown mit den
Chat-Modellen, die der hinterlegte OpenAI-Schluessel nutzen darf.

- Backend: listAiModels() fragt OpenAI GET /v1/models, filtert auf
  Chat-Modelle (gpt-*, o*, chatgpt-*; ohne Embedding/Audio/Bild/Instruct
  usw.), neueste zuerst, 10 min im Speicher (Schluesselwechsel laedt neu)
- Neuer Endpunkt GET /api/ai/models (admin)
- Frontend: aktives Modell bleibt waehlbar, auch wenn nicht mehr gelistet;
  Rueckfall auf Textfeld, wenn die Liste nicht abrufbar ist
- Doku: 05-ki (Modellauswahl mit Ablaufdiagramm), 10-api, 08-anleitung

Zieht ausserdem den bereits live laufenden, bisher nicht eingecheckten
Stand nach (perinco-Kontaktabgleich/MergeDialog, Projektmargen,
Whisper-Anpassungen u. a.). Repo entspricht damit icrm.icon-experts.de.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-23 10:26:30 +02:00
co-authored by Claude Opus 5.5
parent 3f25355a6d
commit cbac02a96a
40 changed files with 1476 additions and 80 deletions
+7 -1
View File
@@ -38,7 +38,7 @@ flowchart TD
V --> KON["contacts/<br/>Liste, Kacheln, Netzwerk, CV-Import"]
V --> UNT["companies/<br/>Liste, Kacheln, Group, Netzwerk"]
V --> AUS["tenders/<br/>Tabelle, Live!, Archiv"]
V --> PRJ["projects/"]
V --> PRJ["projects/<br/>Kacheln, Karte, Marge"]
V --> HIS["history/"]
V --> SET["settings/<br/>Nutzer, Stammdaten, Konto, Diktat"]
KON --> NW["network/Network.tsx<br/>d3-force + SVG"]
@@ -46,6 +46,12 @@ flowchart TD
NW --> CT["network/CompanyTree.tsx"]
```
`projects/margin.ts` rechnet die Marge: Tagessatz des Projekts minus
Stundensatz des Beraters mal acht. Die Rechnung liegt neben der Ansicht und
nicht im Backend, weil sie in der Projektkarte **live** mitlaufen muss – dort
lassen sich Tagessatz und Berater ändern, bevor gespeichert wird. Siehe
`docs/02-datenmodell.md`, Abschnitt `icon_projects`.
Zwei Dinge liegen bewusst in `App.tsx`:
* Die Listen der Unternehmen und Benutzer werden **einmal** geladen und