diff --git a/KIKunstKirstenKlöckner/Pages/AiArt.razor b/KIKunstKirstenKlöckner/Pages/AiArt.razor index 688b363..245477b 100644 --- a/KIKunstKirstenKlöckner/Pages/AiArt.razor +++ b/KIKunstKirstenKlöckner/Pages/AiArt.razor @@ -45,7 +45,7 @@ - Generate + await DoStuff(true))>Generate @@ -68,12 +68,20 @@ + Verändere hier dein Bild durch Worte: + + await DoStuff(false))>Generate + @code { - + private int maxAddons = 2; + private int amountOfAddons = 0; // wird später geändert + private string _imageDescriptionPrompt = "Zusätzlich zu dem Promt erkläre kurz auf deutsch, warum du dich für diese Umsetzung des Titels entschieden hast und gib zusätzlich eine Interpretation des Bildes an. Beginne diesen Teil immer mit \"Beschreibung: \". Zuletzt Beschreibe das Bild und die verbundenen Emotionen mit drei Worten und beginne den Teil mit \"Keywords: \"."; private bool _progressVisible = false; private bool _buttonVisible = true; + private bool _addonsVisible = false; + private bool _bothVisible = false; public string BusyMessage { get; set; } = "Initial Message"; @@ -116,7 +124,8 @@ Ich glaube, eigentlich bedeutet es eher, wie deterministisch die Ausgabe ist.
Bei 0.0 kommt immer fast die selbe Antwort. Bei zu hohen Werten kommt nur noch Schwachsinn.
OpenAI empfielt einen Wert von ca. 0.9 für kreative Anwendungen. - , + + , new() { Position = TooltipPosition.Bottom, Duration = null}); private string _imagePrompt = "\"Painting of a soccer match with the Hamburger SV team scoring multiple goals, vibrant colors and dynamic brushstrokes.\" Watercolor + ink on paper, Pen drawing, wet-on-wet technique, dry-on-dry technique, dabbing technique."; @@ -124,6 +133,9 @@ private float temperature = 0.9f; private string request = ""; + private string addons = ""; + private OpenAIAPI api = new OpenAIAPI("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"); + private Conversation converse; private string _basePrompt; @@ -153,7 +165,7 @@ await Task.Delay(1000, cancellationToken); await UpdateBusyMessage("Na, also langsam verlier ich hier die Geduld, ich dachte KI soll alles schneller machen..."); - + while (!cancellationToken.IsCancellationRequested) { await Task.Delay(1000, cancellationToken); @@ -246,41 +258,49 @@ } } - private async Task DoStuff() + + private async Task DoStuff(bool newPic) { // 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; - await UpdateBusyMessage("Kirstens Assistent zerbricht sich über deine Idee den Kopf..."); - - _basePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/prompt.txt"}"); - - OpenAIAPI api = new OpenAIAPI("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"); - - ChatRequest chatRequest = new ChatRequest + if (converse == null || newPic) { - Temperature = temperature, - Model = Model.ChatGPTTurbo, - }; + amountOfAddons = maxAddons; + _addonsVisible = false; + _bothVisible = _buttonVisible && _addonsVisible; + await UpdateBusyMessage("Kirstens Assistent zerbricht sich über deine Idee den Kopf..."); + _basePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/test_prompt.txt"}"); - Conversation converse = api.Chat.CreateConversation(chatRequest); + ChatRequest chatRequest = new ChatRequest + { + Temperature = temperature, + Model = Model.ChatGPTTurbo, + }; - converse.AppendUserInput(_basePrompt + " " + request); - - string response = await converse.GetResponseFromChatbotAsync(); - - // Der Propt sollte dafür sorgen, dass ChatGPT einen Absatz zwischen Bild-Promt und der Erklärung macht. - int lineBreak = response.IndexOf('\n'); - - if (lineBreak == -1) + converse = api.Chat.CreateConversation(chatRequest); + converse.AppendUserInput(_basePrompt + " " + request); + } + else { - // TODO: Error + 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."; + + converse.AppendUserInput(addonsPrompt1 + addons + addonsPrompt2); + } } - _imagePrompt = response.Substring(0, lineBreak); - _imageDescription = response.Substring(lineBreak); + _imagePrompt = await converse.GetResponseFromChatbotAsync(); + _imagePrompt += " Watercolor + ink on paper, Pen drawing, wet-on-wet technique, dry-on-dry technique, dabbing technique."; + converse.AppendUserInput(_imageDescriptionPrompt); + _imageDescription = await converse.GetResponseFromChatbotAsync(); await UpdateBusyMessage("Kirstens Assistent hat eine Idee! Er wird sie nun malen..."); @@ -299,6 +319,17 @@ _progressVisible = false; _buttonVisible = true; - await InvokeAsync(StateHasChanged); + if (amountOfAddons > 0) + { + _addonsVisible = true; + _bothVisible = _buttonVisible && _addonsVisible; + await InvokeAsync(StateHasChanged); + } + else + { + _addonsVisible = false; + _bothVisible = false; + } } + } diff --git a/KIKunstKirstenKlöckner/wwwroot/prompt.txt b/KIKunstKirstenKlöckner/wwwroot/prompt.txt index 04d688f..086b6b8 100644 --- a/KIKunstKirstenKlöckner/wwwroot/prompt.txt +++ b/KIKunstKirstenKlöckner/wwwroot/prompt.txt @@ -116,8 +116,6 @@ Hier findest du Beispiele, wie der Promt aussehen soll: “Painting of a female botanist surrounded by exotic plants in a greenhouse.” “Painting of an ancient castle at night, with a full moon, gargoyles, and shadows.” -Bitte nutze für den Prompt maximal 20 Wörter. -Füge hinten an den Promt immer " Watercolor + ink on paper, Pen drawing, wet-on-wet technique, dry-on-dry technique, dabbing technique" an. -Zusätzlich zu dem Promt erkläre kurz auf deutsch danach, warum du dich für diese Umsetzung des Titels entschieden hast. +Bitte nutze für den Prompt maximal 20 Wörter und achte darauf, dass der Prompt auf englisch ist. Den Titel für den zu erstellenden Promt ist: \ No newline at end of file diff --git a/KIKunstKirstenKlöckner/wwwroot/test_prompt.txt b/KIKunstKirstenKlöckner/wwwroot/test_prompt.txt new file mode 100644 index 0000000..07912e9 --- /dev/null +++ b/KIKunstKirstenKlöckner/wwwroot/test_prompt.txt @@ -0,0 +1,29 @@ +Kunststil und Techniken: Kirsten Klöckner bevorzugt Aquarell- und Tusche-Materialien auf Papier. Diese Medien ermöglichen ihr, eine Mischung aus transparenten und deckenden Effekten zu erzielen, was ihrer Kunst eine besondere Leichtigkeit und Tiefe verleiht. Sie beherrscht verschiedene Techniken, darunter Federzeichnung, Pinselzeichnung, Nass-in-Nass-Technik, Trocken-auf-Trocken-Technik und Lasur. Diese Vielfalt an Techniken ermöglicht es ihr, unterschiedliche Texturen und Muster zu erzeugen und ihre Kunstwerke mit einer breiten Palette an visuellen Elementen zu gestalten. + +Themen und Motive: Die Themen und Motive in Klöckners Kunst sind vielfältig und reichen von persönlichen bis hin zu gesellschaftlichen Anliegen. Sie scheint eine enge Verbindung zur Natur zu haben, da Motive wie Schafe, Pferde und Blumen in ihren Bildern häufig auftauchen. Darüber hinaus spiegeln ihre Werke gesellschaftliche und politische Anliegen wider, wie beispielsweise der Wunsch nach Gastfreundschaft, Verantwortung und Klimaschutz. Die Vielfalt der Themen zeigt, dass Klöckner eine Künstlerin ist, die sich für viele verschiedene Aspekte des Lebens interessiert und diese in ihrer Kunst zum Ausdruck bringt. + +Emotionen und Interpretation: Klöckners Kunstwerke scheinen starke Emotionen bei den Betrachtern auszulösen. Die Assoziationen anderer Menschen reichen von Freude und Dankbarkeit bis hin zu kritischen Reflexionen über gesellschaftliche Themen. Dies zeigt, dass ihre Kunst eine breite Palette von Gefühlen und Gedanken anspricht und eine Verbindung zu den Betrachtern herstellt. Klöckners Fähigkeit, Emotionen in ihren Kunstwerken zu vermitteln, macht sie zu einer einfühlsamen und ausdrucksstarken Künstlerin. + +Narrative Elemente: In ihren Bildern integriert Klöckner oft narrative Elemente, die eine Geschichte erzählen oder eine tiefere Bedeutung hervorheben. Zum Beispiel verwendet sie Schleifen, Tische und Haken, um Botschaften über Gastfreundschaft, Festlichkeit oder Verantwortung zu vermitteln. Solche Elemente geben ihren Kunstwerken eine zusätzliche Ebene der Komplexität und ermöglichen den Betrachtern, die Bilder eingehender zu erkunden. + +Künstlerische Ambition: Es ist klar erkennbar, dass Kirsten Klöckner eine Künstlerin mit vielseitigen Interessen und einem engagierten Blick auf die Welt ist. Ihre Kunstwerke spiegeln nicht nur ihre künstlerischen Fähigkeiten wider, sondern auch ihre persönlichen Überzeugungen und Gedanken zu verschiedenen Themen. Ihr Werk fordert die Betrachter zum Nachdenken auf und regt Diskussionen über verschiedene Aspekte des Lebens an. + +Dies die Vorgehensweise bei der Entwicklung eines Bildes von Kirsten Klöckner. +Sie hat einen Titel bekommen und dazu ein Bild gemalt. Bitte generiere einen Englischen Prompt für eine Bild KI basierend auf dieser Liste. + +Hier findest du Beispiele, wie der Promt aussehen soll: + +"Portrait of an astronaut in space, detailed starry background, reflective helmet." +“Painting of a floating island with giant clock gears, populated with mythical creatures.” +“Landscape 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.” +“Painting of a modern smartphone with classic art pieces appearing on the screen.” +“Battle scene with futuristic robots and a golden palace in the background.” +“Painting of a bustling city market with different perspectives of people and stalls.” +“Painting of a ship sailing in a stormy sea, with dramatic lighting and powerful waves.” +“Painting of a female botanist surrounded by exotic plants in a greenhouse.” +“Painting of an ancient castle at night, with a full moon, gargoyles, and shadows.” + +Bitte nutze für den Prompt maximal 20 Wörter und achte darauf, dass der Prompt auf englisch ist. + +Den Titel für den zu erstellenden Promt ist: \ No newline at end of file