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

79 lines
3.4 KiB
C#
Raw Normal View History

2024-07-19 17:01:07 +00:00
using OpenAI.Images;
namespace BotSharp.Plugin.OpenAI.Providers.Image;
public partial class ImageCompletionProvider
{
public async Task<RoleDialogModel> GetImageEdits(Agent agent, RoleDialogModel message, Stream image, string imageFileName)
{
var client = ProviderHelper.GetClient(Provider, _model, _services);
var (prompt, imageCount, options) = PrepareEditOptions(message);
var imageClient = client.GetImageClient(_model);
var response = imageClient.GenerateImageEdits(image, imageFileName, prompt, imageCount, options);
var images = response.Value;
var generatedImages = GetImageGenerations(images, options.ResponseFormat);
var content = string.Join("\r\n", generatedImages.Where(x => !string.IsNullOrWhiteSpace(x.Description)).Select(x => x.Description));
var responseMessage = new RoleDialogModel(AgentRole.Assistant, content)
{
CurrentAgentId = agent.Id,
MessageId = message?.MessageId ?? string.Empty,
GeneratedImages = generatedImages
};
return await Task.FromResult(responseMessage);
}
public async Task<RoleDialogModel> GetImageEdits(Agent agent, RoleDialogModel message,
Stream image, string imageFileName, Stream mask, string maskFileName)
{
var client = ProviderHelper.GetClient(Provider, _model, _services);
var (prompt, imageCount, options) = PrepareEditOptions(message);
var imageClient = client.GetImageClient(_model);
var response = imageClient.GenerateImageEdits(image, imageFileName, prompt, mask, maskFileName, imageCount, options);
var images = response.Value;
var generatedImages = GetImageGenerations(images, options.ResponseFormat);
var content = string.Join("\r\n", generatedImages.Where(x => !string.IsNullOrWhiteSpace(x.Description)).Select(x => x.Description));
var responseMessage = new RoleDialogModel(AgentRole.Assistant, content)
{
CurrentAgentId = agent.Id,
MessageId = message?.MessageId ?? string.Empty,
GeneratedImages = generatedImages
};
return await Task.FromResult(responseMessage);
}
private (string, int, ImageEditOptions) PrepareEditOptions(RoleDialogModel message)
{
var prompt = message?.Payload ?? message?.Content ?? string.Empty;
2025-08-19 20:43:45 +00:00
var settingsService = _services.GetRequiredService<ILlmProviderService>();
2024-07-19 17:01:07 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2025-08-22 22:00:52 +00:00
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Edit;
2025-08-19 20:43:45 +00:00
var size = state.GetState("image_size");
var responseFormat = state.GetState("image_response_format");
2024-07-19 17:01:07 +00:00
2025-08-19 20:43:45 +00:00
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
var options = new ImageEditOptions();
if (!string.IsNullOrEmpty(size))
2024-07-19 17:01:07 +00:00
{
2025-08-19 20:43:45 +00:00
options.Size = GetImageSize(size);
}
if (!string.IsNullOrEmpty(responseFormat))
{
options.ResponseFormat = GetImageResponseFormat(responseFormat);
}
2025-08-22 22:00:52 +00:00
var count = GetImageCount(state.GetState("image_count"));
2024-07-19 17:01:07 +00:00
return (prompt, count, options);
}
}