refine image model settings

This commit is contained in:
Jicheng Lu 2025-08-19 15:43:45 -05:00
parent 62e82afb81
commit 2bf4210485
6 changed files with 151 additions and 36 deletions

View file

@ -57,6 +57,11 @@ public class LlmModelSetting
/// </summary>
public WebSearchSetting? WebSearch { get; set; }
/// <summary>
/// Settings for images
/// </summary>
public ImageSetting? Image { get; set; }
/// <summary>
/// Settings for llm cost
/// </summary>
@ -79,6 +84,41 @@ public class WebSearchSetting
public string? SearchContextSize { get; set; }
}
public class ImageSetting
{
public ImageGenerationSetting? Generation { get; set; }
public ImageEditSetting? Edit { get; set; }
public ImageVariationSetting? Variation { get; set; }
}
public class ImageGenerationSetting
{
public ModelSettingBase? Style { get; set; }
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? Quality { get; set; }
public ModelSettingBase? ResponseFormat { get; set; }
}
public class ImageEditSetting
{
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? ResponseFormat { get; set; }
}
public class ImageVariationSetting
{
public ModelSettingBase? Size { get; set; }
public ModelSettingBase? ResponseFormat { get; set; }
}
public class ModelSettingBase
{
public string? Default { get; set; }
public IEnumerable<string>? Options { get; set; }
}
/// <summary>
/// Cost per 1K tokens
/// </summary>

View file

@ -50,8 +50,8 @@ public class GenerateImageFn : IFunctionCallback
private void SetImageOptions()
{
var state = _services.GetRequiredService<IConversationStateService>();
state.SetState("image_response_format", "bytes");
state.SetState("image_count", "1");
state.SetState("image_quality", "medium");
}
private async Task<string> GetImageGeneration(Agent agent, RoleDialogModel message, string? description)

View file

@ -51,16 +51,27 @@ public partial class ImageCompletionProvider
{
var prompt = message?.Payload ?? message?.Content ?? string.Empty;
var state = _services.GetRequiredService<IConversationStateService>();
var size = GetImageSize(state.GetState("image_size"));
var format = GetImageFormat(state.GetState("image_response_format"));
var count = GetImageCount(state.GetState("image_count", "1"));
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Edit;
var options = new ImageEditOptions
var state = _services.GetRequiredService<IConversationStateService>();
var size = state.GetState("image_size");
var responseFormat = state.GetState("image_response_format");
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
var options = new ImageEditOptions();
if (!string.IsNullOrEmpty(size))
{
Size = size,
ResponseFormat = format
};
options.Size = GetImageSize(size);
}
if (!string.IsNullOrEmpty(responseFormat))
{
options.ResponseFormat = GetImageResponseFormat(responseFormat);
}
var count = GetImageCount(state.GetState("image_count", "1"));
return (prompt, count, options);
}
}

View file

@ -29,18 +29,39 @@ public partial class ImageCompletionProvider
{
var prompt = message?.Payload ?? message?.Content ?? string.Empty;
var state = _services.GetRequiredService<IConversationStateService>();
var size = GetImageSize(state.GetState("image_size"));
var quality = GetImageQuality(state.GetState("image_quality"));
var style = GetImageStyle(state.GetState("image_style"));
var format = GetImageFormat(state.GetState("image_response_format"));
var count = GetImageCount(state.GetState("image_count", "1"));
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Generation;
var options = new ImageGenerationOptions
var state = _services.GetRequiredService<IConversationStateService>();
var size = state.GetState("image_size");
var quality = state.GetState("image_quality");
var style = state.GetState("image_style");
var responseFormat = state.GetState("image_response_format");
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
quality = settings?.Quality != null ? VerifyImageParameter(quality, settings.Quality.Default, settings.Quality.Options) : null;
style = settings?.Style != null ? VerifyImageParameter(style, settings.Style.Default, settings.Style.Options) : null;
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
var options = new ImageGenerationOptions();
if (!string.IsNullOrEmpty(size))
{
Quality = new GeneratedImageQuality("medium"),
Size = GeneratedImageSize.W1024xH1024
};
options.Size = GetImageSize(size);
}
if (!string.IsNullOrEmpty(quality))
{
options.Quality = GetImageQuality(quality);
}
if (!string.IsNullOrEmpty(style))
{
options.Style = GetImageStyle(style);
}
if (!string.IsNullOrEmpty(responseFormat))
{
options.ResponseFormat = GetImageResponseFormat(responseFormat);
}
var count = GetImageCount(state.GetState("image_count", "1"));
return (prompt, count, options);
}
}

