@page "/" @page "/aiart" @using OpenAI_API @using OpenAI_API.Chat @using OpenAI_API.Models @using System.Diagnostics @inject IConfiguration Config @inject TooltipService TooltipService @inject DialogService DialogService AiArt

Wunschbilder von KI nur für dich

Nenne uns deinen Wunsch: Temperature: @temperature await DoStuff(true))>Generate @_imagePromptEnglish Die Idee, die gemalt wird: @_imageDescription 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"; private string?[] _imageUrls = new string?[4]; private ImageState[] _imageStates = new ImageState[4]; enum ImageState { //Hide = 0, FadeOut, FadeIn, //Show, } // Busy dialog from markup async Task ShowBusyDialog() { await DialogService.OpenAsync("", ds => @ , new DialogOptions() { ShowTitle = false, Style = "min-height:auto;min-width:auto;width:auto", CloseDialogOnEsc = false }); } async Task ShowImageDialog(string imageUrl) { var result = await DialogService.OpenAsync("", ds => @
, new DialogOptions() { CloseDialogOnOverlayClick = true }); } // Busy dialog from string async Task BusyDialog(string message) { await DialogService.OpenAsync("", ds => { RenderFragment content = b => { b.OpenElement(0, "RadzenRow"); b.OpenElement(1, "RadzenColumn"); b.AddAttribute(2, "Size", "12"); b.AddContent(3, message); b.CloseElement(); b.CloseElement(); }; return content; }, new DialogOptions() { ShowTitle = false, Style = "min-height:auto;min-width:auto;width:auto", CloseDialogOnEsc = false }); } 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.
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 _imagePromptEnglish = ""; private string _imageDescription = ""; private string _imagePrompt = ""; private float temperature = 0.9f; private string request = ""; private string addons = ""; private OpenAIAPI _openAiApi; private Conversation converse; private string _basePrompt; private string _imageUrl; //protected override async Task OnInitializedAsync() //{ // _basePrompt = await File.ReadAllTextAsync($"{Directory.GetCurrentDirectory()}{@"\wwwroot\prompt.txt"}"); //} private async Task FunnyMessageSwitcher_ImageGen(CancellationToken cancellationToken) { Stopwatch sw = Stopwatch.StartNew(); await Task.Delay(1000, cancellationToken); await UpdateBusyMessage("Dauert noch eine Weile..."); await Task.Delay(1000, cancellationToken); await UpdateBusyMessage("Gut Ding hat Weil..."); await Task.Delay(1000, cancellationToken); await UpdateBusyMessage("Sach ma, was issn da l... achso, er ist auf Klo gegangen... Er ist bestimmt gleich wieder da..."); 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); await UpdateBusyMessage($"Keine Sorge, er arbeitet noch. Die Bilder werden gemalt... ({sw.Elapsed.Seconds}s)"); } } async Task UpdateBusyMessage(string newMessage) { BusyMessage = newMessage; await InvokeAsync(StateHasChanged); } private readonly HttpClient _client = new(); private string _inferenceApiKey = ""; private string _openAiApiKey = ""; protected override Task OnInitializedAsync() { _inferenceApiKey = Config.GetValue("API:HF_Inference"); _openAiApiKey = Config.GetValue("API:OpenAI"); _openAiApi = new OpenAIAPI(_openAiApiKey); var inferenceModelUrl = "https://api-inference.huggingface.co/models/Nacken/ki-kunst-kirsten-kloeckner-colab"; //_client.BaseAddress = new Uri(inferenceModelUrl); _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {_inferenceApiKey}"); return base.OnInitializedAsync(); } /// /// Geneiert das Bild für den aktuellen /// public async Task GenerateImageAsync() { var postData = new { inputs = _imagePrompt }; JsonContent content = JsonContent.Create(postData); async Task FailedToDrawImage() { 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 GenerateImageAsync(); } try { var inferenceModelUrl = "https://api-inference.huggingface.co/models/Nacken/ki-kunst-kirsten-kloeckner-colab"; var response = await _client.PostAsync(inferenceModelUrl, content); if (response?.IsSuccessStatusCode == true) { await using Stream imageStream = await response.Content.ReadAsStreamAsync(); using Image image = await Image.LoadAsync(imageStream); string imgUrl = $"generated_images/{DateTime.Now:dd_MM_yyyy_hh_mm_s}.jpg"; string mapPath = $"./wwwroot/{imgUrl}"; await image.SaveAsJpegAsync(mapPath); _imageUrl = imgUrl; } else { Console.WriteLine($"Image conversion failed: {response}"); if (Debugger.IsAttached) Debugger.Break(); await FailedToDrawImage(); } } catch (Exception exception) { Console.WriteLine($"Image request failed: {exception}"); if (Debugger.IsAttached) Debugger.Break(); await FailedToDrawImage(); } } /// /// Geneiert das Bild für den aktuellen /// public async Task GenerateImageAsync(string prompt, bool isRetry = false) { var postData = new { inputs = prompt, options = new { // Cache deaktivieren, damit Huggingface für den selben Prompt unterschiedliche Ergebnisse liefert use_cache = false, // Erst wenn wir bereits in einem retry sind warten wir implizit auf das Model. (ignoriert quasi 503-Fehler) wait_for_model = true } }; JsonContent content = JsonContent.Create(postData); async Task FailedToDrawImage() { 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) { return await GenerateImageAsync(prompt, true); } return null; } try { var inferenceModelUrl = "https://api-inference.huggingface.co/models/Nacken/ki-kunst-kirsten-kloeckner-colab"; var response = await _client.PostAsync(inferenceModelUrl, content); if (response?.IsSuccessStatusCode == true) { await using Stream imageStream = await response.Content.ReadAsStreamAsync(); using Image image = await Image.LoadAsync(imageStream); string imgUrl = $"generated_images/{DateTime.Now:dd_MM_yyyy_hh_mm_s_fffffff}.jpg"; string mapPath = $"./wwwroot/{imgUrl}"; await image.SaveAsJpegAsync(mapPath); return imgUrl; } else { Console.WriteLine($"Image conversion failed: {response}"); if (Debugger.IsAttached) Debugger.Break(); return await FailedToDrawImage(); } } catch (Exception exception) { Console.WriteLine($"Image request failed: {exception}"); if (Debugger.IsAttached) Debugger.Break(); return await FailedToDrawImage(); } return null; } private async Task DoStuff(bool newPic) { for (int i = 0; i < 4; i++) _imageStates[i] = ImageState.FadeOut; // 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 (converse == null || newPic) { 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"}"); ChatRequest chatRequest = new ChatRequest { Temperature = temperature, Model = Model.ChatGPTTurbo, }; converse = _openAiApi.Chat.CreateConversation(chatRequest); converse.AppendUserInput(_basePrompt + " " + request); } else { 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); } } _imagePromptEnglish = await converse.GetResponseFromChatbotAsync(); _imagePrompt = _imagePromptEnglish; _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..."); // Vier Bilder generieren for (int i = 0; i < 4; i++) { _imageUrls[i] = await GenerateImageAsync(_imagePrompt); _imageStates[i] = ImageState.FadeIn; await InvokeAsync(StateHasChanged); } _progressVisible = false; _buttonVisible = true; if (amountOfAddons > 0) { _addonsVisible = true; _bothVisible = _buttonVisible && _addonsVisible; await InvokeAsync(StateHasChanged); } else { _addonsVisible = false; _bothVisible = false; } } private void NavigateToGallery() { NavigationManager.NavigateTo("/gallery"); } [Inject] private NavigationManager NavigationManager { get; set; } }