diff --git a/crates/schema/public/api/artcraft_api_defs/src/generate/image/generate_flux_1_dev_text_to_image.rs b/crates/schema/public/api/artcraft_api_defs/src/generate/image/generate_flux_1_dev_text_to_image.rs index 5a1ee51cdf..be9743ca6e 100644 --- a/crates/schema/public/api/artcraft_api_defs/src/generate/image/generate_flux_1_dev_text_to_image.rs +++ b/crates/schema/public/api/artcraft_api_defs/src/generate/image/generate_flux_1_dev_text_to_image.rs @@ -11,8 +11,37 @@ pub struct GenerateFlux1DevTextToImageRequest { /// Text prompt to generate the image from. pub prompt: Option, + + /// Aspect ratio of the output images. + pub aspect_ratio: Option, + + /// Number of images to generate. Default is one. + pub num_images: Option, } + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum GenerateFlux1DevTextToImageAspectRatio { + Square, // 1:1 + SquareHd, // 1:1 + LandscapeFourByThree, // 4:3 + LandscapeSixteenByNine, // 16:9 + PortraitThreeByFour, // 3:4 + PortraitNineBySixteen, // 9:16 + //Custom { width: u32, height: u32 }, // TODO +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum GenerateFlux1DevTextToImageNumImages { + One, // Default + Two, + Three, + Four, +} + + #[derive(Serialize, Deserialize, ToSchema)] pub struct GenerateFlux1DevTextToImageResponse { pub success: bool, diff --git a/crates/service/web/storyteller_web/src/docs/api_doc.rs b/crates/service/web/storyteller_web/src/docs/api_doc.rs index a464177f7e..5d9d5119fb 100644 --- a/crates/service/web/storyteller_web/src/docs/api_doc.rs +++ b/crates/service/web/storyteller_web/src/docs/api_doc.rs @@ -1,5 +1,7 @@ use utoipa::OpenApi; +use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageAspectRatio; +use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageNumImages; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageRequest; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageResponse; use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image::GenerateFluxPro11UltraTextToImageRequest; @@ -463,6 +465,8 @@ use crate::http_server::web_utils::response_success_helpers::*; FeaturedMediaFile, FeaturedModelWeightForList, FundamentalFrequencyMethod, + GenerateFlux1DevTextToImageAspectRatio, + GenerateFlux1DevTextToImageNumImages, GenerateFlux1DevTextToImageRequest, GenerateFlux1DevTextToImageResponse, GenerateFluxPro11UltraTextToImageRequest, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs index fbf99553a3..fac7791c12 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs @@ -16,7 +16,7 @@ use actix_web::http::StatusCode; use actix_web::web::Json; use actix_web::web::Path; use actix_web::{web, HttpRequest, HttpResponse}; -use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::{GenerateFlux1DevTextToImageRequest, GenerateFlux1DevTextToImageResponse}; +use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::{GenerateFlux1DevTextToImageAspectRatio, GenerateFlux1DevTextToImageNumImages, GenerateFlux1DevTextToImageRequest, GenerateFlux1DevTextToImageResponse}; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; use enums::common::visibility::Visibility; use fal_client::requests::webhook::image::enqueue_flux_1_dev_text_to_image_webhook::enqueue_flux_1_dev_text_to_image_webhook; @@ -87,13 +87,31 @@ pub async fn generate_flux_1_dev_text_to_image_handler( const IS_MOD : bool = false; info!("Fal webhook URL: {}", server_state.fal.webhook_url); + + let aspect_ratio = match request.aspect_ratio { + Some(GenerateFlux1DevTextToImageAspectRatio::Square) => Flux1DevAspectRatio::Square, + Some(GenerateFlux1DevTextToImageAspectRatio::SquareHd) => Flux1DevAspectRatio::SquareHd, + Some(GenerateFlux1DevTextToImageAspectRatio::LandscapeFourByThree) => Flux1DevAspectRatio::LandscapeFourByThree, + Some(GenerateFlux1DevTextToImageAspectRatio::LandscapeSixteenByNine) => Flux1DevAspectRatio::LandscapeSixteenByNine, + Some(GenerateFlux1DevTextToImageAspectRatio::PortraitThreeByFour) => Flux1DevAspectRatio::PortraitThreeByFour, + Some(GenerateFlux1DevTextToImageAspectRatio::PortraitNineBySixteen) => Flux1DevAspectRatio::PortraitNineBySixteen, + None => Flux1DevAspectRatio::LandscapeSixteenByNine, // Default + }; + + let num_images = match request.num_images { + Some(GenerateFlux1DevTextToImageNumImages::One) => Flux1DevNumImages::One, + Some(GenerateFlux1DevTextToImageNumImages::Two) => Flux1DevNumImages::Two, + Some(GenerateFlux1DevTextToImageNumImages::Three) => Flux1DevNumImages::Three, + Some(GenerateFlux1DevTextToImageNumImages::Four) => Flux1DevNumImages::Four, + None => Flux1DevNumImages::One, // Default + }; let args = Flux1DevArgs { prompt: request.prompt.as_deref().unwrap_or(""), webhook_url: &server_state.fal.webhook_url, api_key: &server_state.fal.api_key, - aspect_ratio: Flux1DevAspectRatio::LandscapeSixteenByNine, - num_images: Flux1DevNumImages::One, + aspect_ratio, + num_images, }; let fal_result = enqueue_flux_1_dev_text_to_image_webhook(args)