refine setting

This commit is contained in:
Jicheng Lu 2025-09-04 14:38:43 -05:00
parent d1118a691c
commit 939e9cfd4e
7 changed files with 134 additions and 21 deletions

View file

@ -99,15 +99,21 @@ public class WebSearchSetting
} }
#endregion #endregion
#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 bool IsDefault { get; set; }

View file

@ -68,10 +68,20 @@ public class WebIntelligentSearchFn : IFunctionCallback
private (string, string) GetLlmProviderModel() private (string, string) GetLlmProviderModel()
{ {
var provider = "openai"; var state = _services.GetRequiredService<IConversationStateService>();
var model = "gpt-4o-mini-search-preview";
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("web_search_llm_provider");
var model = state.GetState("web_search_llm_model");
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-4o-mini-search-preview";
var models = llmProviderService.GetProviderModels(provider); var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.WebSearch?.IsDefault == true) var foundModel = models.FirstOrDefault(x => x.WebSearch?.IsDefault == true)
?? models.FirstOrDefault(x => x.WebSearch != null); ?? models.FirstOrDefault(x => x.WebSearch != null);

View file

@ -99,10 +99,20 @@ public class EditImageFn : IFunctionCallback
private (string, string) GetLlmProviderModel() private (string, string) GetLlmProviderModel()
{ {
var provider = "openai"; var state = _services.GetRequiredService<IConversationStateService>();
var model = "gpt-image-1";
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("image_edit_llm_provider");
var model = state.GetState("image_edit_llm_model");
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-image-1";
var models = llmProviderService.GetProviderModels(provider); var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Edit?.IsDefault == true) var foundModel = models.FirstOrDefault(x => x.Image?.Edit?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Edit != null); ?? models.FirstOrDefault(x => x.Image?.Edit != null);

View file

@ -36,8 +36,7 @@ public class GenerateImageFn : IFunctionCallback
{ {
Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant, Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant,
Name = fromAgent?.Name ?? "Utility Assistant", Name = fromAgent?.Name ?? "Utility Assistant",
Instruction = args?.ImageDescription, Instruction = args?.ImageDescription
TemplateDict = new Dictionary<string, object>()
}; };
var response = await GetImageGeneration(agent, message, args?.ImageDescription); var response = await GetImageGeneration(agent, message, args?.ImageDescription);
@ -82,10 +81,20 @@ public class GenerateImageFn : IFunctionCallback
private (string, string) GetLlmProviderModel() private (string, string) GetLlmProviderModel()
{ {
var provider = "openai"; var state = _services.GetRequiredService<IConversationStateService>();
var model = "gpt-image-1";
var llmProviderService = _services.GetRequiredService<ILlmProviderService>(); var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("image_generate_llm_provider");
var model = state.GetState("image_generate_llm_model");
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-image-1";
var models = llmProviderService.GetProviderModels(provider); var models = llmProviderService.GetProviderModels(provider);
var foundModel = models.FirstOrDefault(x => x.Image?.Generation?.IsDefault == true) var foundModel = models.FirstOrDefault(x => x.Image?.Generation?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Generation != null); ?? models.FirstOrDefault(x => x.Image?.Generation != null);

View file

@ -1,3 +1,4 @@
using BotSharp.Abstraction.MLTasks.Settings;
using BotSharp.Abstraction.Routing; using BotSharp.Abstraction.Routing;
namespace BotSharp.Plugin.FileHandler.Functions; namespace BotSharp.Plugin.FileHandler.Functions;
@ -36,7 +37,7 @@ public class ReadImageFn : IFunctionCallback
Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant, Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant,
Name = fromAgent?.Name ?? "Utility Assistant", Name = fromAgent?.Name ?? "Utility Assistant",
Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the image(s).", Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the image(s).",
TemplateDict = new Dictionary<string, object>() LlmConfig = fromAgent?.LlmConfig ?? new()
}; };
var wholeDialogs = routingCtx.GetDialogs(); var wholeDialogs = routingCtx.GetDialogs();
@ -98,8 +99,7 @@ public class ReadImageFn : IFunctionCallback
{ {
try try
{ {
var provider = "openai"; var (provider, model) = GetLlmProviderModel();
var model = "gpt-5-mini";
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;
@ -111,4 +111,28 @@ public class ReadImageFn : IFunctionCallback
return error; return error;
} }
} }
private (string, string) GetLlmProviderModel()
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("image_read_llm_provider");
var model = state.GetState("image_read_llm_model");
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);
}
} }

View file

