add settings in file handler

This commit is contained in:
Jicheng Lu 2025-09-04 15:45:13 -05:00
parent 939e9cfd4e
commit c31eff6632
8 changed files with 154 additions and 46 deletions

View file

@ -76,7 +76,6 @@ public class LlmModelSetting
#region Embedding model settings
public class EmbeddingSetting
{
public bool IsDefault { get; set; }
public int Dimension { get; set; }
}
#endregion
@ -85,7 +84,6 @@ public class EmbeddingSetting
#region Reasoning model settings
public class ReasoningSetting
{
public bool IsDefault { get; set; }
public float Temperature { get; set; } = 1.0f;
public string? EffortLevel { get; set; }
}
@ -102,21 +100,13 @@ public class WebSearchSetting
#region Image model settings
public class ImageSetting
{
public ImageReadSetting? Reading { get; set; }
public ImageGenerationSetting? Generation { get; set; }
public ImageEditSetting? Edit { get; set; }
public ImageVariationSetting? Variation { get; set; }
}
public class ImageReadSetting
{
public bool IsDefault { get; set; }
public string? ImageDetailLevel { get; set; }
}
public class ImageGenerationSetting
{
public bool IsDefault { get; set; }
public ModelSettingBase? Style { get; set; }
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? Quality { get; set; }
@ -125,14 +115,12 @@ public class ImageGenerationSetting
public class ImageEditSetting
{
public bool IsDefault { get; set; }
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? ResponseFormat { get; set; }
}
public class ImageVariationSetting
{
public bool IsDefault { get; set; }
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? ResponseFormat { get; set; }
}

View file

@ -101,9 +101,18 @@ public class EditImageFn : IFunctionCallback
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_edit_llm_provider");
var model = state.GetState("image_edit_llm_model");
var model = state.GetState("image_edit_llm_provider");
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = fileSettings?.Image?.Edit?.LlmProvider;
model = fileSettings?.Image?.Edit?.LlmModel;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
@ -113,11 +122,6 @@ public class EditImageFn : IFunctionCallback
provider = "openai";
model = "gpt-image-1";
var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Edit?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Edit != null);
model = foundModel?.Name ?? model;
return (provider, model);
}

View file

@ -83,6 +83,7 @@ public class GenerateImageFn : IFunctionCallback
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_generate_llm_provider");
var model = state.GetState("image_generate_llm_model");
@ -92,14 +93,17 @@ public class GenerateImageFn : IFunctionCallback
return (provider, model);
}
provider = fileSettings?.Image?.Generation?.LlmProvider;
model = fileSettings?.Image?.Generation?.LlmModel;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-image-1";
var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Generation?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Generation != null);
model = foundModel?.Name ?? model;
return (provider, model);
}

View file

@ -1,4 +1,3 @@
using BotSharp.Abstraction.MLTasks.Settings;
using BotSharp.Abstraction.Routing;
namespace BotSharp.Plugin.FileHandler.Functions;
@ -100,6 +99,7 @@ public class ReadImageFn : IFunctionCallback
try
{
var (provider, model) = GetLlmProviderModel();
SetImageDetailLevel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content;
@ -116,6 +116,7 @@ public class ReadImageFn : IFunctionCallback
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_read_llm_provider");
var model = state.GetState("image_read_llm_model");
@ -125,14 +126,31 @@ public class ReadImageFn : IFunctionCallback
return (provider, model);
}
provider = fileSettings?.Image?.Reading?.LlmProvider;
model = fileSettings?.Image?.Reading?.LlmModel;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-5-mini";
var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Reading?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Reading != null);
model = foundModel?.Name ?? model;
return (provider, model);
}
private void SetImageDetailLevel()
{
var state = _services.GetRequiredService<IConversationStateService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var key = "chat_image_detail_level";
var level = state.GetState(key);
if (string.IsNullOrWhiteSpace(level) && !string.IsNullOrWhiteSpace(fileSettings.Image?.Reading?.ImageDetailLevel))
{
state.SetState(key, fileSettings.Image.Reading.ImageDetailLevel);
}
}
}

View file

