106 lines
3.3 KiB
C#
106 lines
3.3 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|