@ -41,7 +41,7 @@ public class ReadPdfFn : IFunctionCallback
Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant, Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant,
Name = fromAgent?.Name ?? "Utility Assistant", Name = fromAgent?.Name ?? "Utility Assistant",
Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the pdf file(s).", Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the pdf file(s).",
TemplateDict = new Dictionary<string, object>() LlmConfig = fromAgent?.LlmConfig ?? new()
}; };
var wholeDialogs = routingCtx.GetDialogs(); var wholeDialogs = routingCtx.GetDialogs();
@ -89,8 +89,7 @@ public class ReadPdfFn : IFunctionCallback
{ {
try try
{ {
var provider = "openai"; var (provider, model) = GetLlmProviderModel();
var model = "gpt-5-mini";
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;
@ -102,4 +101,28 @@ public class ReadPdfFn : IFunctionCallback
return error; return error;
} }
} }
private (string, string) GetLlmProviderModel()
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("image_read_llm_provider");
var model = state.GetState("image_read_llm_model");
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);
}
} }

View file

@ -320,6 +320,7 @@ public class ChatCompletionProvider : IChatCompletion
protected (string, IEnumerable<ChatMessage>, ChatCompletionOptions) PrepareOptions(Agent agent, List<RoleDialogModel> conversations) protected (string, IEnumerable<ChatMessage>, ChatCompletionOptions) PrepareOptions(Agent agent, List<RoleDialogModel> conversations)
{ {
var agentService = _services.GetRequiredService<IAgentService>(); var agentService = _services.GetRequiredService<IAgentService>();
var state = _services.GetRequiredService<IConversationStateService>();
var fileStorage = _services.GetRequiredService<IFileStorageService>(); var fileStorage = _services.GetRequiredService<IFileStorageService>();
var settingsService = _services.GetRequiredService<ILlmProviderService>(); var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model); var settings = settingsService.GetSetting(Provider, _model);
@ -371,6 +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"));
foreach (var message in filteredMessages) foreach (var message in filteredMessages)
{ {
if (message.Role == AgentRole.Function) if (message.Role == AgentRole.Function)
@ -395,20 +397,20 @@ public class ChatCompletionProvider : IChatCompletion
if (!string.IsNullOrEmpty(file.FileData)) if (!string.IsNullOrEmpty(file.FileData))
{ {
var (contentType, binary) = FileUtility.GetFileInfoFromData(file.FileData); var (contentType, binary) = FileUtility.GetFileInfoFromData(file.FileData);
var contentPart = ChatMessageContentPart.CreateImagePart(binary, contentType.IfNullOrEmptyAs(file.ContentType), ChatImageDetailLevel.Auto); var contentPart = ChatMessageContentPart.CreateImagePart(binary, contentType.IfNullOrEmptyAs(file.ContentType), imageDetailLevel);
contentParts.Add(contentPart); contentParts.Add(contentPart);
} }
else if (!string.IsNullOrEmpty(file.FileStorageUrl)) else if (!string.IsNullOrEmpty(file.FileStorageUrl))
{ {
var contentType = FileUtility.GetFileContentType(file.FileStorageUrl); var contentType = FileUtility.GetFileContentType(file.FileStorageUrl);
var binary = fileStorage.GetFileBytes(file.FileStorageUrl); var binary = fileStorage.GetFileBytes(file.FileStorageUrl);
var contentPart = ChatMessageContentPart.CreateImagePart(binary, contentType.IfNullOrEmptyAs(file.ContentType), ChatImageDetailLevel.Auto); var contentPart = ChatMessageContentPart.CreateImagePart(binary, contentType.IfNullOrEmptyAs(file.ContentType), imageDetailLevel);
contentParts.Add(contentPart); contentParts.Add(contentPart);
} }
else if (!string.IsNullOrEmpty(file.FileUrl)) else if (!string.IsNullOrEmpty(file.FileUrl))
{ {
var uri = new Uri(file.FileUrl); var uri = new Uri(file.FileUrl);
var contentPart = ChatMessageContentPart.CreateImagePart(uri, ChatImageDetailLevel.Auto); var contentPart = ChatMessageContentPart.CreateImagePart(uri, imageDetailLevel);
contentParts.Add(contentPart); contentParts.Add(contentPart);
} }
} }
@ -559,6 +561,35 @@ public class ChatCompletionProvider : IChatCompletion
return effortLevel; return effortLevel;
} }
private ChatImageDetailLevel GetChatImageDetailLevel(string level)
{
return ParseChatImageDetailLevel(level);
}
private ChatImageDetailLevel ParseChatImageDetailLevel(string level)
{
if (string.IsNullOrWhiteSpace(level))
{
return ChatImageDetailLevel.Auto;
}
var imageLevel = ChatImageDetailLevel.Auto;
switch (level.ToLower())
{
case "low":
imageLevel = ChatImageDetailLevel.Low;
break;
case "high":
imageLevel = ChatImageDetailLevel.High;
break;
default:
break;
}
return imageLevel;
}
public void SetModelName(string model) public void SetModelName(string model)
{ {
_model = model; _model = model;