using DataAccess.Data; using DataAccess.Models; using Radzen; using System.Diagnostics; namespace KIKunstKirstenKlöckner.Data; public class ImageGenerator { private readonly HttpClient _client = new(); private readonly BildInfoData _bildInfoData; public ImageGenerator(IConfiguration config, BildInfoData bildInfoData) { _bildInfoData = bildInfoData; string? inferenceApiKey = config.GetValue("API:HF_Inference"); _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("Authorization", $"Bearer {inferenceApiKey}"); } /// /// Geneiert das Bild für den aktuellen /// public async Task GenerateImageAsync(string prompt, string negativePromt, int? width, int? height, WunschInfoModel wunschInfo, bool isRetry = false) { var postData = new { inputs = prompt, parameters = new { negative_prompt = negativePromt, //"photorealistic, highly detailed, 8K, portrait", width = width, height = height }, 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); try { //const string modelName = "Nacken/kkkk-sdxl-5000"; const string modelName = "Nacken/kkk-sdxl-18000"; var inferenceModelUrl = $"https://api-inference.huggingface.co/models/{modelName}"; 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); DateTime imageDate = DateTime.Now; BildInfoModel bildInfo = new() { Dateiname = "PlaceHolder", Datum = imageDate, ImageModel = modelName, WunschId = wunschInfo.Id }; await _bildInfoData.AddBildInfoAsync(bildInfo); string imgUrl = $"generated_images/Image_{bildInfo.Id}.jpg"; string mapPath = $"./wwwroot/{imgUrl}"; await image.SaveAsJpegAsync(mapPath); bildInfo.Dateiname = imgUrl; await _bildInfoData.UpdateBildInfoDateinameAsync(bildInfo); return imgUrl; } else { Console.WriteLine($"Image conversion failed: {response}"); if (Debugger.IsAttached) Debugger.Break(); return null; } } catch (Exception exception) { Console.WriteLine($"Image request failed: {exception}"); if (Debugger.IsAttached) Debugger.Break(); return null; } } }