BotSharp/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.cs

163 lines
4.3 KiB
C#
Raw Normal View History

2024-07-19 03:28:24 +00:00
using OpenAI.Images;
namespace BotSharp.Plugin.OpenAI.Providers.Image;
public partial class ImageCompletionProvider : IImageCompletion
{
protected readonly OpenAiSettings _settings;
protected readonly IServiceProvider _services;
protected readonly ILogger<ImageCompletionProvider> _logger;
private const int DEFAULT_IMAGE_COUNT = 1;
private const int IMAGE_COUNT_LIMIT = 5;
protected string _model;
public virtual string Provider => "openai";
2025-03-05 23:22:46 +00:00
public string Model => _model;
2024-07-19 03:28:24 +00:00
public ImageCompletionProvider(
OpenAiSettings settings,
ILogger<ImageCompletionProvider> logger,
IServiceProvider services)
{
_settings = settings;
_services = services;
_logger = logger;
}
public void SetModelName(string model)
{
_model = model;
}
#region Private methods
2024-07-19 17:01:07 +00:00
private List<ImageGeneration> GetImageGenerations(GeneratedImageCollection images, GeneratedImageFormat? format)
{
var generatedImages = new List<ImageGeneration>();
foreach (var image in images)
{
if (image == null) continue;
var generatedImage = new ImageGeneration { Description = image?.RevisedPrompt ?? string.Empty };
if (format == GeneratedImageFormat.Uri)
{
generatedImage.ImageUrl = image?.ImageUri?.AbsoluteUri ?? string.Empty;
}
2025-07-25 17:54:58 +00:00
else
2024-07-19 17:01:07 +00:00
{
var base64Str = string.Empty;
var bytes = image?.ImageBytes?.ToArray();
if (!bytes.IsNullOrEmpty())
{
base64Str = Convert.ToBase64String(bytes);
}
generatedImage.ImageData = base64Str;
}
generatedImages.Add(generatedImage);
}
return generatedImages;
}
2024-07-19 03:28:24 +00:00
private GeneratedImageSize GetImageSize(string size)
{
var value = !string.IsNullOrEmpty(size) ? size : "1024x1024";
GeneratedImageSize retSize;
switch (value)
{
case "256x256":
retSize = GeneratedImageSize.W256xH256;
break;
case "512x512":
retSize = GeneratedImageSize.W512xH512;
break;
case "1024x1792":
retSize = GeneratedImageSize.W1024xH1792;
break;
case "1792x1024":
retSize = GeneratedImageSize.W1792xH1024;
break;
default:
retSize = GeneratedImageSize.W1024xH1024;
break;
}
return retSize;
}
private GeneratedImageQuality GetImageQuality(string quality)
{
var value = !string.IsNullOrEmpty(quality) ? quality : "standard";
GeneratedImageQuality retQuality;
switch (value)
{
case "hd":
retQuality = GeneratedImageQuality.High;
break;
default:
retQuality = GeneratedImageQuality.Standard;
break;
}
return retQuality;
}
private GeneratedImageStyle GetImageStyle(string style)
{
var value = !string.IsNullOrEmpty(style) ? style : "natural";
GeneratedImageStyle retStyle;
switch (value)
{
case "vivid":
retStyle = GeneratedImageStyle.Vivid;
break;
default:
retStyle = GeneratedImageStyle.Natural;
break;
}
return retStyle;
}
private GeneratedImageFormat GetImageFormat(string format)
{
2025-07-25 17:54:58 +00:00
var value = !string.IsNullOrEmpty(format) ? format : "bytes";
2024-07-19 03:28:24 +00:00
GeneratedImageFormat retFormat;
switch (value)
{
2025-07-25 17:54:58 +00:00
case "url":
retFormat = GeneratedImageFormat.Uri;
2024-07-19 03:28:24 +00:00
break;
default:
2025-07-25 17:54:58 +00:00
retFormat = GeneratedImageFormat.Bytes;
2024-07-19 03:28:24 +00:00
break;
}
return retFormat;
}
private int GetImageCount(string count)
{
if (!int.TryParse(count, out var retCount))
{
return DEFAULT_IMAGE_COUNT;
}
if (retCount <= 0)
{
retCount = DEFAULT_IMAGE_COUNT;
}
else if (retCount > IMAGE_COUNT_LIMIT)
{
retCount = IMAGE_COUNT_LIMIT;
}
return retCount;
}
#endregion
}