diff --git a/KIKunstKirstenKlöckner/Pages/AiArt.razor b/KIKunstKirstenKlöckner/Pages/AiArt.razor index 19a4d42..50f46a8 100644 --- a/KIKunstKirstenKlöckner/Pages/AiArt.razor +++ b/KIKunstKirstenKlöckner/Pages/AiArt.razor @@ -6,6 +6,7 @@ @using DataAccess.Data @using DataAccess.Models @using KIKunstKirstenKlöckner.Data +@using System.Diagnostics @inject IConfiguration Config @inject TooltipService TooltipService @@ -23,8 +24,9 @@

Wunschbilder von KI nur für dich

Nenne uns deinen Wunsch: - - + + + @* Zusätzliche Optionen *@ @@ -56,7 +58,7 @@ - await GenerateImagesAsync(true))>Generate + await GenerateImagesAsync())>Generate Die Idee, die gemalt wird: @@ -70,8 +72,8 @@ Verändere hier dein Bild durch Worte: - - await GenerateImagesAsync(false))>Generate + + await UpdateImagesAsync())>Generate @@ -153,8 +155,8 @@ private float _temperature = 0.9f; private int? width = 1024; private int? height = 1024; - private string request = ""; - private string addons = ""; + private string _userIdea = ""; + private string _updateRequest = ""; private OpenAIAPI _openAiApi; private Conversation? _conversation; @@ -163,6 +165,8 @@ private string _imageUrl; + private WunschInfoModel? _wunschInfo; + //protected override async Task OnInitializedAsync() //{ // _basePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"\wwwroot\prompt.txt"}"); @@ -217,17 +221,15 @@ _conversation = _openAiApi.Chat.CreateConversation(chatRequest); // Wunsch an GPT senden und Bild Idee anfordern - _conversation.AppendUserInput(ideaBasePrompt + " " + request); + _conversation.AppendUserInput(ideaBasePrompt + " " + _userIdea); _imageIdea = await _conversation.GetResponseFromChatbotAsync(); } /// /// Fordert für mehrere Bilder Bild-Prompts an und generiert die dazugehörigen Bilder. /// - private async Task RequestImagesAsync(WunschInfoModel wunschInfo) + private async Task RequestImagesAsync(WunschInfoModel wunschInfo, string requestImagePrompt) { - string requestImagePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/image_prompt.txt"}"); - // Nachricht mit Bildpromt anfrage senden _conversation!.AppendUserInput(requestImagePrompt); @@ -236,7 +238,7 @@ for (int i = 0; i < 4; i++) { - imagePromts[i] = RequestPromptAndGenerateImageAsync(i, wunschInfo); + imagePromts[i] = RequestImagePromptAndGenerateImageAsync(i, wunschInfo); } await Task.WhenAll(imagePromts); @@ -247,7 +249,7 @@ /// /// Der Index des Bildes (für UI zeug) /// Der Wunsch für den ein Bild erzeugt wird. - private async Task RequestPromptAndGenerateImageAsync(int index, WunschInfoModel wunschInfo) + private async Task RequestImagePromptAndGenerateImageAsync(int index, WunschInfoModel wunschInfo) { // Bild Prompt von ChatGPT anfordern string imagePrompt = await _conversation!.GetResponseFromChatbotAsync(); @@ -310,56 +312,35 @@ /// /// Generiert Bilder oder aktualisiert sie mit dem neuen Prompt. /// - /// Wenn , werden neue Bilder generiert; sonst wird die vorhandene Idee bearbeitet. - private async Task GenerateImagesAsync(bool generateNewImage) + private async Task GenerateImagesAsync() { - // Der Dialog blokiert so lange, wie der er offen ist, deshalb dürfen wir hier nicht warten, da wir sonst nie mit der Arbeit anfangen... - //Task busyDialog = ShowBusyDialog(); _progressVisible = true; _buttonVisible = false; - if (_conversation == null || generateNewImage) - { - ClearOldGeneration(); + ClearOldGeneration(); - amountOfAddons = maxAddons; - _addonsVisible = false; - _bothVisible = _buttonVisible && _addonsVisible; - await UpdateBusyMessage("Kirstens Assistent zerbricht sich über deine Idee den Kopf..."); + amountOfAddons = maxAddons; + _addonsVisible = false; + _bothVisible = _buttonVisible && _addonsVisible; + await UpdateBusyMessage("Kirstens Assistent zerbricht sich über deine Idee den Kopf..."); - await RequestImageIdeaAsync(); - } - else - { - throw new NotImplementedException("Verändern von Idees ist nicht implementiert"); - // if (amountOfAddons > 0) - // { - // amountOfAddons--; - // _bothVisible = _buttonVisible && _addonsVisible; - // await UpdateBusyMessage("Kirstens Assistent passt das Bild an deine Wünsche an..."); - // string addonsPrompt1 = "Erstelle einen neuen Prompt auf englisch mit den gleichen Restriktionen auf Basis des Alten mit folgender Anpassung: "; - // string addonsPrompt2 = ". Denke daran nur den Prompt zu generieren und noch keine Beschreibung oder ähnliches."; - - // _conversation.AppendUserInput(addonsPrompt1 + addons + addonsPrompt2); - // } - } + await RequestImageIdeaAsync(); await UpdateBusyMessage("Kirstens Assistent hat eine Idee! Er wird sie nun malen..."); - WunschInfoModel wunschInfo = new() + _wunschInfo = new() { BildBeschreibung = _imageIdea, BildPrompt = "Individuelle Bild Prompts", Datum = DateTime.Now, - GPTModel = _conversation.Model, - Wunsch = request, - // TODO: Wenn wir Wünsche überarbeiten können wir hier diesen hier referenzieren + GPTModel = _conversation!.Model, + Wunsch = _userIdea, VorherigerWunsch = null }; - + try { - await WunschInfoData.AddWunschInfoAsync(wunschInfo); + await WunschInfoData.AddWunschInfoAsync(_wunschInfo); } catch (Exception e) { @@ -371,7 +352,9 @@ return; } - await RequestImagesAsync(wunschInfo); + string requestImagePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/image_prompt.txt"}"); + + await RequestImagesAsync(_wunschInfo, requestImagePrompt); _progressVisible = false; _buttonVisible = true; @@ -387,4 +370,37 @@ _bothVisible = false; } } + + private async Task UpdateImagesAsync() + { + Debug.Assert(_conversation != null); + + string updatePrompt = $"Gebe nun einen neuen Prompt unter berücksichtigung vorheriger Anweisungen und passe ihn folgender Maßen an: {_updateRequest}"; + + _wunschInfo = new() + { + BildBeschreibung = _updateRequest, + BildPrompt = "Individuelle Bild Prompts", + Datum = DateTime.Now, + GPTModel = _conversation.Model, + Wunsch = _userIdea, + VorherigerWunsch = _wunschInfo!.Id + }; + + try + { + await WunschInfoData.AddWunschInfoAsync(_wunschInfo); + } + catch (Exception e) + { + NotificationService.Notify(new NotificationMessage() + { + Summary = "Es ist ein Fehler aufgetreten, bitte versuche es erneut." + }); + + return; + } + + await RequestImagesAsync(_wunschInfo, updatePrompt); + } } diff --git a/KIKunstKirstenKlöckner/wwwroot/image_prompt.txt b/KIKunstKirstenKlöckner/wwwroot/image_prompt.txt index ce06002..a576f42 100644 --- a/KIKunstKirstenKlöckner/wwwroot/image_prompt.txt +++ b/KIKunstKirstenKlöckner/wwwroot/image_prompt.txt @@ -1,4 +1,4 @@ -Bitte einen englischen Prompt für dieses Bild für eine Bild-Generierungs KI. +Bitte erstelle einen englischen Prompt für dieses Bild für eine Bild-Generierungs KI. Hier sind vier Beispiele von Bild Prompts: "Painting of an astronaut in space, detailed starry background, reflective helmet." @@ -6,4 +6,7 @@ Hier sind vier Beispiele von Bild Prompts: "Painting of a Japanese garden in autumn, with a bridge over a koi pond." "Painting representing the sound of jazz music, using pale colors and erratic shapes." -Wie du siehst enthält ein Prompt eine genaue Beschreibung des Bildes. Ein guter Prompt selbst enthält keine Metaphern oder Vergleiche. +Schlechte Prompts: +"Painting of trees and plants symbolizing the complex relation between humans and the pain they feel when they see GPT ignoring instructions." + +Wie du siehst enthält ein Prompt eine genaue Beschreibung des Bildes. Ein guter Prompt selbst enthält keine Metaphern oder Vergleiche. Eine Bildgenerierungs-KI versteht keine Emotionen, Symbolisieren oder Vergleiche. Nur Bildbeschreibungen, Farben, Formen, Objekte. Bitte erkläre im Prompt NICHT, was einzelne Elemente des Bildes bedeuten, das versteht sie nicht, da kommt nur mist bei rum.