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
#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; }

View file

@ -68,10 +68,20 @@ public class WebIntelligentSearchFn : IFunctionCallback
private (string, string) GetLlmProviderModel()
{
var provider = "openai";
var model = "gpt-4o-mini-search-preview";
var state = _services.GetRequiredService<IConversationStateService>();
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 foundModel = models.FirstOrDefault(x => x.WebSearch?.IsDefault == true)
?? models.FirstOrDefault(x => x.WebSearch != null);

View file

@ -99,10 +99,20 @@ public class EditImageFn : IFunctionCallback
private (string, string) GetLlmProviderModel()
{
var provider = "openai";
var model = "gpt-image-1";
var state = _services.GetRequiredService<IConversationStateService>();
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 foundModel = models.FirstOrDefault(x => x.Image?.Edit?.IsDefault == true)
?? models.FirstOrDefault(x => x.Image?.Edit != null);

View file

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

View file

@ -1,3 +1,4 @@
using BotSharp.Abstraction.MLTasks.Settings;
using BotSharp.Abstraction.Routing;
namespace BotSharp.Plugin.FileHandler.Functions;
@ -36,7 +37,7 @@ public class ReadImageFn : IFunctionCallback
Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant,
Name = fromAgent?.Name ?? "Utility Assistant",
Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the image(s).",
TemplateDict = new Dictionary<string, object>()
LlmConfig = fromAgent?.LlmConfig ?? new()
};
var wholeDialogs = routingCtx.GetDialogs();
@ -98,8 +99,7 @@ public class ReadImageFn : IFunctionCallback
{
try
{
var provider = "openai";
var model = "gpt-5-mini";
var (provider, model) = GetLlmProviderModel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content;
@ -111,4 +111,28 @@ public class ReadImageFn : IFunctionCallback
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,
Name = fromAgent?.Name ?? "Utility Assistant",
Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the pdf file(s).",
TemplateDict = new Dictionary<string, object>()
LlmConfig = fromAgent?.LlmConfig ?? new()
};
var wholeDialogs = routingCtx.GetDialogs();
@ -89,8 +89,7 @@ public class ReadPdfFn : IFunctionCallback
{
try
{
var provider = "openai";
var model = "gpt-5-mini";
var (provider, model) = GetLlmProviderModel();
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, dialogs);
return response.Content;
@ -102,4 +101,28 @@ public class ReadPdfFn : IFunctionCallback
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)
{
var agentService = _services.GetRequiredService<IAgentService>();
var state = _services.GetRequiredService<IConversationStateService>();
var fileStorage = _services.GetRequiredService<IFileStorageService>();
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);
@ -371,6 +372,7 @@ public class ChatCompletionProvider : IChatCompletion
filteredMessages = filteredMessages.Where((_, idx) => idx >= firstUserMsgIdx).ToList();
}
var imageDetailLevel = GetChatImageDetailLevel(state.GetState("chat_image_detail_level"));
foreach (var message in filteredMessages)
{
if (message.Role == AgentRole.Function)
@ -395,20 +397,20 @@ public class ChatCompletionProvider : IChatCompletion
if (!string.IsNullOrEmpty(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);
}
else if (!string.IsNullOrEmpty(file.FileStorageUrl))
{
var contentType = FileUtility.GetFileContentType(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);
}
else if (!string.IsNullOrEmpty(file.FileUrl))
{
var uri = new Uri(file.FileUrl);
var contentPart = ChatMessageContentPart.CreateImagePart(uri, ChatImageDetailLevel.Auto);
var contentPart = ChatMessageContentPart.CreateImagePart(uri, imageDetailLevel);
contentParts.Add(contentPart);
}
}
@ -559,6 +561,35 @@ public class ChatCompletionProvider : IChatCompletion
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)
{
_model = model;