KI-Feature 4.5.22: KI-Unterstützung direkt aus dem Stunden-Editor starten

Bisher musste man aus dem Stunden-Editor raus, die KI-Hilfe für die ganze
Einheit aufrufen und die gewünschte Stunde in der freien Anweisung erst
benennen. Neuer Button "KI-Unterstützung für diese Stunde" im LessonDialog
öffnet denselben AiAssistDialog im neuen Fokus-Modus.

AiPlanningRequest.FocusLessonId weist die KI im Systemprompt an, sich auf
genau diese Stunde zu beschränken; zusätzlich wie beim Umfangs-Umschalter
client-seitig hart durchgesetzt in Send() und ApplyResponse, statt der
KI-Antwort blind zu vertrauen.

Da "Übernehmen" direkt ins Repository speichert, wären die noch offenen
Feldwerte des ursprünglichen LessonDialog danach veraltet gewesen - der
Dialog schließt sich deshalb nach einer angewendeten KI-Änderung automatisch
mit dem frischen Stand statt ihn mit alten Werten zu überschreiben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 22:48:00 +02:00
co-authored by Claude Sonnet 5
parent 364df378f0
commit 10d82e5e2c
9 changed files with 147 additions and 10 deletions
@@ -317,6 +317,36 @@ public sealed class AiPlanningServiceTests
Assert.Equal("Neue Stunde bleibt erlaubt", lesson.Topic);
}
/// Fokus-Modus (4.5.22, KI-Unterstützung aus dem Stunden-Editor heraus): auch wenn die KI die
/// Anweisung ignoriert und weitere/andere Stunden zurückgibt, darf clientseitig nur die
/// angefragte Fokus-Stunde übernommen werden.
[Fact]
public void ApplyResponse_FocusLessonId_VerwirftAlleAnderenLessons()
{
var group = new LearningGroup();
var unit = new Unit { GroupId = group.Id, Title = "T" };
var focus = new Lesson { UnitId = unit.Id, GroupId = group.Id, Topic = "Fokus-Stunde" };
var other = new Lesson { UnitId = unit.Id, GroupId = group.Id, Topic = "Andere Stunde" };
var lessons = new FakeLessons();
lessons.Add(focus);
lessons.Add(other);
var service = Build(lessons, new FakeGroups([group]), new FakeSubjects([]),
new FakeCompetencyDomains(), new FakeAlternativeLessonPaths([]));
var accepted = new List<AiLesson>
{
new() { Id = focus.Id, Topic = "Fokus-Stunde, geändert" },
new() { Id = other.Id, Topic = "Sollte verworfen werden" },
new() { Id = null, Topic = "Neue Stunde sollte verworfen werden" },
};
var result = service.ApplyResponse(unit, accepted, focusLessonId: focus.Id);
var lesson = Assert.Single(result);
Assert.Equal(focus.Id, lesson.Id);
Assert.Equal("Fokus-Stunde, geändert", lesson.Topic);
}
[Fact]
public void ApplyResponse_NullId_WirdAlsNeueLessonBehandelt()
{