refine llm config

This commit is contained in:
Jicheng Lu 2025-10-10 11:39:45 -05:00
parent 042516b17d
commit dc2e3028ec
15 changed files with 154 additions and 208 deletions

View file

@ -41,4 +41,49 @@ public class AgentLlmConfig
[JsonPropertyName("reasoning_effort_level")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? ReasoningEffortLevel { get; set; }
/// <summary>
/// Image generation config
/// </summary>
[JsonPropertyName("image_generation")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public LlmImageGenerationConfig? ImageGeneration { get; set; }
/// <summary>
/// Image edit config
/// </summary>
[JsonPropertyName("image_edit")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public LlmImageEditConfig? ImageEdit { get; set; }
/// <summary>
/// Audio transcription config
/// </summary>
[JsonPropertyName("audio_transcription")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public LlmAudioTranscriptionConfig? AudioTranscription { get; set; }
/// <summary>
/// Realtime config
/// </summary>
[JsonPropertyName("realtime")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public LlmRealtimeConfig? Realtime { get; set; }
}
public class LlmImageGenerationConfig : LlmProviderModel
{
}
public class LlmImageEditConfig : LlmProviderModel
{
}
public class LlmRealtimeConfig : LlmProviderModel
{
}
public class LlmAudioTranscriptionConfig : LlmProviderModel
{
}

View file

@ -1,6 +1,6 @@
namespace BotSharp.Abstraction.Models;
public class LlmConfigBase : LlmBase
public class LlmConfigBase : LlmProviderModel
{
/// <summary>
/// Llm maximum output tokens
@ -13,15 +13,13 @@ public class LlmConfigBase : LlmBase
public string? ReasoningEffortLevel { get; set; }
}
public class LlmBase
public class LlmProviderModel
{
/// <summary>
/// Llm provider
/// </summary>
public string? LlmProvider { get; set; }
[JsonPropertyName("provider")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? Provider { get; set; }
/// <summary>
/// Llm model
/// </summary>
public string? LlmModel { get; set; }
[JsonPropertyName("model")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? Model { get; set; }
}

View file

@ -153,8 +153,8 @@ public partial class FileInstructService
// Get ai response
var provider = options.LlmProvider ?? "openai";
var model = options?.LlmModel ?? "gpt-5-mini";
var provider = options.Provider ?? "openai";
var model = options?.Model ?? "gpt-5-mini";
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
var response = await completion.GetChatCompletions(agent, innerDialogs);

View file

@ -34,9 +34,12 @@ public class ReadAudioFn : IFunctionCallback
public async Task<bool> Execute(RoleDialogModel message)
{
var args = JsonSerializer.Deserialize<LlmContextIn>(message.FunctionArgs, _options.JsonSerializerOptions);
var agentService = _services.GetRequiredService<IAgentService>();
var conv = _services.GetRequiredService<IConversationService>();
var routingCtx = _services.GetRequiredService<IRoutingContext>();
var agent = await agentService.GetAgent(message.CurrentAgentId);
var wholeDialogs = routingCtx.GetDialogs();
if (wholeDialogs.IsNullOrEmpty())
{
@ -44,7 +47,7 @@ public class ReadAudioFn : IFunctionCallback
}
var dialogs = AssembleFiles(conv.ConversationId, wholeDialogs);
var response = await GetAudioTranscription(dialogs);
var response = await GetAudioTranscription(agent, dialogs);
message.Content = response;
dialogs.ForEach(x => x.Files = null);
return true;
@ -54,7 +57,7 @@ public class ReadAudioFn : IFunctionCallback
{
if (dialogs.IsNullOrEmpty())
{
return new List<RoleDialogModel>();
return [];
}
var messageId = dialogs.Select(x => x.MessageId).Distinct().ToList();
@ -85,13 +88,13 @@ public class ReadAudioFn : IFunctionCallback
return dialogs;
}
private async Task<string> GetAudioTranscription(List<RoleDialogModel> dialogs)
private async Task<string> GetAudioTranscription(Agent agent, List<RoleDialogModel> dialogs)
{
var audioCompletion = PrepareModel();
var audioCompletion = PrepareModel(agent);
var dialog = dialogs.Where(x => !x.Files.IsNullOrEmpty()).LastOrDefault();
var transcripts = new List<string>();
if (dialog != null)
if (dialog?.Files != null)
{
foreach (var file in dialog.Files)
{
@ -129,9 +132,9 @@ public class ReadAudioFn : IFunctionCallback
return string.Join("\r\n\r\n", transcripts);
}
private IAudioTranscription PrepareModel()
private IAudioTranscription PrepareModel(Agent agent)
{
var (provider, model) = GetLlmProviderModel();
var (provider, model) = GetLlmProviderModel(agent);
return CompletionProvider.GetAudioTranscriber(_services, provider: provider, model: model);
}
@ -142,21 +145,18 @@ public class ReadAudioFn : IFunctionCallback
|| !string.IsNullOrEmpty(FileUtility.GetFileContentType(fileName));
}
private (string, string) GetLlmProviderModel()
private (string, string) GetLlmProviderModel(Agent agent)
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("audio_read_llm_provider");
var model = state.GetState("audio_read_llm_provider");
var provider = agent?.LlmConfig?.AudioTranscription?.Provider;
var model = agent?.LlmConfig?.AudioTranscription?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = _settings?.Audio?.Reading?.LlmProvider;
model = _settings?.Audio?.Reading?.LlmModel;
provider = _settings?.Audio?.Reading?.Provider;
model = _settings?.Audio?.Reading?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{

View file

@ -13,7 +13,7 @@ public class AudioSettings
public AudioReadSettings? Reading { get; set; }
}
public class AudioReadSettings : LlmBase
public class AudioReadSettings : LlmProviderModel
{
}
#endregion

View file

@ -12,7 +12,6 @@ public class PlotChartFn : IFunctionCallback
public string Name => "util-chart-plot_chart";
public string Indication => "Plotting chart";
public PlotChartFn(
IServiceProvider services,
ILogger<PlotChartFn> logger,
@ -35,8 +34,8 @@ public class PlotChartFn : IFunctionCallback
var inst = GetChartPlotInstruction(message.CurrentAgentId);
var innerAgent = new Agent
{
Id = agent.Id,
Name = agent.Name,
Id = agent?.Id ?? BuiltInAgentId.AIProgrammer,
Name = agent?.Name ?? "AI Programmer",
Instruction = inst,
LlmConfig = GetLlmConfig(),
TemplateDict = new Dictionary<string, object>
@ -132,16 +131,16 @@ public class PlotChartFn : IFunctionCallback
private (string, string) GetLlmProviderModel()
{
var provider = "openai";
var model = "gpt-5";
var provider = _settings.ChartPlot?.Provider;
var model = _settings.ChartPlot?.Model;
var state = _services.GetRequiredService<IConversationStateService>();
provider = state.GetState("chart_plot_llm_provider")
.IfNullOrEmptyAs(_settings.ChartPlot?.LlmProvider)
.IfNullOrEmptyAs(provider);
model = state.GetState("chart_plot_llm_model")
.IfNullOrEmptyAs(_settings.ChartPlot?.LlmModel)
.IfNullOrEmptyAs(model);
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-5";
return (provider, model);
}
@ -151,10 +150,6 @@ public class PlotChartFn : IFunctionCallback
var maxOutputTokens = _settings?.ChartPlot?.MaxOutputTokens ?? 8192;
var reasoningEffortLevel = _settings?.ChartPlot?.ReasoningEffortLevel ?? "minimal";
var state = _services.GetRequiredService<IConversationStateService>();
maxOutputTokens = int.TryParse(state.GetState("chart_plot_max_output_tokens"), out var tokens) ? tokens : maxOutputTokens;
reasoningEffortLevel = state.GetState("chart_plot_reasoning_effort_level").IfNullOrEmptyAs(reasoningEffortLevel);
return new AgentLlmConfig
{
MaxOutputTokens = maxOutputTokens,

View file

@ -76,8 +76,8 @@ public class HandleEmailSenderFn : IFunctionCallback
IsIncludeBotFiles = true,
IsAttachFiles = true,
MessageLimit = convSettings?.FileSelect?.MessageLimit,
LlmProvider = convSettings?.FileSelect?.LlmProvider,
LlmModel = convSettings?.FileSelect?.LlmModel,
Provider = convSettings?.FileSelect?.Provider,
Model = convSettings?.FileSelect?.Model,
MaxOutputTokens = convSettings?.FileSelect?.MaxOutputTokens,
ReasoningEffortLevel = convSettings?.FileSelect?.ReasoningEffortLevel
});

View file

@ -29,20 +29,15 @@ public class ReadPdfFn : IFunctionCallback
public async Task<bool> Execute(RoleDialogModel message)
{
var args = JsonSerializer.Deserialize<LlmContextIn>(message.FunctionArgs);
var agentService = _services.GetRequiredService<IAgentService>();
var conv = _services.GetRequiredService<IConversationService>();
var routingCtx = _services.GetRequiredService<IRoutingContext>();
var agentService = _services.GetRequiredService<IAgentService>();
Agent? fromAgent = null;
if (!string.IsNullOrEmpty(message.CurrentAgentId))
{
fromAgent = await agentService.GetAgent(message.CurrentAgentId);
}
var fromAgent = await agentService.GetAgent(message.CurrentAgentId);
var agent = new Agent
{
Id = fromAgent?.Id ?? BuiltInAgentId.UtilityAssistant,
Name = fromAgent?.Name ?? "Utility Assistant",
Id = fromAgent?.Id ?? BuiltInAgentId.FileAssistant,
Name = fromAgent?.Name ?? "File Assistant",
Instruction = fromAgent?.Instruction ?? args?.UserRequest ?? "Please describe the pdf file(s).",
LlmConfig = fromAgent?.LlmConfig ?? new()
};
@ -140,27 +135,16 @@ public class ReadPdfFn : IFunctionCallback
private (string, string) GetLlmProviderModel()
{
var state = _services.GetRequiredService<IConversationStateService>();
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
var provider = state.GetState("pdf_read_llm_provider");
var model = state.GetState("pdf_read_llm_model");
var provider = _settings?.Pdf?.Reading?.Provider;
var model = _settings?.Pdf?.Reading?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = _settings?.Pdf?.Reading?.LlmProvider;
model = _settings?.Pdf?.Reading?.LlmModel;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-5-mini";
provider = "google-ai";
model = "gemini-2.0-flash";
return (provider, model);
}

View file

@ -13,7 +13,7 @@ public class PdfSettings
public PdfReadSettings? Reading { get; set; }
}
public class PdfReadSettings : LlmBase
public class PdfReadSettings : LlmProviderModel
{
public bool ConvertToImage { get; set; }
public string? ImageDetailLevel { get; set; }

View file

@ -11,7 +11,6 @@ public class EditImageFn : IFunctionCallback
private readonly ILogger<EditImageFn> _logger;
private readonly ImageHandlerSettings _settings;
private Agent _agent;
private string _conversationId;
private string _messageId;
@ -29,11 +28,15 @@ public class EditImageFn : IFunctionCallback
{
var args = JsonSerializer.Deserialize<LlmContextIn>(message.FunctionArgs);
var descrpition = args?.UserRequest ?? string.Empty;
var agentService = _services.GetRequiredService<IAgentService>();
var agent = await agentService.GetAgent(message.CurrentAgentId);
await Init(message);
SetImageOptions();
var image = await SelectImage(descrpition);
var response = await GetImageEditGeneration(message, descrpition, image);
var response = await GetImageEdit(agent, message, descrpition, image);
message.Content = response;
message.StopCompletion = true;
return true;
@ -41,10 +44,8 @@ public class EditImageFn : IFunctionCallback
private async Task Init(RoleDialogModel message)
{
var agentService = _services.GetRequiredService<IAgentService>();
var convService = _services.GetRequiredService<IConversationService>();
_agent = await agentService.GetAgent(message.CurrentAgentId);
_conversationId = convService.ConversationId;
_messageId = message.MessageId;
}
@ -68,15 +69,15 @@ public class EditImageFn : IFunctionCallback
IsAttachFiles = true,
ContentTypes = [MediaTypeNames.Image.Png, MediaTypeNames.Image.Jpeg],
MessageLimit = convSettings?.FileSelect?.MessageLimit,
LlmProvider = convSettings?.FileSelect?.LlmProvider,
LlmModel = convSettings?.FileSelect?.LlmModel,
Provider = convSettings?.FileSelect?.Provider,
Model = convSettings?.FileSelect?.Model,
MaxOutputTokens = convSettings?.FileSelect?.MaxOutputTokens,
ReasoningEffortLevel = convSettings?.FileSelect?.ReasoningEffortLevel
});
return selecteds?.FirstOrDefault();
}
private async Task<string> GetImageEditGeneration(RoleDialogModel message, string description, MessageFileModel? image)
private async Task<string> GetImageEdit(Agent agent, RoleDialogModel message, string description, MessageFileModel? image)
{
if (image == null)
{
@ -85,15 +86,10 @@ public class EditImageFn : IFunctionCallback
try
{
var (provider, model) = GetLlmProviderModel();
var (provider, model) = GetLlmProviderModel(agent);
var completion = CompletionProvider.GetImageCompletion(_services, provider: provider, model: model);
var text = !string.IsNullOrWhiteSpace(description) ? description : message.Content;
var dialog = RoleDialogModel.From(message, AgentRole.User, text);
var agent = new Agent
{
Id = _agent?.Id ?? BuiltInAgentId.FileAssistant,
Name = _agent?.Name ?? "File Assistant"
};
var fileStorage = _services.GetRequiredService<IFileStorageService>();
var fileBinary = fileStorage.GetFileBytes(image.FileStorageUrl);
@ -112,7 +108,7 @@ public class EditImageFn : IFunctionCallback
return response.Content;
}
return await GetImageEditResponse(description, defaultContent: null);
return await GetImageEditResponse(agent, description);
}
catch (Exception ex)
{
@ -122,45 +118,23 @@ public class EditImageFn : IFunctionCallback
}
}
private async Task<string> GetImageEditResponse(string description, string? defaultContent)
private async Task<string> GetImageEditResponse(Agent agent, string description)
{
if (defaultContent != null)
{
return defaultContent;
}
var llmConfig = _agent.LlmConfig;
var agent = new Agent
{
Id = _agent?.Id ?? BuiltInAgentId.FileAssistant,
Name = _agent?.Name ?? "File Assistant",
LlmConfig = new AgentLlmConfig
{
Provider = llmConfig?.Provider ?? "openai",
Model = llmConfig?.Model ?? "gpt-5-mini",
MaxOutputTokens = llmConfig?.MaxOutputTokens,
ReasoningEffortLevel = llmConfig?.ReasoningEffortLevel
}
};
return await AiResponseHelper.GetImageGenerationResponse(_services, agent, description);
}
private (string, string) GetLlmProviderModel()
private (string, string) GetLlmProviderModel(Agent agent)
{
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_provider");
var provider = agent?.LlmConfig?.ImageEdit?.Provider;
var model = agent?.LlmConfig?.ImageEdit?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = _settings?.Edit?.LlmProvider;
model = _settings?.Edit?.LlmModel;
provider = _settings?.Edit?.Provider;
model = _settings?.Edit?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{

View file

@ -9,7 +9,6 @@ public class GenerateImageFn : IFunctionCallback
private readonly ILogger<GenerateImageFn> _logger;
private readonly ImageHandlerSettings _settings;
private Agent _agent;
private string _conversationId;
private string _messageId;
@ -30,9 +29,9 @@ public class GenerateImageFn : IFunctionCallback
SetImageOptions();
var agentService = _services.GetRequiredService<IAgentService>();
_agent = await agentService.GetAgent(message.CurrentAgentId);
var currentAgent = await agentService.GetAgent(message.CurrentAgentId);
var response = await GetImageGeneration(message, args?.ImageDescription);
var response = await GetImageGeneration(currentAgent, message, args?.ImageDescription);
message.Content = response;
message.StopCompletion = true;
return true;
@ -53,18 +52,11 @@ public class GenerateImageFn : IFunctionCallback
state.SetState("image_response_format", "bytes");
}
private async Task<string> GetImageGeneration(RoleDialogModel message, string? description)
private async Task<string> GetImageGeneration(Agent agent, RoleDialogModel message, string? description)
{
try
{
var agent = new Agent
{
Id = _agent?.Id ?? BuiltInAgentId.FileAssistant,
Name = _agent?.Name ?? "File Assistant",
Instruction = description
};
var (provider, model) = GetLlmProviderModel();
var (provider, model) = GetLlmProviderModel(agent);
var completion = CompletionProvider.GetImageCompletion(_services, provider: provider, model: model);
var text = !string.IsNullOrWhiteSpace(description) ? description : message.Content;
var dialog = RoleDialogModel.From(message, AgentRole.User, text);
@ -76,7 +68,7 @@ public class GenerateImageFn : IFunctionCallback
return result.Content;
}
return await GetImageGenerationResponse(description, defaultContent: null);
return await GetImageGenerationResponse(agent, description);
}
catch (Exception ex)
{
@ -86,45 +78,23 @@ public class GenerateImageFn : IFunctionCallback
}
}
private async Task<string> GetImageGenerationResponse(string description, string? defaultContent)
private async Task<string> GetImageGenerationResponse(Agent agent, string description)
{
if (defaultContent != null)
{
return defaultContent;
}
var llmConfig = _agent.LlmConfig;
var agent = new Agent
{
Id = _agent?.Id ?? BuiltInAgentId.FileAssistant,
Name = _agent?.Name ?? "File Assistant",
LlmConfig = new AgentLlmConfig
{
Provider = llmConfig?.Provider ?? "openai",
Model = llmConfig?.Model ?? "gpt-5-mini",
MaxOutputTokens = llmConfig?.MaxOutputTokens,
ReasoningEffortLevel = llmConfig?.ReasoningEffortLevel
}
};
return await AiResponseHelper.GetImageGenerationResponse(_services, agent, description);
}
private (string, string) GetLlmProviderModel()
private (string, string) GetLlmProviderModel(Agent agent)
{
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");
var provider = agent?.LlmConfig?.ImageGeneration?.Provider;
var model = agent?.LlmConfig?.ImageGeneration?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = _settings?.Generation?.LlmProvider;
model = _settings?.Generation?.LlmModel;
provider = _settings?.Generation?.Provider;
model = _settings?.Generation?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{

View file

@ -30,16 +30,11 @@ public class ReadImageFn : IFunctionCallback
public async Task<bool> Execute(RoleDialogModel message)
{
var args = JsonSerializer.Deserialize<LlmContextIn>(message.FunctionArgs);
var agentService = _services.GetRequiredService<IAgentService>();
var conv = _services.GetRequiredService<IConversationService>();
var routingCtx = _services.GetRequiredService<IRoutingContext>();
var agentService = _services.GetRequiredService<IAgentService>();
Agent? fromAgent = null;
if (!string.IsNullOrEmpty(message.CurrentAgentId))
{
fromAgent = await agentService.GetAgent(message.CurrentAgentId);
}
var fromAgent = await agentService.GetAgent(message.CurrentAgentId);
var agent = new Agent
{
Id = fromAgent?.Id ?? BuiltInAgentId.FileAssistant,
@ -133,19 +128,8 @@ public class ReadImageFn : IFunctionCallback
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 = _settings?.Reading?.LlmProvider;
model = _settings?.Reading?.LlmModel;
var provider = _settings?.Reading?.Provider;
var model = _settings?.Reading?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{

View file

@ -9,17 +9,17 @@ public class ImageHandlerSettings
public ImageEditSettings? Edit { get; set; }
}
public class ImageReadSettings : LlmBase
public class ImageReadSettings : LlmProviderModel
{
public string? ImageDetailLevel { get; set; }
}
public class ImageGenerationSettings : LlmBase
public class ImageGenerationSettings : LlmProviderModel
{
}
public class ImageEditSettings : LlmBase
public class ImageEditSettings : LlmProviderModel
{
public SettingBase? ImageConverter { get; set; }
}

View file

@ -186,16 +186,16 @@ public class PyProgrammerFn : IFunctionCallback
private (string, string) GetLlmProviderModel()
{
var provider = "openai";
var model = "gpt-5";
var provider = _settings.CodeGeneration?.Provider;
var model = _settings.CodeGeneration?.Model;
var state = _services.GetRequiredService<IConversationStateService>();
provider = state.GetState("py_intepreter_llm_provider")
.IfNullOrEmptyAs(_settings.CodeGeneration?.LlmProvider)
.IfNullOrEmptyAs(provider);
model = state.GetState("py_intepreter_llm_model")
.IfNullOrEmptyAs(_settings.CodeGeneration?.LlmModel)
.IfNullOrEmptyAs(model);
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-5";
return (provider, model);
}
@ -205,10 +205,6 @@ public class PyProgrammerFn : IFunctionCallback
var maxOutputTokens = _settings?.CodeGeneration?.MaxOutputTokens ?? 8192;
var reasoningEffortLevel = _settings?.CodeGeneration?.ReasoningEffortLevel ?? "minimal";
var state = _services.GetRequiredService<IConversationStateService>();
maxOutputTokens = int.TryParse(state.GetState("py_intepreter_max_output_tokens"), out var tokens) ? tokens : maxOutputTokens;
reasoningEffortLevel = state.GetState("py_intepreter_reasoning_effort_level").IfNullOrEmptyAs(reasoningEffortLevel);
return new AgentLlmConfig
{
MaxOutputTokens = maxOutputTokens,

View file

@ -301,8 +301,8 @@
"MinTimeSecondsBetweenMessages": 2
},
"FileSelect": {
"LlmProvider": "openai",
"LlmModel": "gpt-5-mini",
"Provider": "openai",
"Model": "gpt-5-mini",
"MaxOutputTokens": 8192,
"ReasoningEffortLevel": "low",
"MessageLimit": 50
@ -433,8 +433,8 @@
"FileHandler": {
"Pdf": {
"Reading": {
"LlmProvider": "google-ai",
"LlmModel": "gemini-2.0-flash",
"Provider": "google-ai",
"Model": "gemini-2.0-flash",
"ConvertToImage": false,
"ImageDetailLevel": "auto",
"ImageConverter": {
@ -446,17 +446,17 @@
"ImageHandler": {
"Reading": {
"LlmProvider": "openai",
"LlmModel": "gpt-5-mini",
"Provider": "openai",
"Model": "gpt-5-mini",
"ImageDetailLevel": "auto"
},
"Generation": {
"LlmProvider": "openai",
"LlmModel": "gpt-image-1"
"Provider": "openai",
"Model": "gpt-image-1"
},
"Edit": {
"LlmProvider": "openai",
"LlmModel": "gpt-image-1",
"Provider": "openai",
"Model": "gpt-image-1",
"ImageConverter": {
"Provider": "image-handler"
}
@ -466,8 +466,8 @@
"AudioHandler": {
"Audio": {
"Reading": {
"LlmProvider": "openai",
"LlmModel": "gpt-4o-mini-transcribe"
"Provider": "openai",
"Model": "gpt-4o-mini-transcribe"
}
}
},
@ -486,8 +486,8 @@
"ChartHandler": {
"ChartPlot": {
"LlmProvider": "openai",
"LlmModel": "gpt-5",
"Provider": "openai",
"Model": "gpt-5",
"MaxOutputTokens": 8192,
"ReasoningEffortLevel": "minimal",
"MessageLimit": 50
@ -570,8 +570,8 @@
"InstallLocation": "C:/Users/xxx/AppData/Local/Programs/Python/Python313/python313.dll",
"PythonVersion": "3.13.3",
"CodeGeneration": {
"LlmProvider": "openai",
"LlmModel": "gpt-5",
"Provider": "openai",
"Model": "gpt-5",
"MaxOutputTokens": 8192,
"ReasoningEffortLevel": "minimal",
"MessageLimit": 50