From e72a6b5021b6e244556507586195d5642f84ad8d Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 11 Sep 2025 17:36:20 -0500 Subject: [PATCH] refine image converter --- Directory.Packages.props | 2 +- ...f2ImageConverter.cs => IImageConverter.cs} | 11 +++- .../Instructs/Models/InstructOptions.cs | 5 ++ .../Instruct/FileInstructService.Image.cs | 11 +++- .../Instruct/FileInstructService.Pdf.cs | 8 ++- .../LocalFileStorageService.Conversation.cs | 6 +- .../agent.json | 44 ++++++++++++-- .../Controllers/InstructModeController.cs | 57 ++++++++++--------- .../Instructs/Request/InstructBaseRequest.cs | 5 +- .../BotSharp.Plugin.FileHandler.csproj | 4 ++ .../Converters/FileHandlerImageConverter.cs | 38 +++++++++++++ .../FileHandlerPlugin.cs | 2 + .../Functions/EditImageFn.cs | 26 +++++++-- .../Settings/FileHandlerSettings.cs | 1 + .../BotSharp.Plugin.FileHandler/Using.cs | 1 + .../functions/util-file-edit_image.json | 2 +- .../TencentCosService.Conversation.cs | 6 +- src/WebStarter/appsettings.json | 3 + 18 files changed, 178 insertions(+), 54 deletions(-) rename src/Infrastructure/BotSharp.Abstraction/Files/Converters/{IPdf2ImageConverter.cs => IImageConverter.cs} (54%) create mode 100644 src/Plugins/BotSharp.Plugin.FileHandler/Converters/FileHandlerImageConverter.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index f1c5ac20..f0cf0d33 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -20,7 +20,7 @@ - + diff --git a/src/Infrastructure/BotSharp.Abstraction/Files/Converters/IPdf2ImageConverter.cs b/src/Infrastructure/BotSharp.Abstraction/Files/Converters/IImageConverter.cs similarity index 54% rename from src/Infrastructure/BotSharp.Abstraction/Files/Converters/IPdf2ImageConverter.cs rename to src/Infrastructure/BotSharp.Abstraction/Files/Converters/IImageConverter.cs index 24b28402..72d7eaf2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Files/Converters/IPdf2ImageConverter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Files/Converters/IImageConverter.cs @@ -1,6 +1,6 @@ namespace BotSharp.Abstraction.Files.Converters; -public interface IPdf2ImageConverter +public interface IImageConverter { public string Provider { get; } @@ -10,5 +10,12 @@ public interface IPdf2ImageConverter /// Pdf file location /// Image folder location /// - Task> ConvertPdfToImages(string pdfLocation, string imageFolderLocation); + Task> ConvertPdfToImages(string pdfLocation, string imageFolderLocation) => throw new NotImplementedException(); + + /// + /// Convert an image to PNG with RGBA + /// + /// + /// + Task ConvertImageToRgbaPng(BinaryData binary) => throw new NotImplementedException(); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Instructs/Models/InstructOptions.cs b/src/Infrastructure/BotSharp.Abstraction/Instructs/Models/InstructOptions.cs index ece08b0e..4ca92120 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Instructs/Models/InstructOptions.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Instructs/Models/InstructOptions.cs @@ -31,4 +31,9 @@ public class InstructOptions /// Data to fill in prompt /// public Dictionary Data { get; set; } = new(); + + /// + /// Image converter provider + /// + public string? ImageConverterProvider { get; set; } } diff --git a/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Image.cs b/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Image.cs index b2067e63..d1bb85e8 100644 --- a/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Image.cs +++ b/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Image.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Instructs.Models; using BotSharp.Abstraction.Instructs; +using BotSharp.Abstraction.Files.Converters; namespace BotSharp.Core.Files.Services; @@ -114,8 +115,16 @@ public partial class FileInstructService var innerAgentId = options?.AgentId ?? Guid.Empty.ToString(); var instruction = await GetAgentTemplate(innerAgentId, options?.TemplateName); - var completion = CompletionProvider.GetImageCompletion(_services, provider: options?.Provider ?? "openai", model: options?.Model ?? "dall-e-2"); + var completion = CompletionProvider.GetImageCompletion(_services, provider: options?.Provider ?? "openai", model: options?.Model ?? "gpt-image-1"); var binary = await DownloadFile(image); + + // Convert image + var converter = _services.GetServices().FirstOrDefault(x => x.Provider == options?.ImageConverterProvider); + if (converter != null) + { + binary = await converter.ConvertImageToRgbaPng(binary); + } + using var stream = binary.ToStream(); stream.Position = 0; diff --git a/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Pdf.cs b/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Pdf.cs index 04e31092..0b95b8d9 100644 --- a/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Pdf.cs +++ b/src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Pdf.cs @@ -27,7 +27,7 @@ public partial class FileInstructService var targetFiles = pdfFiles; if (provider != "google-ai") { - targetFiles = await ConvertPdfToImages(pdfFiles); + targetFiles = await ConvertPdfToImages(pdfFiles, options); } if (targetFiles.IsNullOrEmpty()) @@ -116,11 +116,13 @@ public partial class FileInstructService return locs; } - private async Task> ConvertPdfToImages(IEnumerable files) + private async Task> ConvertPdfToImages(IEnumerable files, InstructOptions? options = null) { var images = new List(); var settings = _services.GetRequiredService(); - var converter = _services.GetServices().FirstOrDefault(x => x.Provider == settings.Pdf2ImageConverter.Provider); + var imageConverterProvider = options?.ImageConverterProvider; + + var converter = _services.GetServices().FirstOrDefault(x => x.Provider == imageConverterProvider); if (converter == null || files.IsNullOrEmpty()) { return images; diff --git a/src/Infrastructure/BotSharp.Core/Files/Services/Storage/LocalFileStorageService.Conversation.cs b/src/Infrastructure/BotSharp.Core/Files/Services/Storage/LocalFileStorageService.Conversation.cs index 81e668c1..39be1d2e 100644 --- a/src/Infrastructure/BotSharp.Core/Files/Services/Storage/LocalFileStorageService.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Files/Services/Storage/LocalFileStorageService.Conversation.cs @@ -325,7 +325,7 @@ public partial class LocalFileStorageService private async Task> ConvertPdfToImages(string pdfLoc, string imageLoc) { - var converters = _services.GetServices(); + var converters = _services.GetServices(); if (converters.IsNullOrEmpty()) { return Enumerable.Empty(); @@ -340,10 +340,10 @@ public partial class LocalFileStorageService return await converter.ConvertPdfToImages(pdfLoc, imageLoc); } - private IPdf2ImageConverter? GetPdf2ImageConverter() + private IImageConverter? GetPdf2ImageConverter() { var settings = _services.GetRequiredService(); - var converter = _services.GetServices().FirstOrDefault(x => x.Provider == settings.Pdf2ImageConverter.Provider); + var converter = _services.GetServices().FirstOrDefault(x => x.Provider == settings.Pdf2ImageConverter.Provider); return converter; } diff --git a/src/Infrastructure/BotSharp.Core/data/agents/01e2fc5c-2c89-4ec7-8470-7688608b496c/agent.json b/src/Infrastructure/BotSharp.Core/data/agents/01e2fc5c-2c89-4ec7-8470-7688608b496c/agent.json index 9fc0c389..d04a3fe4 100644 --- a/src/Infrastructure/BotSharp.Core/data/agents/01e2fc5c-2c89-4ec7-8470-7688608b496c/agent.json +++ b/src/Infrastructure/BotSharp.Core/data/agents/01e2fc5c-2c89-4ec7-8470-7688608b496c/agent.json @@ -4,14 +4,46 @@ "description": "Chatbot is used to test the performance of different large models and does not interact with external APIs.", "type": "task", "createdDateTime": "2024-01-15T10:39:32Z", - "updatedDateTime": "2024-01-15T14:39:32Z", - "iconUrl": "/images/logo.png", - "disabled": false, - "isPublic": true, + "updatedDateTime": "2025-09-11T20:25:59.292826Z", "llmConfig": { "is_inherit": false, "provider": "openai", - "model": "gpt-4o-mini", + "model": "gpt-5", "max_recursion_depth": 3 - } + }, + "isPublic": true, + "disabled": false, + "iconUrl": "/images/logo.png", + "profiles": [], + "labels": [], + "mergeUtility": false, + "utilities": [ + { + "category": "file", + "name": "image-generator", + "disabled": false, + "items": [ + { + "function_name": "util-file-generate_image", + "template_name": "util-file-generate_image.fn" + } + ] + }, + { + "category": "file", + "name": "image-editor", + "disabled": false, + "items": [ + { + "function_name": "util-file-edit_image", + "template_name": "util-file-edit_image.fn" + } + ] + } + ], + "mcpTools": [], + "rules": [], + "knowledgeBases": [], + "inheritAgentId": null, + "routingRules": [] } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs index a36d9a18..d1538ee2 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs @@ -182,21 +182,21 @@ public class InstructModeController : ControllerBase #region Generate image [HttpPost("/instruct/image-generation")] - public async Task ImageGeneration([FromBody] ImageGenerationRequest input) + public async Task ImageGeneration([FromBody] ImageGenerationRequest request) { var state = _services.GetRequiredService(); - input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); + request.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); var imageViewModel = new ImageGenerationViewModel(); try { var fileInstruct = _services.GetRequiredService(); - var message = await fileInstruct.GenerateImage(input.Text, new InstructOptions + var message = await fileInstruct.GenerateImage(request.Text, new InstructOptions { - Provider = input.Provider, - Model = input.Model, - AgentId = input.AgentId, - TemplateName = input.TemplateName + Provider = request.Provider, + Model = request.Model, + AgentId = request.AgentId, + TemplateName = request.TemplateName }); imageViewModel.Content = message.Content; imageViewModel.Images = message.GeneratedImages?.Select(x => ImageViewModel.ToViewModel(x)) ?? []; @@ -286,25 +286,26 @@ public class InstructModeController : ControllerBase } [HttpPost("/instruct/image-edit")] - public async Task ImageEdit([FromBody] ImageEditRequest input) + public async Task ImageEdit([FromBody] ImageEditRequest request) { var fileInstruct = _services.GetRequiredService(); var state = _services.GetRequiredService(); - input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); + request.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); var imageViewModel = new ImageGenerationViewModel(); try { - if (input.File == null) + if (request.File == null) { return new ImageGenerationViewModel { Message = "Error! Cannot find a valid image file!" }; } - var message = await fileInstruct.EditImage(input.Text, input.File, new InstructOptions + var message = await fileInstruct.EditImage(request.Text, request.File, new InstructOptions { - Provider = input.Provider, - Model = input.Model, - AgentId = input.AgentId, - TemplateName = input.TemplateName + Provider = request.Provider, + Model = request.Model, + AgentId = request.AgentId, + TemplateName = request.TemplateName, + ImageConverterProvider = request.ImageConverterProvider }); imageViewModel.Content = message.Content; imageViewModel.Images = message.GeneratedImages?.Select(x => ImageViewModel.ToViewModel(x)) ?? []; @@ -320,7 +321,7 @@ public class InstructModeController : ControllerBase } [HttpPost("/instruct/image-edit/upload")] - public async Task ImageEdit(IFormFile file, [FromForm] MultiModalRequest request) + public async Task ImageEdit(IFormFile file, [FromForm] ImageEditRequest request) { var fileInstruct = _services.GetRequiredService(); var state = _services.GetRequiredService(); @@ -341,12 +342,12 @@ public class InstructModeController : ControllerBase Provider = request?.Provider, Model = request?.Model, AgentId = request?.AgentId, - TemplateName = request?.TemplateName + TemplateName = request?.TemplateName, + ImageConverterProvider = request?.ImageConverterProvider }); imageViewModel.Content = message.Content; imageViewModel.Images = message.GeneratedImages?.Select(x => ImageViewModel.ToViewModel(x)) ?? []; - return imageViewModel; } catch (Exception ex) @@ -359,27 +360,27 @@ public class InstructModeController : ControllerBase } [HttpPost("/instruct/image-mask-edit")] - public async Task ImageMaskEdit([FromBody] ImageMaskEditRequest input) + public async Task ImageMaskEdit([FromBody] ImageMaskEditRequest request) { var fileInstruct = _services.GetRequiredService(); var state = _services.GetRequiredService(); - input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); + request.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External)); var imageViewModel = new ImageGenerationViewModel(); try { - var image = input.File; - var mask = input.Mask; + var image = request.File; + var mask = request.Mask; if (image == null || mask == null) { return new ImageGenerationViewModel { Message = "Error! Cannot find a valid image or mask!" }; } - var message = await fileInstruct.EditImage(input.Text, image, mask, new InstructOptions + var message = await fileInstruct.EditImage(request.Text, image, mask, new InstructOptions { - Provider = input.Provider, - Model = input.Model, - AgentId = input.AgentId, - TemplateName = input.TemplateName + Provider = request.Provider, + Model = request.Model, + AgentId = request.AgentId, + TemplateName = request.TemplateName }); imageViewModel.Content = message.Content; imageViewModel.Images = message.GeneratedImages?.Select(x => ImageViewModel.ToViewModel(x)) ?? []; @@ -395,7 +396,7 @@ public class InstructModeController : ControllerBase } [HttpPost("/instruct/image-mask-edit/upload")] - public async Task ImageMaskEdit(IFormFile image, IFormFile mask, [FromForm] MultiModalRequest request) + public async Task ImageMaskEdit(IFormFile image, IFormFile mask, [FromForm] ImageMaskEditRequest request) { var fileInstruct = _services.GetRequiredService(); var state = _services.GetRequiredService(); diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Instructs/Request/InstructBaseRequest.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Instructs/Request/InstructBaseRequest.cs index 4434da0f..1071d58b 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Instructs/Request/InstructBaseRequest.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Instructs/Request/InstructBaseRequest.cs @@ -51,7 +51,10 @@ public class ImageEditRequest : InstructBaseRequest public string Text { get; set; } = string.Empty; [JsonPropertyName("file")] - public InstructFileModel File { get; set; } + public InstructFileModel? File { get; set; } + + [JsonPropertyName("image_converter_provider")] + public string? ImageConverterProvider { get; set; } = "file-handler"; } public class ImageMaskEditRequest : InstructBaseRequest diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj b/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj index 2b343db0..fe05a7e4 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj +++ b/src/Plugins/BotSharp.Plugin.FileHandler/BotSharp.Plugin.FileHandler.csproj @@ -48,6 +48,10 @@ + + + + diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Converters/FileHandlerImageConverter.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Converters/FileHandlerImageConverter.cs new file mode 100644 index 00000000..5c31af38 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Converters/FileHandlerImageConverter.cs @@ -0,0 +1,38 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System.IO; + +namespace BotSharp.Plugin.FileHandler.Converters; + +public class FileHandlerImageConverter : IImageConverter +{ + private readonly IServiceProvider _services; + private readonly ILogger _logger; + + public FileHandlerImageConverter( + IServiceProvider services, + ILogger logger) + { + _services = services; + _logger = logger; + } + + public string Provider => "file-handler"; + + public async Task ConvertImageToRgbaPng(BinaryData binary) + { + try + { + using var image = Image.Load(binary.ToArray()); + using var memoryStream = new MemoryStream(); + image.SaveAsPng(memoryStream); + var convertedBinary = BinaryData.FromBytes(memoryStream.ToArray()); + return await Task.FromResult(convertedBinary); + } + catch (Exception ex) + { + _logger.LogError(ex, $"Error when converting image to RGBA png in {Provider}."); + return binary; + } + } +} diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs index a8ecac6d..4a46667d 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/FileHandlerPlugin.cs @@ -1,3 +1,4 @@ +using BotSharp.Plugin.FileHandler.Converters; using BotSharp.Plugin.FileHandler.Hooks; using Microsoft.Extensions.Configuration; @@ -20,6 +21,7 @@ public class FileHandlerPlugin : IBotSharpPlugin }); services.AddScoped(); + services.AddScoped(); } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs index 88cec153..56f82dee 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Functions/EditImageFn.cs @@ -7,15 +7,19 @@ public class EditImageFn : IFunctionCallback private readonly IServiceProvider _services; private readonly ILogger _logger; + private readonly FileHandlerSettings _settings; + private string _conversationId; private string _messageId; public EditImageFn( IServiceProvider services, - ILogger logger) + ILogger logger, + FileHandlerSettings settings) { _services = services; _logger = logger; + _settings = settings; } public async Task Execute(RoleDialogModel message) @@ -79,13 +83,13 @@ public class EditImageFn : IFunctionCallback var fileStorage = _services.GetRequiredService(); var fileBinary = fileStorage.GetFileBytes(image.FileStorageUrl); + var rgbaBinary = await ConvertImageToRgbaWithPng(fileBinary); - // To do: convert rgb to rgba image - using var stream = fileBinary.ToStream(); + using var stream = rgbaBinary.ToStream(); stream.Position = 0; - var result = await completion.GetImageEdits(agent, dialog, stream, image.FileFullName); + var response = await completion.GetImageEdits(agent, dialog, stream, image.FileFullName); stream.Close(); - SaveGeneratedImage(result?.GeneratedImages?.FirstOrDefault()); + SaveGeneratedImage(response?.GeneratedImages?.FirstOrDefault()); return $"Your image is successfylly editted."; } @@ -141,4 +145,16 @@ public class EditImageFn : IFunctionCallback var fileStorage = _services.GetRequiredService(); fileStorage.SaveMessageFiles(_conversationId, _messageId, FileSourceType.Bot, files); } + + private async Task ConvertImageToRgbaWithPng(BinaryData binaryFile) + { + var provider = _settings?.ImageConverter?.Provider ?? "file-handler"; + var converter = _services.GetServices().FirstOrDefault(x => x.Provider == provider); + if (converter == null) + { + return binaryFile; + } + + return await converter.ConvertImageToRgbaPng(binaryFile); + } } diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Settings/FileHandlerSettings.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Settings/FileHandlerSettings.cs index 6416e62f..cf1b8590 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Settings/FileHandlerSettings.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Settings/FileHandlerSettings.cs @@ -4,6 +4,7 @@ public class FileHandlerSettings { public ImageSettings? Image { get; set; } public PdfSettings? Pdf { get; set; } + public SettingBase? ImageConverter { get; set; } } #region Image diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/Using.cs b/src/Plugins/BotSharp.Plugin.FileHandler/Using.cs index 679e70ca..274a82ae 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/Using.cs +++ b/src/Plugins/BotSharp.Plugin.FileHandler/Using.cs @@ -16,6 +16,7 @@ global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.Agents.Enums; global using BotSharp.Abstraction.Files.Enums; global using BotSharp.Abstraction.Files.Models; +global using BotSharp.Abstraction.Files.Converters; global using BotSharp.Abstraction.Files; global using BotSharp.Abstraction.MLTasks; global using BotSharp.Abstraction.Utilities; diff --git a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json index 306e44dd..84a32e56 100644 --- a/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json +++ b/src/Plugins/BotSharp.Plugin.FileHandler/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-file-edit_image.json @@ -6,7 +6,7 @@ "properties": { "user_request": { "type": "string", - "description": "The request posted by user, which is related to editing the requested image." + "description": "The user requirement about editing the requested image." } }, "required": [ "user_request" ] diff --git a/src/Plugins/BotSharp.Plugin.TencentCos/Services/TencentCosService.Conversation.cs b/src/Plugins/BotSharp.Plugin.TencentCos/Services/TencentCosService.Conversation.cs index dfd6781f..0c113442 100644 --- a/src/Plugins/BotSharp.Plugin.TencentCos/Services/TencentCosService.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.TencentCos/Services/TencentCosService.Conversation.cs @@ -241,7 +241,7 @@ public partial class TencentCosService private async Task> ConvertPdfToImages(string pdfLoc, string imageLoc) { - var converters = _services.GetServices(); + var converters = _services.GetServices(); if (converters.IsNullOrEmpty()) return Enumerable.Empty(); var converter = GetPdf2ImageConverter(); @@ -252,10 +252,10 @@ public partial class TencentCosService return await converter.ConvertPdfToImages(pdfLoc, imageLoc); } - private IPdf2ImageConverter? GetPdf2ImageConverter() + private IImageConverter? GetPdf2ImageConverter() { var settings = _services.GetRequiredService(); - var converter = _services.GetServices().FirstOrDefault(x => x.Provider == settings.Pdf2ImageConverter.Provider); + var converter = _services.GetServices().FirstOrDefault(x => x.Provider == settings.Pdf2ImageConverter.Provider); return converter; } diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 992883a5..210ecfc3 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -467,6 +467,9 @@ "ConvertToImage": true, "ImageDetailLevel": "auto" } + }, + "ImageConverter": { + "Provider": "file-handler" } },