KI-Feature 4.5.20: Medienvorschlag + Zwischenablage-Prompt für externe Erzeugung

Die KI liefert je Verlaufsplan-Phase optional einen kurzen Vorschlag, was ein
Medium/Material (z.B. Tafelbild) zeigen sollte (AiPhaseStep.MaterialSuggestion),
nur wenn das über das ohnehin genannte Material hinaus einen Mehrwert hätte.
Bewusst nicht ins Domänenmodell übernommen (keine Migration nötig) — nur für
die Review-Anzeige relevant.

AiPlanningService.BuildMaterialPrompt baut daraus rein lokal (kein weiterer
KI-Aufruf) einen vollständigen Prompt aus Fach/Stufe/Gruppe, Einheit, Stunde
und Phase. Im AiAssistDialog landet er per Klick in der Zwischenablage, zum
Einfügen in eine separate Claude-Sitzung für die eigentliche Materialerzeugung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 21:22:12 +02:00
co-authored by Claude Sonnet 5
parent da62a08437
commit f703fe7b66
8 changed files with 161 additions and 3 deletions
@@ -25,6 +25,19 @@
<TextBlock Text="{Binding DiffText}" FontSize="11" Opacity="0.6" TextWrapping="Wrap"
Margin="24,0,0,0"
IsVisible="{Binding DiffText, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
<ItemsControl ItemsSource="{Binding MaterialPrompts}" Margin="24,2,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:MaterialPromptItem">
<Border Background="#14000000" CornerRadius="4" Padding="6" Margin="0,2">
<StackPanel Spacing="4">
<TextBlock Text="{Binding SuggestionText}" FontSize="11" TextWrapping="Wrap"/>
<Button Content="📋 Prompt kopieren (extern erzeugen)" FontSize="11"
Click="OnCopyMaterialPrompt"/>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
@@ -1,6 +1,9 @@
using Avalonia.Controls;
using Avalonia.Input.Platform;
using Avalonia.Interactivity;
using LehrerApp.Desktop.Services;
using LehrerApp.Desktop.ViewModels.Groups;
using Microsoft.Extensions.DependencyInjection;
namespace LehrerApp.Desktop.Views.Groups;
@@ -8,6 +11,16 @@ public partial class AiAssistDialog : Window
{
public AiAssistDialog() => InitializeComponent();
private async void OnCopyMaterialPrompt(object? s, RoutedEventArgs e)
{
if (s is not Button { DataContext: MaterialPromptItem item }) return;
var clipboard = TopLevel.GetTopLevel(this)?.Clipboard;
if (clipboard is null) return;
await clipboard.SetTextAsync(item.PromptText);
App.Services.GetRequiredService<NotificationService>().ShowSuccess("Prompt in die Zwischenablage kopiert.");
}
private async void OnSend(object? s, RoutedEventArgs e)
{
if (DataContext is AiAssistDialogViewModel vm && vm.SendCommand.CanExecute(null))