Refactoring
This commit is contained in:
105
KIKunstKirstenKlöckner/Data/ImageGenerator.cs
Normal file
105
KIKunstKirstenKlöckner/Data/ImageGenerator.cs
Normal file
@ -0,0 +1,105 @@
|
||||
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<string>("API:HF_Inference");
|
||||
|
||||
_client.DefaultRequestHeaders.Clear();
|
||||
_client.DefaultRequestHeaders.Add("Authorization", $"Bearer {inferenceApiKey}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Geneiert das Bild für den aktuellen <see cref="_imagePrompt"/>
|
||||
/// </summary>
|
||||
public async Task<string?> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user