View file

@ -27,16 +27,27 @@ public partial class ImageCompletionProvider
private (int, ImageVariationOptions) PrepareVariationOptions()
{
var state = _services.GetRequiredService<IConversationStateService>();
var size = GetImageSize(state.GetState("image_size"));
var format = GetImageFormat(state.GetState("image_response_format"));
var count = GetImageCount(state.GetState("image_count", "1"));
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Variation;
var options = new ImageVariationOptions
var state = _services.GetRequiredService<IConversationStateService>();
var size = state.GetState("image_size");
var responseFormat = state.GetState("image_response_format");
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
var options = new ImageVariationOptions();
if (!string.IsNullOrEmpty(size))
{
Size = size,
ResponseFormat = format
};
options.Size = GetImageSize(size);
}
if (!string.IsNullOrEmpty(responseFormat))
{
options.ResponseFormat = GetImageResponseFormat(responseFormat);
}
var count = GetImageCount(state.GetState("image_count", "1"));
return (count, options);
}
}

View file

@ -1,3 +1,4 @@
#pragma warning disable OPENAI001
using OpenAI.Images;
namespace BotSharp.Plugin.OpenAI.Providers.Image;
@ -60,9 +61,9 @@ public partial class ImageCompletionProvider : IImageCompletion
return generatedImages;
}
private GeneratedImageSize GetImageSize(string size)
private GeneratedImageSize GetImageSize(string? size)
{
var value = !string.IsNullOrEmpty(size) ? size : "1024x1024";
var value = !string.IsNullOrEmpty(size) ? size : "auto";
GeneratedImageSize retSize;
switch (value)
@ -79,33 +80,54 @@ public partial class ImageCompletionProvider : IImageCompletion
case "1792x1024":
retSize = GeneratedImageSize.W1792xH1024;
break;
default:
case "1024x1024":
retSize = GeneratedImageSize.W1024xH1024;
break;
case "1024x1536":
retSize = GeneratedImageSize.W1024xH1536;
break;
case "1536x1024":
retSize = GeneratedImageSize.W1536xH1024;
break;
default:
retSize = GeneratedImageSize.Auto;
break;
}
return retSize;
}
private GeneratedImageQuality GetImageQuality(string quality)
private GeneratedImageQuality GetImageQuality(string? quality)
{
var value = !string.IsNullOrEmpty(quality) ? quality : "standard";
var value = !string.IsNullOrEmpty(quality) ? quality : "auto";
GeneratedImageQuality retQuality;
switch (value)
{
case "hd":
case "low":
retQuality = GeneratedImageQuality.Low;
break;
case "medium":
retQuality = GeneratedImageQuality.Medium;
break;
case "high":
retQuality = GeneratedImageQuality.High;
break;
default:
case "standard":
retQuality = GeneratedImageQuality.Standard;
break;
case "hd":
retQuality = new GeneratedImageQuality("hd");
break;
default:
retQuality = GeneratedImageQuality.Auto;
break;
}
return retQuality;
}
private GeneratedImageStyle GetImageStyle(string style)
private GeneratedImageStyle GetImageStyle(string? style)
{
var value = !string.IsNullOrEmpty(style) ? style : "natural";
@ -123,7 +145,7 @@ public partial class ImageCompletionProvider : IImageCompletion
return retStyle;
}
private GeneratedImageFormat GetImageFormat(string format)
private GeneratedImageFormat GetImageResponseFormat(string? format)
{
var value = !string.IsNullOrEmpty(format) ? format : "bytes";
@ -158,5 +180,15 @@ public partial class ImageCompletionProvider : IImageCompletion
}
return retCount;
}
private string? VerifyImageParameter(string? curVal, string? defaultVal, IEnumerable<string>? options = null)
{
if (options.IsNullOrEmpty())
{
return curVal.IfNullOrEmptyAs(defaultVal);
}
return options.Contains(curVal) ? curVal : defaultVal;
}
#endregion
}