@page "/aiart" @using OpenAI_API @using OpenAI_API.Chat @using OpenAI_API.Models @using DataAccess.Data @using DataAccess.Models @using KIKunstKirstenKlöckner.Data @inject IConfiguration Config @inject TooltipService TooltipService @inject NotificationService NotificationService @inject DialogService DialogService @* @inject AiArtPageData AiArtData; *@ @inject WunschInfoData WunschInfoData; @inject ImageGenerator ImageGenerator; AiArt

Wunschbilder von KI nur für dich

Nenne uns deinen Wunsch: Temperature: @_temperature Resolution: x Verwende Gibbidy 4 await GenerateImages(true))>Generate @_imagePrompt Die Idee, die gemalt wird: @_imageIdea Verändere hier dein Bild durch Worte: await GenerateImages(false))>Generate
@code { /// /// Wenn wird GPT4 verwendet um die Idee zu interpretieren. /// private bool _useGpt4; private int maxAddons = 2; private int amountOfAddons = 0; // wird später geändert private bool _progressVisible = false; private bool _buttonVisible = true; private bool _addonsVisible = false; private bool _bothVisible = false; public string BusyMessage { get; set; } = "Initial Message"; private string?[] _imageUrls = new string?[4]; private ImageState[] _imageStates = new ImageState[4]; enum ImageState { FadeOut, FadeIn } async Task ShowImageDialog(string imageUrl) { var result = await DialogService.OpenAsync("", ds => @
, new DialogOptions() { CloseDialogOnOverlayClick = true }); } void ShowTooltip(ElementReference elementReference, string text, TooltipOptions? options = null) => TooltipService.Open(elementReference, text, options); void ShowTemperatureTooltip(ElementReference elementReference) => TooltipService.Open(elementReference, ds => @
Gibt an, wie kreativ ChatGPT sein soll.
, new() { Position = TooltipPosition.Bottom, Duration = null}); private string _imageIdea = ""; private string _imagePrompt = ""; private float _temperature = 0.9f; private int? width = 1024; private int? height = 1024; private string request = ""; private string addons = ""; private OpenAIAPI _openAiApi; private Conversation? _conversation; private string _basePrompt; private string _ideaPrompt; private string _imageUrl; //protected override async Task OnInitializedAsync() //{ // _basePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"\wwwroot\prompt.txt"}"); //} async Task UpdateBusyMessage(string newMessage) { BusyMessage = newMessage; await InvokeAsync(StateHasChanged); } private string _openAiApiKey = ""; protected override async Task OnInitializedAsync() { _openAiApiKey = Config.GetValue("API:OpenAI"); _openAiApi = new OpenAIAPI(_openAiApiKey); await base.OnInitializedAsync(); } private void ClearOldGeneration() { // Bilder verbergen for (int i = 0; i < 4; i++) _imageStates[i] = ImageState.FadeOut; _imageIdea = ""; _imagePrompt = ""; } private async Task RequestImageIdeaAsync() { string ideaBasePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/idea_prompt.txt"}"); string requestImagePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"/wwwroot/test_prompt2.txt"}"); ChatRequest chatRequest = new ChatRequest { Temperature = _temperature, Model = _useGpt4 ? Model.GPT4 : Model.ChatGPTTurbo }; _conversation = _openAiApi.Chat.CreateConversation(chatRequest); // Wunsch an GPT senden und Bild Idee anfordern _conversation.AppendUserInput(ideaBasePrompt + " " + request); _imageIdea = await _conversation.GetResponseFromChatbotAsync(); // Bild Promt anfordern _conversation.AppendUserInput(requestImagePrompt); _imagePrompt = await _conversation.GetResponseFromChatbotAsync(); } /// /// Generiert Bilder oder aktualisiert sie mit dem neuen Prompt. /// /// Wenn , werden neue Bilder generiert; sonst wird die vorhandene Idee bearbeitet. private async Task GenerateImages(bool generateNewImage) { // 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(); 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); // } } _imagePrompt = "kkkk " + _imagePrompt + " kkkk Watercolor + ink on paper, Pen drawing, wet-on-wet technique, dry-on-dry technique, dabbing technique. "; await UpdateBusyMessage("Kirstens Assistent hat eine Idee! Er wird sie nun malen..."); WunschInfoModel wunschInfo = new() { BildBeschreibung = _imageIdea, BildPrompt = _imagePrompt, Datum = DateTime.Now, GPTModel = _conversation.Model, Wunsch = request }; try { await WunschInfoData.AddWunschInfoAsync(wunschInfo); } catch (Exception e) { NotificationService.Notify(new NotificationMessage() { Summary = "Es ist ein Fehler aufgetreten, bitte versuche es erneut." }); return; } int generatedImages = 0; try { // Vier Bilder generieren for (int i = 0; i < 4; i++) { _imageUrls[i] = await ImageGenerator.GenerateImageAsync(_imagePrompt, "", width, height, wunschInfo); // Kein Bild -> Fehler if (_imageUrls[i] == null) { bool? retry = await DialogService.Confirm( "Leider konnte das Bild nicht gemalt werden. Möchtest du es noch eimal versuchen?", "Ups, ein Fehler ist aufgetreten...", new ConfirmOptions { OkButtonText = "Ja", CancelButtonText = "Nein" }); if (retry == true) { await ImageGenerator.GenerateImageAsync(_imagePrompt, "", width, height, wunschInfo); } } generatedImages++; _imageStates[i] = ImageState.FadeIn; await InvokeAsync(StateHasChanged); } } catch (Exception e) { NotificationService.Notify(new NotificationMessage() { Summary = "Es ist ein Fehler beim Erzeugen der Bilder aufgetreten, bitte versuche es erneut." }); if (generatedImages == 0) { // TODO: Delete WunschInfo } } _progressVisible = false; _buttonVisible = true; if (amountOfAddons > 0) { _addonsVisible = true; _bothVisible = _buttonVisible && _addonsVisible; await InvokeAsync(StateHasChanged); } else { _addonsVisible = false; _bothVisible = false; } } }