@ -90,6 +90,7 @@ public class ReadPdfFn : IFunctionCallback
try
{
var (provider, model) = GetLlmProviderModel();
SetImageDetailLevel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content;
@ -106,9 +107,18 @@ public class ReadPdfFn : IFunctionCallback
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_read_llm_provider");
var model = state.GetState("image_read_llm_model");
var provider = state.GetState("pdf_read_llm_provider");
var model = state.GetState("pdf_read_llm_model");
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = fileSettings?.Image?.Reading?.LlmProvider;
model = fileSettings?.Image?.Reading?.LlmModel;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
@ -118,11 +128,20 @@ public class ReadPdfFn : IFunctionCallback
provider = "openai";
model = "gpt-5-mini";
var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Reading?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Reading != null);
model = foundModel?.Name ?? model;
return (provider, model);
}
private void SetImageDetailLevel()
{
var state = _services.GetRequiredService<IConversationStateService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var key = "chat_image_detail_level";
var level = state.GetState(key);
if (string.IsNullOrWhiteSpace(level) && !string.IsNullOrWhiteSpace(fileSettings.Pdf?.Reading?.ImageDetailLevel))
{
state.SetState(key, fileSettings.Pdf.Reading.ImageDetailLevel);
}
}
}

View file

@ -2,4 +2,55 @@ namespace BotSharp.Plugin.FileHandler.Settings;
public class FileHandlerSettings
{
public ImageSettings? Image { get; set; }
public PdfSettings? Pdf { get; set; }
}
#region Image
public class ImageSettings
{
public ImageReadSettings? Reading { get; set; }
public ImageGenerationSettings? Generation { get; set; }
public ImageEditSettings? Edit { get; set; }
public ImageVariationSettings? Variation { get; set; }
}
public class ImageReadSettings : FileLlmSettingBase
{
public string? ImageDetailLevel { get; set; }
}
public class ImageGenerationSettings : FileLlmSettingBase
{
}
public class ImageEditSettings : FileLlmSettingBase
{
}
public class ImageVariationSettings : FileLlmSettingBase
{
}
#endregion
#region Pdf
public class PdfSettings
{
public PdfReadSettings? Reading { get; set; }
}
public class PdfReadSettings : FileLlmSettingBase
{
public bool ConvertToImage { get; set; }
public string? ImageDetailLevel { get; set; }
}
#endregion
public class FileLlmSettingBase
{
public string? LlmProvider { get; set; }
public string? LlmModel { get; set; }
}

View file

@ -372,7 +372,7 @@ public class ChatCompletionProvider : IChatCompletion
filteredMessages = filteredMessages.Where((_, idx) => idx >= firstUserMsgIdx).ToList();
}
var imageDetailLevel = GetChatImageDetailLevel(state.GetState("chat_image_detail_level"));
var imageDetailLevel = ParseChatImageDetailLevel(state.GetState("chat_image_detail_level"));
foreach (var message in filteredMessages)
{
if (message.Role == AgentRole.Function)
@ -508,8 +508,8 @@ public class ChatCompletionProvider : IChatCompletion
{
temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel ?? string.Empty)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel ?? string.Empty);
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
}
@ -561,13 +561,7 @@ public class ChatCompletionProvider : IChatCompletion
return effortLevel;
}
private ChatImageDetailLevel GetChatImageDetailLevel(string level)
{
return ParseChatImageDetailLevel(level);
}
private ChatImageDetailLevel ParseChatImageDetailLevel(string level)
private ChatImageDetailLevel ParseChatImageDetailLevel(string? level)
{
if (string.IsNullOrWhiteSpace(level))
{

View file

@ -438,6 +438,36 @@
}
},
"FileHandler": {
"Image": {
"Reading": {
"LlmProvider": "openai",
"LlmModel": "gpt-5-mini",
"ImageDetailLevel": "auto"
},
"Generation": {
"LlmProvider": "openai",
"LlmModel": "dall-e-3"
},
"Edit": {
"LlmProvider": "openai",
"LlmModel": "dall-e-2"
},
"Variation": {
"LlmProvider": "",
"LlmModel": ""
}
},
"Pdf": {
"Reading": {
"LlmProvider": "openai",
"LlmModel": "gpt-5-mini",
"ConvertToImage": true,
"ImageDetailLevel": "auto"
}
}
},
"TencentCos": {
"AppId": "",
"SecretId": "",