Make style, quality and internal response_format image generation parameters optional

Some OpenAI models (like `gpt-image-1`) either don't support these or
only support specific other values.

Related to https://github.com/etkecc/baibot/issues/40
This commit is contained in:
Slavi Pantaleev
2025-05-03 09:37:10 +03:00
parent 8222681e27
commit 256ed05662
3 changed files with 44 additions and 21 deletions

View File

@@ -149,13 +149,13 @@ pub struct ImageGenerationConfig {
pub model_id: String, pub model_id: String,
#[serde(default = "default_image_style")] #[serde(default = "default_image_style")]
pub style: async_openai::types::ImageStyle, pub style: Option<async_openai::types::ImageStyle>,
#[serde(default = "default_image_size")] #[serde(default = "default_image_size")]
pub size: async_openai::types::ImageSize, pub size: async_openai::types::ImageSize,
#[serde(default = "default_image_quality")] #[serde(default = "default_image_quality")]
pub quality: async_openai::types::ImageQuality, pub quality: Option<async_openai::types::ImageQuality>,
} }
impl Default for ImageGenerationConfig { impl Default for ImageGenerationConfig {
@@ -181,14 +181,14 @@ impl ImageGenerationConfig {
} }
} }
fn default_image_style() -> async_openai::types::ImageStyle { fn default_image_style() -> Option<async_openai::types::ImageStyle> {
async_openai::types::ImageStyle::Vivid None
} }
fn default_image_size() -> async_openai::types::ImageSize { fn default_image_size() -> async_openai::types::ImageSize {
async_openai::types::ImageSize::S1024x1024 async_openai::types::ImageSize::S1024x1024
} }
fn default_image_quality() -> async_openai::types::ImageQuality { fn default_image_quality() -> Option<async_openai::types::ImageQuality> {
async_openai::types::ImageQuality::Standard None
} }

View File

@@ -265,12 +265,15 @@ impl ControllerTrait for Controller {
let quality = if params.cheaper_quality_switching_allowed { let quality = if params.cheaper_quality_switching_allowed {
// Switch to a cheaper quality // Switch to a cheaper quality
match &image_generation_config.quality { match &image_generation_config.quality {
async_openai::types::ImageQuality::Standard => { Some(quality) => match quality {
async_openai::types::ImageQuality::Standard async_openai::types::ImageQuality::Standard => {
} Some(async_openai::types::ImageQuality::Standard)
async_openai::types::ImageQuality::HD => { }
async_openai::types::ImageQuality::Standard async_openai::types::ImageQuality::HD => {
Some(async_openai::types::ImageQuality::Standard)
}
} }
None => None
} }
} else { } else {
image_generation_config.quality.clone() image_generation_config.quality.clone()
@@ -284,14 +287,34 @@ impl ControllerTrait for Controller {
}) })
.unwrap_or(image_generation_config.size); .unwrap_or(image_generation_config.size);
let request = CreateImageRequestArgs::default() let response_format = match model.clone() {
async_openai::types::ImageModel::DallE2 => Some(async_openai::types::ImageResponseFormat::B64Json),
async_openai::types::ImageModel::DallE3 => Some(async_openai::types::ImageResponseFormat::B64Json),
async_openai::types::ImageModel::Other(model_str) => match model_str.as_str() {
_ => Some(async_openai::types::ImageResponseFormat::B64Json),
},
};
let mut request_builder = CreateImageRequestArgs::default();
request_builder
.model(model) .model(model)
.prompt(prompt.to_owned()) .prompt(prompt.to_owned())
.response_format(async_openai::types::ImageResponseFormat::B64Json) .size(size);
.size(size)
.style(image_generation_config.style.clone()) if let Some(response_format) = response_format {
.quality(quality) request_builder.response_format(response_format);
.build()?; }
if let Some(style) = &image_generation_config.style {
request_builder.style(style.clone());
}
if let Some(quality) = quality {
request_builder.quality(quality.clone());
}
let request = request_builder.build()?;
tracing::trace!( tracing::trace!(
?prompt, ?prompt,

View File

@@ -230,15 +230,15 @@ impl TryInto<OpenAIImageGenerationConfig> for ImageGenerationConfig {
}; };
let style = if let Some(style) = &self.style { let style = if let Some(style) = &self.style {
convert_string_to_enum::<async_openai::types::ImageStyle>(style)? Some(convert_string_to_enum::<async_openai::types::ImageStyle>(style)?)
} else { } else {
async_openai::types::ImageStyle::Vivid None
}; };
let quality = if let Some(quality) = &self.quality { let quality = if let Some(quality) = &self.quality {
convert_string_to_enum::<async_openai::types::ImageQuality>(quality)? Some(convert_string_to_enum::<async_openai::types::ImageQuality>(quality)?)
} else { } else {
async_openai::types::ImageQuality::Standard None
}; };
Ok(OpenAIImageGenerationConfig { Ok(OpenAIImageGenerationConfig {