refine image converter

This commit is contained in:
Jicheng Lu 2025-09-11 20:36:15 -05:00
parent 6e16aea535
commit 517d46a5a7
6 changed files with 27 additions and 49 deletions

View file

@ -49,12 +49,13 @@ 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-3");
var textContent = text.IfNullOrEmptyAs(instruction).IfNullOrEmptyAs(string.Empty);
var completion = CompletionProvider.GetImageCompletion(_services, provider: options?.Provider ?? "openai", model: options?.Model ?? "gpt-image-1");
var message = await completion.GetImageGeneration(new Agent()
{
Id = innerAgentId,
Instruction = instruction
}, new RoleDialogModel(AgentRole.User, instruction ?? text));
}, new RoleDialogModel(AgentRole.User, textContent));
await HookEmitter.Emit<IInstructHook>(_services, async hook =>
await hook.OnResponseGenerated(new InstructResponseModel
@ -123,16 +124,18 @@ public partial class FileInstructService
if (converter != null)
{
binary = await converter.ConvertImageToRgbaPng(binary);
image.FileExtension = "png";
}
using var stream = binary.ToStream();
stream.Position = 0;
var fileName = BuildFileName(image.FileName, image.FileExtension, "image", "png");
var fileName = BuildFileName(image.FileName,image.FileExtension, "image", "png");
var textContent = text.IfNullOrEmptyAs(instruction).IfNullOrEmptyAs(string.Empty);
var message = await completion.GetImageEdits(new Agent()
{
Id = innerAgentId
}, new RoleDialogModel(AgentRole.User, instruction ?? text), stream, fileName);
}, new RoleDialogModel(AgentRole.User, textContent), stream, fileName);
stream.Close();
@ -174,10 +177,11 @@ public partial class FileInstructService
var imageName = BuildFileName(image.FileName, image.FileExtension, "image", "png");
var maskName = BuildFileName(image.FileName, image.FileExtension, "mask", "png");
var textContent = text.IfNullOrEmptyAs(instruction).IfNullOrEmptyAs(string.Empty);
var message = await completion.GetImageEdits(new Agent()
{
Id = innerAgentId
}, new RoleDialogModel(AgentRole.User, instruction ?? text), imageStream, imageName, maskStream, maskName);
}, new RoleDialogModel(AgentRole.User, textContent), imageStream, imageName, maskStream, maskName);
imageStream.Close();
maskStream.Close();

View file

@ -4,46 +4,14 @@
"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": "2025-09-11T20:25:59.292826Z",
"updatedDateTime": "2024-01-15T14:39:32Z",
"iconUrl": "/images/logo.png",
"disabled": false,
"isPublic": true,
"llmConfig": {
"is_inherit": false,
"provider": "openai",
"model": "gpt-5",
"model": "gpt-4o-mini",
"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": []
}
}

View file

@ -51,7 +51,7 @@ public class ImageEditRequest : InstructBaseRequest
public string Text { get; set; } = string.Empty;
[JsonPropertyName("image_converter_provider")]
public string? ImageConverterProvider { get; set; } = "file-handler";
public string? ImageConverterProvider { get; set; }
}
public class ImageEditFileRequest : ImageEditRequest

View file

@ -1,5 +1,6 @@
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Formats.Png;
using System.IO;
namespace BotSharp.Plugin.FileHandler.Converters;
@ -25,7 +26,11 @@ public class FileHandlerImageConverter : IImageConverter
{
using var image = Image.Load<Rgba32>(binary.ToArray());
using var memoryStream = new MemoryStream();
image.SaveAsPng(memoryStream);
image.SaveAsPng(memoryStream, new PngEncoder
{
ColorType = PngColorType.RgbWithAlpha
});
var convertedBinary = BinaryData.FromBytes(memoryStream.ToArray());
return await Task.FromResult(convertedBinary);
}

View file

@ -84,6 +84,7 @@ public class EditImageFn : IFunctionCallback
var fileStorage = _services.GetRequiredService<IFileStorageService>();
var fileBinary = fileStorage.GetFileBytes(image.FileStorageUrl);
var rgbaBinary = await ConvertImageToRgbaWithPng(fileBinary);
image.FileExtension = "png";
using var stream = rgbaBinary.ToStream();
stream.Position = 0;
@ -148,7 +149,7 @@ public class EditImageFn : IFunctionCallback
private async Task<BinaryData> ConvertImageToRgbaWithPng(BinaryData binaryFile)
{
var provider = _settings?.ImageConverter?.Provider ?? "file-handler";
var provider = _settings?.ImageConverter?.Provider;
var converter = _services.GetServices<IImageConverter>().FirstOrDefault(x => x.Provider == provider);
if (converter == null)
{

View file

@ -449,11 +449,11 @@
},
"Generation": {
"LlmProvider": "openai",
"LlmModel": "dall-e-3"
"LlmModel": "gpt-image-1"
},
"Edit": {
"LlmProvider": "openai",
"LlmModel": "dall-e-2"
"LlmModel": "gpt-image-1"
},
"Variation": {
"LlmProvider": "",
@ -469,7 +469,7 @@
}
},
"ImageConverter": {
"Provider": "file-handler"
"Provider": null
}
},