Fix sticker generation for newer GPT image models
Sticker generation was failing when using newer GPT image models
(gpt-image-1, gpt-image-1-mini, gpt-image-1.5). The issue occurred
because stickers requested 256x256 size, but these models only support
1024x1024, 1536x1024, 1024x1536, and auto.
To reproduce, send `!bai sticker Something` to an agent configured
with a GPT image model. The error was:
invalid_request_error: Invalid value: '256x256'. Supported values
are: '1024x1024', '1024x1536', '1536x1024', and 'auto'. (param: size)
(code: invalid_value)
The fix replaces the hardcoded 256x256 size override with a
`smallest_size_possible` flag, letting each provider determine the
appropriate sticker size based on the model being used.
The `openai_compat` provider still defaults to requesting 256x256 in all cases
(regardless of model name).
2026-02-04 02:36:50 +02:00
|
|
|
use async_openai::types::responses::{
|
2026-03-20 12:07:15 +02:00
|
|
|
EasyInputContent, EasyInputMessage, ImageDetail, InputContent, InputFileArgs,
|
|
|
|
|
InputImageContent, InputItem, InputParam, MessageType, Role,
|
2024-09-12 13:44:06 +03:00
|
|
|
};
|
|
|
|
|
|
2025-05-10 11:47:50 +03:00
|
|
|
use crate::conversation::llm::{
|
|
|
|
|
Author as LLMAuthor, Message as LLMMessage, MessageContent as LLMMessageContent,
|
|
|
|
|
};
|
2025-05-10 09:18:01 +03:00
|
|
|
use crate::utils::base64::base64_encode;
|
2024-09-12 13:44:06 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
pub fn convert_llm_messages_to_openai_response_input(
|
2024-09-12 13:44:06 +03:00
|
|
|
conversation_messages: Vec<LLMMessage>,
|
2026-01-23 22:05:53 +01:00
|
|
|
) -> InputParam {
|
|
|
|
|
let mut items = Vec::with_capacity(conversation_messages.len());
|
2024-09-12 13:44:06 +03:00
|
|
|
|
|
|
|
|
for message in conversation_messages {
|
2026-01-23 22:05:53 +01:00
|
|
|
let role = match message.author {
|
|
|
|
|
LLMAuthor::Prompt => Role::System,
|
|
|
|
|
LLMAuthor::Assistant => Role::Assistant,
|
|
|
|
|
LLMAuthor::User => Role::User,
|
|
|
|
|
};
|
2025-05-10 09:18:01 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
let content = match message.content {
|
|
|
|
|
LLMMessageContent::Text(text) => EasyInputContent::Text(text),
|
|
|
|
|
LLMMessageContent::Image(image_details) => {
|
|
|
|
|
let image_url = format!(
|
|
|
|
|
"data:{};base64,{}",
|
|
|
|
|
image_details.mime,
|
|
|
|
|
base64_encode(&image_details.data)
|
|
|
|
|
);
|
2025-05-10 09:18:01 +03:00
|
|
|
|
2026-01-23 22:05:53 +01:00
|
|
|
EasyInputContent::ContentList(vec![InputContent::InputImage(InputImageContent {
|
|
|
|
|
image_url: Some(image_url),
|
|
|
|
|
detail: ImageDetail::Auto,
|
|
|
|
|
file_id: None,
|
|
|
|
|
})])
|
2025-05-10 09:18:01 +03:00
|
|
|
}
|
2026-03-20 12:07:15 +02:00
|
|
|
LLMMessageContent::File(file_details) => {
|
|
|
|
|
let file_data = format!(
|
|
|
|
|
"data:{};base64,{}",
|
|
|
|
|
file_details.mime,
|
|
|
|
|
base64_encode(&file_details.data)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let file_content = InputFileArgs::default()
|
|
|
|
|
.file_data(file_data)
|
|
|
|
|
.filename(file_details.filename())
|
|
|
|
|
.build()
|
|
|
|
|
.expect("Failed to build InputFileContent");
|
|
|
|
|
|
|
|
|
|
EasyInputContent::ContentList(vec![InputContent::InputFile(file_content)])
|
|
|
|
|
}
|
2026-01-23 22:05:53 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
items.push(InputItem::EasyMessage(EasyInputMessage {
|
|
|
|
|
r#type: MessageType::Message,
|
|
|
|
|
role,
|
|
|
|
|
content,
|
|
|
|
|
}));
|
2024-09-12 13:44:06 +03:00
|
|
|
}
|
2026-01-23 22:05:53 +01:00
|
|
|
|
|
|
|
|
InputParam::Items(items)
|
2024-09-12 13:44:06 +03:00
|
|
|
}
|