From 116a4887b2db0db527922eac0e696d09266a0023 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 1 Jan 2026 17:26:12 -0500 Subject: [PATCH] seedream 4 / 4.5 --- .../aspect_ratio/common_aspect_ratio.rs | 2 ++ .../aspect_ratio_to_artcraft_seedream_4.rs | 29 +++++++++++++++++ .../aspect_ratio_to_artcraft_seedream_4p5.rs | 29 +++++++++++++++++ .../api_adapters/aspect_ratio/convert/mod.rs | 2 ++ .../handle_artcraft_seedream_4_edit.rs | 32 +++++++++++++++---- .../handle_artcraft_seedream_4p5_edit.rs | 31 ++++++++++++++---- ...andle_artcraft_seedream_4_text_to_image.rs | 32 ++++++++++++++----- ...dle_artcraft_seedream_4p5_text_to_image.rs | 32 ++++++++++++++----- 8 files changed, 159 insertions(+), 30 deletions(-) create mode 100644 crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4.rs create mode 100644 crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4p5.rs diff --git a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/common_aspect_ratio.rs b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/common_aspect_ratio.rs index 515f9c5c9c..e8430f723d 100644 --- a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/common_aspect_ratio.rs +++ b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/common_aspect_ratio.rs @@ -32,9 +32,11 @@ pub enum CommonAspectRatio { Tall, // Auto values that bake in resolution + // These are from the Seedream models Auto2k, Auto4k, // Defined aspect ratios that bake in resolution + // These are from the Seedream models SquareHd, } diff --git a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4.rs b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4.rs new file mode 100644 index 0000000000..d09fa7f4fb --- /dev/null +++ b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4.rs @@ -0,0 +1,29 @@ +use crate::core::api_adapters::aspect_ratio::common_aspect_ratio::CommonAspectRatio; +use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4_multi_function_image_gen::BytedanceSeedreamV4MultiFunctionImageGenImageSize; + +pub fn aspect_ratio_to_artcraft_seedream_4(aspect_ratio: CommonAspectRatio) -> BytedanceSeedreamV4MultiFunctionImageGenImageSize { + match aspect_ratio { + // Exact + CommonAspectRatio::Auto => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto, + CommonAspectRatio::Auto2k => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto2k, + CommonAspectRatio::Auto4k => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto4k, + CommonAspectRatio::Square => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, + CommonAspectRatio::SquareHd => BytedanceSeedreamV4MultiFunctionImageGenImageSize::SquareHd, + CommonAspectRatio::WideFourByThree => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideSixteenByNine => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::TallThreeByFour => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallNineBySixteen => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, + + // Non-matching aspect ratios, use closest neighbor + CommonAspectRatio::WideFiveByFour => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideThreeByTwo => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideTwentyOneByNine => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::TallFourByFive => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallTwoByThree => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallNineByTwentyOne => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, + + // Semantic values + CommonAspectRatio::Wide => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::Tall => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, + } +} diff --git a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4p5.rs b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4p5.rs new file mode 100644 index 0000000000..71fae240f7 --- /dev/null +++ b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/aspect_ratio_to_artcraft_seedream_4p5.rs @@ -0,0 +1,29 @@ +use crate::core::api_adapters::aspect_ratio::common_aspect_ratio::CommonAspectRatio; +use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4p5_multi_function_image_gen::BytedanceSeedreamV4p5MultiFunctionImageGenImageSize; + +pub fn aspect_ratio_to_artcraft_seedream_4p5(aspect_ratio: CommonAspectRatio) -> BytedanceSeedreamV4p5MultiFunctionImageGenImageSize { + match aspect_ratio { + // Exact + CommonAspectRatio::Auto2k => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Auto2k, + CommonAspectRatio::Auto4k => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Auto4k, + CommonAspectRatio::Square => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, + CommonAspectRatio::SquareHd => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::SquareHd, + CommonAspectRatio::WideFourByThree => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideSixteenByNine => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::TallThreeByFour => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallNineBySixteen => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, + + // Non-matching aspect ratios, use closest neighbor + CommonAspectRatio::Auto => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Auto4k, + CommonAspectRatio::WideFiveByFour => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideThreeByTwo => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeFourThree, + CommonAspectRatio::WideTwentyOneByNine => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::TallFourByFive => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallTwoByThree => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitFourThree, + CommonAspectRatio::TallNineByTwentyOne => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, + + // Semantic values + CommonAspectRatio::Wide => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, + CommonAspectRatio::Tall => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, + } +} diff --git a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/mod.rs b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/mod.rs index 37a0c0790a..1ff3d59a3b 100644 --- a/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/mod.rs +++ b/crates/desktop/artcraft/src/core/api_adapters/aspect_ratio/convert/mod.rs @@ -2,5 +2,7 @@ pub mod aspect_ratio_to_artcraft_gpt_image_1; pub mod aspect_ratio_to_artcraft_gpt_image_1p5; pub mod aspect_ratio_to_artcraft_nano_banana; pub mod aspect_ratio_to_artcraft_nano_banana_pro; +pub mod aspect_ratio_to_artcraft_seedream_4; +pub mod aspect_ratio_to_artcraft_seedream_4p5; pub mod aspect_ratio_to_grok_image; pub mod aspect_ratio_to_sora_native_gpt_image_1; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs index eec53cf37a..7d04a7f331 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs @@ -1,3 +1,5 @@ +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_nano_banana_pro::aspect_ratio_to_artcraft_nano_banana_pro; +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_seedream_4::aspect_ratio_to_artcraft_seedream_4; use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize, EnqueueEditImageCommand}; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; @@ -12,6 +14,7 @@ use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use anyhow::anyhow; use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4_multi_function_image_gen::{BytedanceSeedreamV4MultiFunctionImageGenImageSize, BytedanceSeedreamV4MultiFunctionImageGenNumImages, BytedanceSeedreamV4MultiFunctionImageGenRequest}; +use artcraft_api_defs::generate::image::multi_function::nano_banana_pro_multi_function_image_gen::NanoBananaProMultiFunctionImageGenAspectRatio; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; use idempotency::uuid::generate_random_uuid; @@ -40,13 +43,7 @@ pub async fn handle_artcraft_seedream_4_edit( let uuid_idempotency_token = generate_random_uuid(); - let image_size = request.aspect_ratio - .map(|size| match size { - EditImageSize::Auto => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, - EditImageSize::Square => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, - EditImageSize::Tall => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, - EditImageSize::Wide => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, - }); + let image_size = get_aspect_ratio(request); let num_images = match request.image_count { None => None, @@ -117,3 +114,24 @@ pub async fn handle_artcraft_seedream_4_edit( task_type: TaskType::ImageGeneration, }) } + +fn get_aspect_ratio(request: &EnqueueEditImageCommand) -> Option { + if let Some(common_aspect_ratio) = request.common_aspect_ratio { + // Handle modern aspect ratio + let aspect = aspect_ratio_to_artcraft_seedream_4(common_aspect_ratio); + return Some(aspect); + } + + if let Some(aspect_ratio) = request.aspect_ratio { + // Handle deprecated aspect ratio + let aspect_ratio = match aspect_ratio { + EditImageSize::Auto => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, + EditImageSize::Square => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, + EditImageSize::Tall => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, + EditImageSize::Wide => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, + }; + return Some(aspect_ratio); + } + + None +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs index f0966bc49a..fe51b59bd7 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs @@ -1,3 +1,5 @@ +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_seedream_4::aspect_ratio_to_artcraft_seedream_4; +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_seedream_4p5::aspect_ratio_to_artcraft_seedream_4p5; use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize, EnqueueEditImageCommand}; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; @@ -40,13 +42,7 @@ pub async fn handle_artcraft_seedream_4p5_edit( let uuid_idempotency_token = generate_random_uuid(); - let image_size = request.aspect_ratio - .map(|size| match size { - EditImageSize::Auto => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, - EditImageSize::Square => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, - EditImageSize::Tall => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, - EditImageSize::Wide => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, - }); + let image_size = get_aspect_ratio(request); let num_images = match request.image_count { None => None, @@ -117,3 +113,24 @@ pub async fn handle_artcraft_seedream_4p5_edit( task_type: TaskType::ImageGeneration, }) } + +fn get_aspect_ratio(request: &EnqueueEditImageCommand) -> Option { + if let Some(common_aspect_ratio) = request.common_aspect_ratio { + // Handle modern aspect ratio + let aspect = aspect_ratio_to_artcraft_seedream_4p5(common_aspect_ratio); + return Some(aspect); + } + + if let Some(aspect_ratio) = request.aspect_ratio { + // Handle deprecated aspect ratio + let aspect_ratio = match aspect_ratio { + EditImageSize::Auto => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, + EditImageSize::Square => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, + EditImageSize::Tall => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, + EditImageSize::Wide => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, + }; + return Some(aspect_ratio); + } + + None +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4_text_to_image.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4_text_to_image.rs index d9a6565ff3..2ece4dd2af 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4_text_to_image.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4_text_to_image.rs @@ -1,5 +1,6 @@ +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_seedream_4::aspect_ratio_to_artcraft_seedream_4; use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize}; +use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize, EnqueueEditImageCommand}; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; @@ -37,13 +38,7 @@ pub async fn handle_artcraft_seedream_4_text_to_image( let uuid_idempotency_token = generate_random_uuid(); - let image_size = request.aspect_ratio - .map(|size| match size { - TextToImageSize::Auto => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, - TextToImageSize::Square => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, - TextToImageSize::Tall => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, - TextToImageSize::Wide => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, - }); + let image_size = get_aspect_ratio(request); let num_images = match request.number_images { None => None, @@ -98,3 +93,24 @@ pub async fn handle_artcraft_seedream_4_text_to_image( task_type: TaskType::ImageGeneration, }) } + +fn get_aspect_ratio(request: &EnqueueTextToImageRequest) -> Option { + if let Some(common_aspect_ratio) = request.common_aspect_ratio { + // Handle modern aspect ratio + let aspect = aspect_ratio_to_artcraft_seedream_4(common_aspect_ratio); + return Some(aspect); + } + + if let Some(aspect_ratio) = request.aspect_ratio { + // Handle deprecated aspect ratio + let aspect_ratio = match aspect_ratio { + TextToImageSize::Auto => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, + TextToImageSize::Square => BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square, + TextToImageSize::Tall => BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine, + TextToImageSize::Wide => BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine, + }; + return Some(aspect_ratio); + } + + None +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4p5_text_to_image.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4p5_text_to_image.rs index 4564c1bac4..4802812097 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4p5_text_to_image.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/artcraft/handle_artcraft_seedream_4p5_text_to_image.rs @@ -1,5 +1,6 @@ +use crate::core::api_adapters::aspect_ratio::convert::aspect_ratio_to_artcraft_seedream_4p5::aspect_ratio_to_artcraft_seedream_4p5; use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize}; +use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EnqueueEditImageCommand}; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; @@ -37,13 +38,7 @@ pub async fn handle_artcraft_seedream_4p5_text_to_image( let uuid_idempotency_token = generate_random_uuid(); - let image_size = request.aspect_ratio - .map(|size| match size { - TextToImageSize::Auto => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, - TextToImageSize::Square => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, - TextToImageSize::Tall => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, - TextToImageSize::Wide => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, - }); + let image_size = get_aspect_ratio(request); let num_images = match request.number_images { None => None, @@ -98,3 +93,24 @@ pub async fn handle_artcraft_seedream_4p5_text_to_image( task_type: TaskType::ImageGeneration, }) } + +fn get_aspect_ratio(request: &EnqueueTextToImageRequest) -> Option { + if let Some(common_aspect_ratio) = request.common_aspect_ratio { + // Handle modern aspect ratio + let aspect = aspect_ratio_to_artcraft_seedream_4p5(common_aspect_ratio); + return Some(aspect); + } + + if let Some(aspect_ratio) = request.aspect_ratio { + // Handle deprecated aspect ratio + let aspect_ratio = match aspect_ratio { + TextToImageSize::Auto => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, + TextToImageSize::Square => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square, + TextToImageSize::Tall => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine, + TextToImageSize::Wide => BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine, + }; + return Some(aspect_ratio); + } + + None +}