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

View file

@ -101,9 +101,18 @@ public class EditImageFn : IFunctionCallback
{ {
var state = _services.GetRequiredService<IConversationStateService>(); var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_edit_llm_provider"); 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)) if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{ {
@ -113,11 +122,6 @@ public class EditImageFn : IFunctionCallback
provider = "openai"; provider = "openai";
model = "gpt-image-1"; 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); return (provider, model);
} }

View file

@ -83,6 +83,7 @@ public class GenerateImageFn : IFunctionCallback
{ {
var state = _services.GetRequiredService<IConversationStateService>(); var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_generate_llm_provider"); var provider = state.GetState("image_generate_llm_provider");
var model = state.GetState("image_generate_llm_model"); var model = state.GetState("image_generate_llm_model");
@ -92,14 +93,17 @@ public class GenerateImageFn : IFunctionCallback
return (provider, model); 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"; provider = "openai";
model = "gpt-image-1"; 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); return (provider, model);
} }

View file

@ -1,4 +1,3 @@
using BotSharp.Abstraction.MLTasks.Settings;
using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Routing;
namespace BotSharp.Plugin.FileHandler.Functions; namespace BotSharp.Plugin.FileHandler.Functions;
@ -100,6 +99,7 @@ public class ReadImageFn : IFunctionCallback
try try
{ {
var (provider, model) = GetLlmProviderModel(); var (provider, model) = GetLlmProviderModel();
SetImageDetailLevel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model); var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs); var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content; return response.Content;
@ -116,6 +116,7 @@ public class ReadImageFn : IFunctionCallback
{ {
var state = _services.GetRequiredService<IConversationStateService>(); var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_read_llm_provider"); var provider = state.GetState("image_read_llm_provider");
var model = state.GetState("image_read_llm_model"); var model = state.GetState("image_read_llm_model");
@ -125,14 +126,31 @@ public class ReadImageFn : IFunctionCallback
return (provider, model); 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"; provider = "openai";
model = "gpt-5-mini"; 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); 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 try
{ {
var (provider, model) = GetLlmProviderModel(); var (provider, model) = GetLlmProviderModel();
SetImageDetailLevel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model); var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs); var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content; return response.Content;
@ -106,9 +107,18 @@ public class ReadPdfFn : IFunctionCallback
{ {
var state = _services.GetRequiredService<IConversationStateService>(); var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var fileSettings = _services.GetRequiredService<FileHandlerSettings>();
var provider = state.GetState("image_read_llm_provider"); var provider = state.GetState("pdf_read_llm_provider");
var model = state.GetState("image_read_llm_model"); 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)) if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{ {
@ -118,11 +128,20 @@ public class ReadPdfFn : IFunctionCallback
provider = "openai"; provider = "openai";
model = "gpt-5-mini"; 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); 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 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(); 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) foreach (var message in filteredMessages)
{ {
if (message.Role == AgentRole.Function) if (message.Role == AgentRole.Function)
@ -508,8 +508,8 @@ public class ChatCompletionProvider : IChatCompletion
{ {
temperature = settings.Reasoning.Temperature; temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level") var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel ?? string.Empty) .IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel ?? string.Empty); .IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level); reasoningEffortLevel = ParseReasoningEffortLevel(level);
} }
@ -561,13 +561,7 @@ public class ChatCompletionProvider : IChatCompletion
return effortLevel; return effortLevel;
} }
private ChatImageDetailLevel ParseChatImageDetailLevel(string? level)
private ChatImageDetailLevel GetChatImageDetailLevel(string level)
{
return ParseChatImageDetailLevel(level);
}
private ChatImageDetailLevel ParseChatImageDetailLevel(string level)
{ {
if (string.IsNullOrWhiteSpace(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": { "TencentCos": {
"AppId": "", "AppId": "",
"SecretId": "", "SecretId": "",