KI-gestützte Planungsunterstützung (4.5.9) + Kompetenzkatalog-Import (8.1.2)
KI-Unterstützung: neuer Einstellungen-Tab (Anmeldung, Guthaben) und Button im Planungs-Tab, der Einheiten+Stunden als JSON an ein neues PHP-Backend (ai-backend/) sendet und die Antwort als prüfbare Vorschlagsliste zurückbringt. Provider-Aufruf, Guthabenverwaltung und Abrechnung nach echten Token-Kosten laufen serverseitig, der Desktop-Client sieht nie einen LLM-API-Key. Zentral abgesichert: eine von der KI zurückgegebene Stunden-Id, die zu keiner echten Lesson der Einheit passt, wird nie als Update übernommen, sondern immer als neue Stunde behandelt. Kompetenzkatalog-Import (8.1.2): JSON-Export/Import für Kompetenzkataloge.
This commit is contained in:
@@ -646,11 +646,46 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
|
||||
`CompetencyDomain`/`CompetencyItem`-Katalog (siehe Kompetenzen-Tab in den Einstellungen),
|
||||
bisher nur für Klausuraufgaben (`ExamTask.CompetencyCodes`) verknüpft, nicht für
|
||||
Verlaufsplan-Phasen.
|
||||
- [ ] **4.5.9** KI-gestützte Planungsunterstützung über eine Schnittstelle zu einer LLM-API, um
|
||||
- [x] **4.5.9** KI-gestützte Planungsunterstützung über eine Schnittstelle zu einer LLM-API, um
|
||||
Einheiten/Stunden mit Hilfe vorzuschlagen und weiterzuentwickeln. Bedarf eines abgesicherten
|
||||
Zwischenelements auf dem eigenen Server (Ablösung/Verbesserung des bisherigen
|
||||
PHP-Zwischenelements für Elternbriefe) mit interner Abrechnung/Nutzungskontrolle, damit der
|
||||
API-Schlüssel nicht im Client landet.
|
||||
|
||||
**Umsetzung:** Neuer Button "🤖 KI-Unterstützung" im Planungs-Tab (nur bei ausgewählter
|
||||
Einheit und aktivierter KI-Unterstützung) öffnet `AiAssistDialog`: Freitext-Anweisung an die
|
||||
KI, Antwort wird als Liste vorgeschlagener Stunden mit Checkbox zur Übernahme angezeigt
|
||||
(nichts wird automatisch übernommen). Export/Import-Schema als eigene DTOs in
|
||||
`LehrerApp.Core/AiPlanning/AiPlanningDtos.cs`, bewusst getrennt von den internen
|
||||
Domänenmodellen — ein Wire-Vertrag mit einem externen System muss unabhängig von internen
|
||||
Refactors abwärtskompatibel bleiben. Zentrale Absicherung in
|
||||
`AiPlanningService.ApplyResponse`: eine von der KI zurückgegebene Lesson-Id, die zu keiner
|
||||
tatsächlich zur Einheit gehörenden Lesson passt, wird NIE als Update interpretiert (sonst
|
||||
könnte eine halluzinierte Id im schlimmsten Fall eine fremde Lesson überschreiben), sondern
|
||||
immer als neue Lesson mit frischer Id behandelt — mit dediziertem Test abgesichert.
|
||||
|
||||
Neue Einstellungen-Tab "KI-Unterstützung": Aktivieren-Schalter, Benutzername/Passwort →
|
||||
Anmelden tauscht das Passwort gegen ein Bearer-Token (nie das Passwort selbst persistiert).
|
||||
Das Token liegt lokal AES-256-verschlüsselt über das bestehende `SyncCrypto` (gleiches
|
||||
Verfahren wie beim Sync-Schlüssel) — besser als die bisherige Klartext-Ablage der
|
||||
Sync-Server-URL, aber mangels Betriebssystem-Schlüsselbund kein vollständiger Schutz gegen
|
||||
jemanden mit Zugriff auf den App-Datenordner; bewusste Abwägung, kein Aufschub aus Unklarheit.
|
||||
|
||||
Neues PHP-Backend in `ai-backend/` (im Repo, aber nicht Teil von `LehrerApp.sln` — ein
|
||||
separat deploytes System, dessen Schema aber mit den DTOs synchron bleiben soll). MySQL-Schema
|
||||
mit `users`/`tokens`/`transactions`, mehrnutzerfähig von Anfang an. Abrechnung nach echten
|
||||
Token-Kosten (Input-/Output-Token × Preistabelle) statt Pauschalpreis, mit `SELECT ... FOR
|
||||
UPDATE` gegen Race Conditions beim Guthabenabzug. Provider-Schnittstelle vorbereitet für
|
||||
mehrere LLM-Anbieter, in dieser Runde aber **nur Anthropic konkret implementiert** — OpenAI
|
||||
bewusst zurückgestellt, da aktuelle Preise/API-Version zum Zeitpunkt der Implementierung
|
||||
nicht verifiziert werden konnten (kein Aufschub aus Unklarheit über den Bedarf, sondern um
|
||||
keine falsch berechneten Kosten zu riskieren). Kein Admin-UI für Guthaben-Aufladung — bei der
|
||||
aktuellen Nutzerzahl reicht ein dokumentierter manueller SQL-Befehl (`ai-backend/README.md`).
|
||||
|
||||
**Nicht ohne echtes Deployment + echten API-Key verifizierbar** (siehe `ai-backend/README.md`):
|
||||
ob Anthropic zuverlässig valides JSON im erwarteten Schema liefert, ob die berechneten
|
||||
Kosten exakt mit der echten Abrechnung übereinstimmen, sowie die komplette Kette
|
||||
Desktop → Backend → Anthropic unter echten Netzwerkbedingungen.
|
||||
- [ ] **4.5.10** Falls doch ein schlanker Companion-/WebApp-Client entstehen soll: bewusst
|
||||
**minimaler** Funktionsumfang — nur Wochenraster ansehen, eine Stunde verschieben, oder eine
|
||||
Stunde als "Umplanung nötig" flaggen. Kein Editor für Einheiten/Kompetenzen/KI-Planung dort.
|
||||
@@ -934,12 +969,18 @@ Format dokumentiert in [Kompetenzkatalog-KI-Prompt.md](docs/Kompetenzkatalog-KI-
|
||||
|
||||
### 8.1 Katalogverwaltung
|
||||
- [ ] **8.1.1** Kompetenzen innerhalb eines Bereichs umsortieren (`SortOrder` bearbeitbar machen).
|
||||
- [ ] **8.1.2** Katalog exportieren (JSON) — Gegenstück zum vorhandenen Import.
|
||||
- [x] **8.1.2** Katalog exportieren (JSON) — Gegenstück zum vorhandenen Import.
|
||||
Bereits über „JSON exportieren“ in den Einstellungen umgesetzt; Fach, Klassenstufe,
|
||||
Bereiche und Kompetenzen werden vollständig ausgegeben.
|
||||
- [ ] **8.1.3** Katalog von einer Jahrgangsstufe in eine andere kopieren.
|
||||
- [ ] **8.1.4** Import-Konflikte behandeln: Merge statt Ersetzen anbieten.
|
||||
- [x] **8.1.4** Import-Konflikte behandeln: Merge statt Ersetzen anbieten.
|
||||
Umgesetzt mit vollständiger Validierung vor dem Schreiben, Importvorschau, sicherem Merge
|
||||
als Vorauswahl, Einzelentscheidung je Konflikt und bestätigungspflichtigem atomarem Ersetzen.
|
||||
|
||||
### 8.2 Verwendung im Unterricht
|
||||
- [ ] **8.2.1** Kompetenzen einer Unterrichtseinheit zuordnen (siehe 4.1.3).
|
||||
- [x] **8.2.1** Kompetenzen einer Unterrichtseinheit zuordnen (siehe 4.1.3).
|
||||
Bereits im Unterrichtseinheiten-Dialog über die Kompetenz-Auswahl umgesetzt und in
|
||||
`Unit.Competencies` gespeichert.
|
||||
- [x] **8.2.2** Kompetenzen einzelnen Klausuraufgaben zuordnen — umgesetzt mit 1.2.4.
|
||||
- [ ] **8.2.3** Abdeckungsübersicht: welche Kompetenzen wurden im Schuljahr behandelt/geprüft?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user