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:
@@ -0,0 +1,86 @@
|
||||
namespace LehrerApp.Core.AiPlanning;
|
||||
|
||||
/// <summary>
|
||||
/// Wire-Vertrag mit dem externen KI-Backend (siehe ai-backend/, TODO 4.5.9). Bewusst getrennt von
|
||||
/// den internen Domänenmodellen in Core/Models: dieser Vertrag muss unabhängig von internen
|
||||
/// Domänen-Refactors abwärtskompatibel zum deployten PHP-Backend bleiben.
|
||||
/// </summary>
|
||||
public class AiPlanningRequest
|
||||
{
|
||||
public string Instruction { get; set; } = "";
|
||||
public AiUnitContext Unit { get; set; } = new();
|
||||
}
|
||||
|
||||
public class AiUnitContext
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Title { get; set; } = "";
|
||||
public DateOnly? StartDate { get; set; }
|
||||
public DateOnly? EndDate { get; set; }
|
||||
public List<string> Competencies { get; set; } = [];
|
||||
public string? Notes { get; set; }
|
||||
|
||||
// Nur Kontext für die KI, wird nicht zurückerwartet.
|
||||
public string SubjectName { get; set; } = "";
|
||||
public int GradeLevel { get; set; }
|
||||
public string GroupName { get; set; } = "";
|
||||
public List<AiCompetencyDomain> CompetencyCatalog { get; set; } = [];
|
||||
public List<AiAlternativePath> AlternativePathCatalog { get; set; } = [];
|
||||
|
||||
public List<AiLesson> Lessons { get; set; } = [];
|
||||
}
|
||||
|
||||
public class AiCompetencyDomain
|
||||
{
|
||||
public string Name { get; set; } = "";
|
||||
public List<AiCompetencyItem> Items { get; set; } = [];
|
||||
}
|
||||
|
||||
public class AiCompetencyItem
|
||||
{
|
||||
public string Code { get; set; } = "";
|
||||
public string Description { get; set; } = "";
|
||||
}
|
||||
|
||||
public class AiAlternativePath
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; } = "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="Id"/> ist der einzige Unterscheidungsmechanismus neu/geändert: gesetzt und einer
|
||||
/// tatsächlich im Request gesendeten Lesson zugehörig = Änderung; null oder eine unbekannte Id =
|
||||
/// neue Lesson. Eine unbekannte Id wird beim Import NIE als Update einer bestehenden Lesson
|
||||
/// interpretiert (siehe AiPlanningService.ApplyResponse) — sonst könnte eine halluzinierte Id im
|
||||
/// schlimmsten Fall eine fremde Lesson überschreiben.
|
||||
/// </summary>
|
||||
public class AiLesson
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public DateOnly? Date { get; set; }
|
||||
public int? LessonNumber { get; set; }
|
||||
public string Topic { get; set; } = "";
|
||||
public TimeOnly? StartTime { get; set; }
|
||||
public List<AiPhaseStep> Phases { get; set; } = [];
|
||||
public string? Homework { get; set; }
|
||||
public string? Reflection { get; set; }
|
||||
}
|
||||
|
||||
public class AiPhaseStep
|
||||
{
|
||||
public string Name { get; set; } = "";
|
||||
public int DurationMinutes { get; set; }
|
||||
public string Activity { get; set; } = "";
|
||||
public string Material { get; set; } = "";
|
||||
public string Shorthand { get; set; } = "";
|
||||
// Name statt Guid: LLMs erfinden/verändern Guids unzuverlässig, ein Name ist beim Import
|
||||
// gegen den Katalog abgleichbar (kein Treffer -> null = Hauptweg, kein Fehler).
|
||||
public string? AlternativePathName { get; set; }
|
||||
}
|
||||
|
||||
public class AiPlanningResponse
|
||||
{
|
||||
public List<AiLesson> Lessons { get; set; } = [];
|
||||
public string? Summary { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user