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:
co-authored by
Claude Opus 5.5
parent
3f25355a6d
commit
cbac02a96a
@@ -152,6 +152,24 @@ Projekt).
|
||||
(Aktiv / Nicht aktiv / Abgeschlossen), `rate`, `notes` (HTML). Im Menü heißt die
|
||||
Ansicht **Laufende Projekte**.
|
||||
|
||||
`rate` ist ein **Tagessatz** in Euro – das, was ICON dem Kunden berechnet. Beim
|
||||
Berater stehen dagegen **Stundensätze** (`rate_onsite`, `rate_remote` in
|
||||
`icon_contacts`). Die Marge rechnet mit **1 Tag = 8 Stunden**:
|
||||
|
||||
```
|
||||
Marge = rate − Stundensatz des Beraters × 8
|
||||
```
|
||||
|
||||
Die Marge wird **nicht gespeichert**. Sie ist eine Rechnung aus zwei Feldern,
|
||||
die sich beide ändern können – ein gespeicherter Wert wäre nach der ersten
|
||||
Satzänderung falsch, ohne dass es jemand merkt. `GET /api/projects` liefert die
|
||||
beiden Sätze des Beraters deshalb als `contact_rate_onsite` /
|
||||
`contact_rate_remote` mit; gerechnet wird in `src/components/projects/margin.ts`.
|
||||
|
||||
Es gibt am Projekt kein Feld für die Einsatzart. **Vorrang hat der
|
||||
Remote-Satz**; nur wenn er fehlt, wird der Vor-Ort-Satz genommen. Welcher es
|
||||
war, steht in der Oberfläche dabei.
|
||||
|
||||
Im übernommenen Bestand steht im Kopf von `notes` ein Textblock aus dem alten
|
||||
CRM (`KUNDE:`, `KONTAKT:`, `EXPERTE:`, `START:`, `ENDE:`), darunter der
|
||||
übernommene Ausschreibungstext als HTML. `src/lib/richText.ts` macht daraus im
|
||||
|
||||
Reference in New Issue
Block a user