Compare commits

...
53 changed files with 1037 additions and 342 deletions
@@ -295,6 +295,11 @@ pub async fn validate_and_save_results(args: SaveResultsArgs<'_>) -> Result<Medi
maybe_positive_prompt: args.comfy_args.positive_prompt.as_deref(),
maybe_negative_prompt: args.comfy_args.negative_prompt.as_deref(),
maybe_other_args: maybe_other_args.as_ref(),
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
creator_ip_address: &args.job.creator_ip_address,
mysql_executor: &args.deps.db.mysql_pool,
phantom: Default::default(),
@@ -323,22 +323,22 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux
crate::http_server::endpoints::featured_items::create_featured_item_handler::create_featured_item_handler,
crate::http_server::endpoints::featured_items::delete_featured_item_handler::delete_featured_item_handler,
crate::http_server::endpoints::featured_items::get_is_featured_item_handler::get_is_featured_item_handler,
crate::http_server::endpoints::generate::image::generate_flux_1_dev_text_to_image_handler::generate_flux_1_dev_text_to_image_handler,
crate::http_server::endpoints::generate::image::generate_flux_1_schnell_text_to_image_handler::generate_flux_1_schnell_text_to_image_handler,
crate::http_server::endpoints::generate::image::generate_flux_pro_11_text_to_image_handler::generate_flux_pro_11_text_to_image_handler,
crate::http_server::endpoints::generate::image::generate_gpt_image_1_text_to_image_handler::generate_gpt_image_1_text_to_image_handler,
crate::http_server::endpoints::generate::image::generate_flux_pro_11_ultra_text_to_image_handler::generate_flux_pro_11_ultra_text_to_image_handler,
crate::http_server::endpoints::generate::image::remove_image_background_handler::remove_image_background_handler,
crate::http_server::endpoints::generate::image::text::generate_flux_1_dev_text_to_image_handler::generate_flux_1_dev_text_to_image_handler,
crate::http_server::endpoints::generate::image::text::generate_flux_1_schnell_text_to_image_handler::generate_flux_1_schnell_text_to_image_handler,
crate::http_server::endpoints::generate::image::text::generate_flux_pro_11_text_to_image_handler::generate_flux_pro_11_text_to_image_handler,
crate::http_server::endpoints::generate::image::text::generate_gpt_image_1_text_to_image_handler::generate_gpt_image_1_text_to_image_handler,
crate::http_server::endpoints::generate::image::text::generate_flux_pro_11_ultra_text_to_image_handler::generate_flux_pro_11_ultra_text_to_image_handler,
crate::http_server::endpoints::generate::image::bg_removal::remove_image_background_handler::remove_image_background_handler,
crate::http_server::endpoints::generate::image::edit::gpt_image_1_edit_image_handler::gpt_image_1_edit_image_handler,
crate::http_server::endpoints::generate::object::generate_hunyuan_2_1_image_to_3d_handler::generate_hunyuan_2_1_image_to_3d_handler,
crate::http_server::endpoints::generate::object::generate_hunyuan_2_0_image_to_3d_handler::generate_hunyuan_2_0_image_to_3d_handler,
crate::http_server::endpoints::generate::splat::generate_worldlabs_marble_0p1_mini_splat_handler::generate_worldlabs_marble_0p1_mini_splat_handler,
crate::http_server::endpoints::generate::splat::generate_worldlabs_marble_0p1_plus_splat_handler::generate_worldlabs_marble_0p1_plus_splat_handler,
crate::http_server::endpoints::generate::video::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler,
crate::http_server::endpoints::generate::video::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler,
crate::http_server::endpoints::generate::video::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler,
crate::http_server::endpoints::generate::video::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler,
crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler,
crate::http_server::endpoints::generate::video::image::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler,
crate::http_server::endpoints::generate::video::image::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler,
crate::http_server::endpoints::generate::video::image::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler,
crate::http_server::endpoints::generate::video::image::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler,
crate::http_server::endpoints::generate::video::image::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler,
crate::http_server::endpoints::image_studio::upload::upload_snapshot_media_file_handler::upload_snapshot_media_file_handler,
crate::http_server::endpoints::inference_job::delete::dismiss_finished_session_jobs_handler::dismiss_finished_session_jobs_handler,
crate::http_server::endpoints::inference_job::delete::terminate_inference_job_handler::terminate_inference_job_handler,
@@ -439,9 +439,9 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux
crate::http_server::endpoints::generate::image::inpaint::flux_dev_juggernaut_inpaint_handler::flux_dev_juggernaut_inpaint_image_handler,
crate::http_server::endpoints::generate::image::inpaint::flux_pro_1_inpaint_handler::flux_pro_1_inpaint_image_handler,
// Generate Videos
crate::http_server::endpoints::generate::video::generate_seedance_1_0_pro_image_to_video_handler::generate_seedance_1_0_pro_image_to_video_handler,
crate::http_server::endpoints::generate::video::generate_veo_3_image_to_video_handler::generate_veo_3_image_to_video_handler,
crate::http_server::endpoints::generate::video::generate_veo_3_fast_image_to_video_handler::generate_veo_3_fast_image_to_video_handler,
crate::http_server::endpoints::generate::video::image::generate_seedance_1_0_pro_image_to_video_handler::generate_seedance_1_0_pro_image_to_video_handler,
crate::http_server::endpoints::generate::video::image::generate_veo_3_image_to_video_handler::generate_veo_3_image_to_video_handler,
crate::http_server::endpoints::generate::video::image::generate_veo_3_fast_image_to_video_handler::generate_veo_3_fast_image_to_video_handler,
// Generate Video (Multi-Function)
crate::http_server::endpoints::generate::video::multi_function::kling_2p5_turbo_pro_multi_function_video_gen_handler::kling_2p5_turbo_pro_multi_function_video_gen_handler,
crate::http_server::endpoints::generate::video::multi_function::kling_2p6_pro_multi_function_video_gen_handler::kling_2p6_pro_multi_function_video_gen_handler,
@@ -14,6 +14,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::angle::enqueue_flux_2_lora_edit_image_angle_webhook::{enqueue_flux_2_lora_edit_image_angle_webhook, EnqueueFlux2LoraEditImageAngleArgs, EnqueueFlux2LoraAngleNumImages, EnqueueFlux2LoraAngleImageSize};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -173,10 +175,22 @@ pub async fn flux_2_lora_edit_image_angle_handler(
maybe_positive_prompt: None,
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit),
maybe_aspect_ratio: request.image_size.map(|size| match size {
Flux2LoraEditImageAngleImageSize::Square => CommonAspectRatio::Square,
Flux2LoraEditImageAngleImageSize::SquareHd => CommonAspectRatio::SquareHd,
Flux2LoraEditImageAngleImageSize::PortraitFourThree => CommonAspectRatio::TallThreeByFour,
Flux2LoraEditImageAngleImageSize::PortraitSixteenNine => CommonAspectRatio::TallNineBySixteen,
Flux2LoraEditImageAngleImageSize::LandscapeFourThree => CommonAspectRatio::WideFourByThree,
Flux2LoraEditImageAngleImageSize::LandscapeSixteenNine => CommonAspectRatio::WideSixteenByNine,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count: request.num_images.map(|n| match n {
Flux2LoraEditImageAngleNumImages::One => 1,
Flux2LoraEditImageAngleNumImages::Two => 2,
Flux2LoraEditImageAngleNumImages::Three => 3,
Flux2LoraEditImageAngleNumImages::Four => 4,
}),
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -14,6 +14,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::angle::enqueue_qwen_edit_2511_edit_image_angle_webhook::{enqueue_qwen_edit_2511_edit_image_angle_webhook, EnqueueQwenEdit2511EditImageAngleArgs, EnqueueQwenEdit2511AngleNumImages, EnqueueQwenEdit2511AngleImageSize};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -174,10 +176,22 @@ pub async fn qwen_edit_2511_edit_image_angle_handler(
maybe_positive_prompt: request.additional_prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit),
maybe_aspect_ratio: request.image_size.map(|size| match size {
QwenEdit2511EditImageAngleImageSize::Square => CommonAspectRatio::Square,
QwenEdit2511EditImageAngleImageSize::SquareHd => CommonAspectRatio::SquareHd,
QwenEdit2511EditImageAngleImageSize::PortraitFourThree => CommonAspectRatio::TallThreeByFour,
QwenEdit2511EditImageAngleImageSize::PortraitSixteenNine => CommonAspectRatio::TallNineBySixteen,
QwenEdit2511EditImageAngleImageSize::LandscapeFourThree => CommonAspectRatio::WideFourByThree,
QwenEdit2511EditImageAngleImageSize::LandscapeSixteenNine => CommonAspectRatio::WideSixteenByNine,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count: request.num_images.map(|n| match n {
QwenEdit2511EditImageAngleNumImages::One => 1,
QwenEdit2511EditImageAngleNumImages::Two => 2,
QwenEdit2511EditImageAngleNumImages::Three => 3,
QwenEdit2511EditImageAngleNumImages::Four => 4,
}),
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -0,0 +1 @@
pub mod remove_image_background_handler;
@@ -16,6 +16,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_flux_pro_kontext_max_edit_webhook::{enqueue_flux_pro_kontext_max_edit_webhook, FluxProKontextMaxArgs, FluxProKontextMaxNumImages};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -207,6 +208,14 @@ pub async fn flux_pro_kontext_max_edit_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_batch_count: Option<u8> = match request.num_images {
Some(FluxProKontextMaxEditImageNumImages::One) => Some(1),
Some(FluxProKontextMaxEditImageNumImages::Two) => Some(2),
Some(FluxProKontextMaxEditImageNumImages::Three) => Some(3),
Some(FluxProKontextMaxEditImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -218,10 +227,10 @@ pub async fn flux_pro_kontext_max_edit_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit), // TODO: This endpoint only supports "edit" (and not "text") for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -17,6 +17,7 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_gemini_25_flash_edit_webhook::{enqueue_gemini_25_flash_edit_webhook, Gemini25FlashEditArgs, Gemini25FlashEditNumImages};
use fal_client::requests::webhook::image::edit::enqueue_gpt_image_1_edit_image_webhook::enqueue_gpt_image_1_edit_image_webhook;
@@ -226,6 +227,14 @@ pub async fn gemini_25_flash_edit_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_batch_count: Option<u8> = match request.num_images {
Some(Gemini25FlashEditImageNumImages::One) => Some(1),
Some(Gemini25FlashEditImageNumImages::Two) => Some(2),
Some(Gemini25FlashEditImageNumImages::Three) => Some(3),
Some(Gemini25FlashEditImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -235,10 +244,10 @@ pub async fn gemini_25_flash_edit_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit), // TODO: This endpoint only supports "edit" (and not "text") for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -18,6 +18,8 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_gpt_image_1_edit_image_webhook::enqueue_gpt_image_1_edit_image_webhook;
@@ -248,6 +250,21 @@ pub async fn gpt_image_1_edit_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.image_size {
Some(GptImage1EditImageImageSize::Square) => Some(CommonAspectRatio::Square),
Some(GptImage1EditImageImageSize::Horizontal) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GptImage1EditImageImageSize::Vertical) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GptImage1EditImageNumImages::One) => Some(1),
Some(GptImage1EditImageNumImages::Two) => Some(2),
Some(GptImage1EditImageNumImages::Three) => Some(3),
Some(GptImage1EditImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -257,10 +274,10 @@ pub async fn gpt_image_1_edit_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit), // TODO: This endpoint only supports "edit" (and not "text") for now
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -16,6 +16,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_qwen_image_edit_webhook::{enqueue_qwen_image_edit_webhook, QwenImageEditArgs, QwenImageEditNumImages};
@@ -200,6 +201,14 @@ pub async fn qwen_edit_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_batch_count: Option<u8> = match request.num_images {
Some(QwenEditImageNumImages::One) => Some(1),
Some(QwenEditImageNumImages::Two) => Some(2),
Some(QwenEditImageNumImages::Three) => Some(3),
Some(QwenEditImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -209,10 +218,10 @@ pub async fn qwen_edit_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit), // TODO: This endpoint only supports "edit" (and not "text") for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -15,6 +15,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_seededit_v3_edit_webhook::{enqueue_seededit_v3_edit_webhook, SeedEditV3EditArgs};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -179,7 +180,7 @@ pub async fn seededit_3_edit_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Edit), // TODO: This endpoint only supports "edit" (and not "text") for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -15,6 +15,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::infill::enqueue_flux_dev_juggernaut_infill_webhook::{enqueue_flux_dev_juggernaut_infill_webhook, FluxDevJuggernautInfillArgs, FluxDevJuggernautInfillNumImages};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -217,10 +218,15 @@ pub async fn flux_dev_juggernaut_inpaint_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Inpaint),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count: request.num_images.map(|n| match n {
FluxDevJuggernautInpaintImageNumImages::One => 1,
FluxDevJuggernautInpaintImageNumImages::Two => 2,
FluxDevJuggernautInpaintImageNumImages::Three => 3,
FluxDevJuggernautInpaintImageNumImages::Four => 4,
}),
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -15,6 +15,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::infill::enqueue_flux_pro_1_infill_webhook::{enqueue_flux_pro_1_infill_webhook, FluxPro1InfillArgs, FluxPro1InfillNumImages};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -217,10 +218,15 @@ pub async fn flux_pro_1_inpaint_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Inpaint),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count: request.num_images.map(|n| match n {
FluxPro1InpaintImageNumImages::One => 1,
FluxPro1InpaintImageNumImages::Two => 2,
FluxPro1InpaintImageNumImages::Three => 3,
FluxPro1InpaintImageNumImages::Four => 4,
}),
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -1,10 +1,6 @@
pub mod angle;
pub mod bg_removal;
pub mod edit;
pub mod generate_flux_1_dev_text_to_image_handler;
pub mod generate_flux_1_schnell_text_to_image_handler;
pub mod generate_flux_pro_11_text_to_image_handler;
pub mod generate_flux_pro_11_ultra_text_to_image_handler;
pub mod generate_gpt_image_1_text_to_image_handler;
pub mod inpaint;
pub mod remove_image_background_handler;
pub mod multi_function;
pub mod angle;
pub mod text;
@@ -14,6 +14,9 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_resolution::CommonResolution;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_bytedance_seedream_v5_lite_edit_image_webhook::{enqueue_bytedance_seedream_v5_lite_edit_image_webhook, EnqueueBytedanceSeedreamV5LiteEditImageArgs, EnqueueBytedanceSeedreamV5LiteEditImageNumImages, EnqueueBytedanceSeedreamV5LiteEditImageSize};
use fal_client::requests::webhook::image::text::enqueue_bytedance_seedream_v5_lite_text_to_image_webhook::{enqueue_bytedance_seedream_v5_lite_text_to_image_webhook, EnqueueBytedanceSeedreamV5LiteTextToImageArgs, EnqueueBytedanceSeedreamV5LiteTextToImageNumImages, EnqueueBytedanceSeedreamV5LiteTextToImageSize};
@@ -100,9 +103,11 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("seedream 5 lite edit image");
generation_mode = CommonGenerationMode::Edit;
let num_images = match request.num_images {
Some(BytedanceSeedream5LiteMultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV5LiteEditImageNumImages::One,
@@ -154,6 +159,7 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
} else {
info!("seedream 5 lite text-to-image");
generation_mode = CommonGenerationMode::Text;
let num_images = match request.num_images {
Some(BytedanceSeedream5LiteMultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV5LiteTextToImageNumImages::One,
@@ -221,6 +227,30 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
CommonWebError::ServerError
})?;
let maybe_aspect_ratio = request.image_size.map(|size| match size {
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::Square => CommonAspectRatio::Square,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::SquareHd => CommonAspectRatio::SquareHd,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::PortraitFourThree => CommonAspectRatio::TallThreeByFour,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::PortraitSixteenNine => CommonAspectRatio::TallNineBySixteen,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::LandscapeFourThree => CommonAspectRatio::WideFourByThree,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::LandscapeSixteenNine => CommonAspectRatio::WideSixteenByNine,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::Auto2k => CommonAspectRatio::Auto2k,
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::Auto3k => CommonAspectRatio::Auto,
});
let maybe_resolution = request.image_size.and_then(|size| match size {
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::Auto2k => Some(CommonResolution::TwoK),
BytedanceSeedream5LiteMultiFunctionImageGenImageSize::Auto3k => Some(CommonResolution::ThreeK),
_ => None,
});
let maybe_batch_count: Option<u8> = request.num_images.map(|n| match n {
BytedanceSeedream5LiteMultiFunctionImageGenNumImages::One => 1,
BytedanceSeedream5LiteMultiFunctionImageGenNumImages::Two => 2,
BytedanceSeedream5LiteMultiFunctionImageGenNumImages::Three => 3,
BytedanceSeedream5LiteMultiFunctionImageGenNumImages::Four => 4,
});
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -230,10 +260,10 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -19,6 +19,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_bytedance_seedream_v4_edit_image_webhook::{enqueue_bytedance_seedream_v4_edit_image_webhook, EnqueueBytedanceSeedreamV4EditImageArgs, EnqueueBytedanceSeedreamV4EditImageNumImages, EnqueueBytedanceSeedreamV4EditImageSize};
@@ -113,9 +115,11 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("edit image case");
generation_mode = CommonGenerationMode::Edit;
let num_images = match request.num_images {
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV4EditImageNumImages::One,
@@ -172,6 +176,7 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
} else {
info!("text-to-image case");
generation_mode = CommonGenerationMode::Text;
let num_images = match request.num_images {
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV4TextToImageNumImages::One,
@@ -245,6 +250,27 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.image_size {
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::Square) => Some(CommonAspectRatio::Square),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::SquareHd) => Some(CommonAspectRatio::SquareHd),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitFourThree) => Some(CommonAspectRatio::TallThreeByFour),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::PortraitSixteenNine) => Some(CommonAspectRatio::TallNineBySixteen),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeFourThree) => Some(CommonAspectRatio::WideFourByThree),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::LandscapeSixteenNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto) => Some(CommonAspectRatio::Auto),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto2k) => Some(CommonAspectRatio::Auto2k),
Some(BytedanceSeedreamV4MultiFunctionImageGenImageSize::Auto4k) => Some(CommonAspectRatio::Auto4k),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::One) => Some(1),
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::Two) => Some(2),
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::Three) => Some(3),
Some(BytedanceSeedreamV4MultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -254,10 +280,10 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -19,6 +19,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_bytedance_seedream_v4p5_edit_image_webhook::{enqueue_bytedance_seedream_v4p5_edit_image_webhook, EnqueueBytedanceSeedreamV4p5EditImageArgs, EnqueueBytedanceSeedreamV4p5EditImageNumImages, EnqueueBytedanceSeedreamV4p5EditImageSize};
@@ -113,9 +115,11 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("edit image case");
generation_mode = CommonGenerationMode::Edit;
let num_images = match request.num_images {
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV4p5EditImageNumImages::One,
@@ -171,6 +175,7 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
} else {
info!("text-to-image case");
generation_mode = CommonGenerationMode::Text;
let num_images = match request.num_images {
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::One) => EnqueueBytedanceSeedreamV4p5TextToImageNumImages::One,
@@ -243,6 +248,26 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.image_size {
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Square) => Some(CommonAspectRatio::Square),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::SquareHd) => Some(CommonAspectRatio::SquareHd),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitFourThree) => Some(CommonAspectRatio::TallThreeByFour),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::PortraitSixteenNine) => Some(CommonAspectRatio::TallNineBySixteen),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeFourThree) => Some(CommonAspectRatio::WideFourByThree),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::LandscapeSixteenNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Auto2k) => Some(CommonAspectRatio::Auto2k),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenImageSize::Auto4k) => Some(CommonAspectRatio::Auto4k),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::One) => Some(1),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::Two) => Some(2),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::Three) => Some(3),
Some(BytedanceSeedreamV4p5MultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -252,10 +277,10 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -21,6 +21,8 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_gpt_image_1p5_edit_image_webhook::{enqueue_gpt_image_1p5_image_edit_webhook, EnqueueGptImage1p5EditImageArgs, EnqueueGptImage1p5EditImageBackground, EnqueueGptImage1p5EditImageInputFidelity, EnqueueGptImage1p5EditImageNumImages, EnqueueGptImage1p5EditImageQuality, EnqueueGptImage1p5EditImageSize};
@@ -173,9 +175,11 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = maybe_image_urls.as_deref() {
info!("gpt image 1.5 edit image");
generation_mode = CommonGenerationMode::Edit;
let mut num_images = match request.num_images {
Some(GptImage1p5MultiFunctionImageGenNumImages::One) => EnqueueGptImage1p5EditImageNumImages::One,
@@ -250,6 +254,7 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
} else {
info!("gpt image 1.5 text-to-image");
generation_mode = CommonGenerationMode::Text;
let mut num_images = match request.num_images {
Some(GptImage1p5MultiFunctionImageGenNumImages::One) => EnqueueGptImage1p5TextToImageNumImages::One,
@@ -333,6 +338,21 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.image_size {
Some(GptImage1p5MultiFunctionImageGenSize::Square) => Some(CommonAspectRatio::Square),
Some(GptImage1p5MultiFunctionImageGenSize::Wide) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GptImage1p5MultiFunctionImageGenSize::Tall) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GptImage1p5MultiFunctionImageGenNumImages::One) => Some(1),
Some(GptImage1p5MultiFunctionImageGenNumImages::Two) => Some(2),
Some(GptImage1p5MultiFunctionImageGenNumImages::Three) => Some(3),
Some(GptImage1p5MultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -342,10 +362,10 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -14,6 +14,9 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_resolution::CommonResolution;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_nano_banana_2_edit_image_webhook::{enqueue_nano_banana_2_edit_image_webhook, EnqueueNanoBanana2EditImageArgs, EnqueueNanoBanana2EditImageAspectRatio, EnqueueNanoBanana2EditImageNumImages, EnqueueNanoBanana2EditImageResolution};
use fal_client::requests::webhook::image::text::enqueue_nano_banana_2_text_to_image_webhook::{enqueue_nano_banana_2_text_to_image_webhook, EnqueueNanoBanana2TextToImageArgs, EnqueueNanoBanana2TextToImageAspectRatio, EnqueueNanoBanana2TextToImageNumImages, EnqueueNanoBanana2TextToImageResolution};
@@ -100,9 +103,11 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("nano banana 2 edit image");
generation_mode = CommonGenerationMode::Edit;
let num_images = match request.num_images {
Some(NanaBanana2MultiFunctionImageGenNumImages::One) => EnqueueNanoBanana2EditImageNumImages::One,
@@ -165,6 +170,7 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
} else {
info!("nano banana 2 text-to-image");
generation_mode = CommonGenerationMode::Text;
let num_images = match request.num_images {
Some(NanaBanana2MultiFunctionImageGenNumImages::One) => EnqueueNanoBanana2TextToImageNumImages::One,
@@ -244,6 +250,37 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
CommonWebError::ServerError
})?;
let maybe_aspect_ratio = match request.aspect_ratio {
Some(NanaBanana2MultiFunctionImageGenAspectRatio::Auto) => Some(CommonAspectRatio::Auto),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::OneByOne) => Some(CommonAspectRatio::Square),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::FiveByFour) => Some(CommonAspectRatio::WideFiveByFour),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::FourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::ThreeByTwo) => Some(CommonAspectRatio::WideThreeByTwo),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::SixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::TwentyOneByNine) => Some(CommonAspectRatio::WideTwentyOneByNine),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::FourByFive) => Some(CommonAspectRatio::TallFourByFive),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::ThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::TwoByThree) => Some(CommonAspectRatio::TallTwoByThree),
Some(NanaBanana2MultiFunctionImageGenAspectRatio::NineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_resolution = match request.resolution {
Some(NanaBanana2MultiFunctionImageGenImageResolution::HalfK) => None,
Some(NanaBanana2MultiFunctionImageGenImageResolution::OneK) => Some(CommonResolution::OneK),
Some(NanaBanana2MultiFunctionImageGenImageResolution::TwoK) => Some(CommonResolution::TwoK),
Some(NanaBanana2MultiFunctionImageGenImageResolution::FourK) => Some(CommonResolution::FourK),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(NanaBanana2MultiFunctionImageGenNumImages::One) => Some(1),
Some(NanaBanana2MultiFunctionImageGenNumImages::Two) => Some(2),
Some(NanaBanana2MultiFunctionImageGenNumImages::Three) => Some(3),
Some(NanaBanana2MultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -253,10 +290,10 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -22,6 +22,8 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_gemini_25_flash_edit_webhook::{enqueue_gemini_25_flash_edit_webhook, Gemini25FlashEditArgs, Gemini25FlashEditAspectRatio, Gemini25FlashEditNumImages};
@@ -142,9 +144,11 @@ pub async fn nano_banana_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("nano banana edit image");
generation_mode = CommonGenerationMode::Edit;
let mut num_images = match request.num_images {
Some(NanoBananaMultiFunctionImageGenNumImages::One) => Gemini25FlashEditNumImages::One,
@@ -202,6 +206,7 @@ pub async fn nano_banana_multi_function_image_gen_handler(
} else {
info!("nano banana text-to-image");
generation_mode = CommonGenerationMode::Text;
let mut num_images = match request.num_images {
Some(NanoBananaMultiFunctionImageGenNumImages::One) => Gemini25FlashTextToImageNumImages::One,
@@ -276,6 +281,29 @@ pub async fn nano_banana_multi_function_image_gen_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(NanoBananaMultiFunctionImageGenAspectRatio::Auto) => Some(CommonAspectRatio::Auto),
Some(NanoBananaMultiFunctionImageGenAspectRatio::OneByOne) => Some(CommonAspectRatio::Square),
Some(NanoBananaMultiFunctionImageGenAspectRatio::FiveByFour) => Some(CommonAspectRatio::WideFiveByFour),
Some(NanoBananaMultiFunctionImageGenAspectRatio::FourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(NanoBananaMultiFunctionImageGenAspectRatio::ThreeByTwo) => Some(CommonAspectRatio::WideThreeByTwo),
Some(NanoBananaMultiFunctionImageGenAspectRatio::SixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(NanoBananaMultiFunctionImageGenAspectRatio::TwentyOneByNine) => Some(CommonAspectRatio::WideTwentyOneByNine),
Some(NanoBananaMultiFunctionImageGenAspectRatio::FourByFive) => Some(CommonAspectRatio::TallFourByFive),
Some(NanoBananaMultiFunctionImageGenAspectRatio::ThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(NanoBananaMultiFunctionImageGenAspectRatio::TwoByThree) => Some(CommonAspectRatio::TallTwoByThree),
Some(NanoBananaMultiFunctionImageGenAspectRatio::NineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(NanoBananaMultiFunctionImageGenNumImages::One) => Some(1),
Some(NanoBananaMultiFunctionImageGenNumImages::Two) => Some(2),
Some(NanoBananaMultiFunctionImageGenNumImages::Three) => Some(3),
Some(NanoBananaMultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -285,10 +313,10 @@ pub async fn nano_banana_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -21,6 +21,9 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_resolution::CommonResolution;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::edit::enqueue_nano_banana_pro_edit_image_webhook::{enqueue_nano_banana_pro_image_edit_webhook, EnqueueNanoBananaProEditImageArgs, EnqueueNanoBananaProEditImageAspectRatio, EnqueueNanoBananaProEditImageNumImages, EnqueueNanoBananaProEditImageResolution};
@@ -139,9 +142,11 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(input_image_urls) = image_urls.as_deref() {
info!("nano banana pro edit image");
generation_mode = CommonGenerationMode::Edit;
let mut num_images = match request.num_images {
Some(NanoBananaProMultiFunctionImageGenNumImages::One) => EnqueueNanoBananaProEditImageNumImages::One,
@@ -208,6 +213,7 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
} else {
info!("nano banana pro text-to-image");
generation_mode = CommonGenerationMode::Text;
let mut num_images = match request.num_images {
Some(NanoBananaProMultiFunctionImageGenNumImages::One) => EnqueueNanoBananaProTextToImageNumImages::One,
@@ -291,6 +297,36 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(NanoBananaProMultiFunctionImageGenAspectRatio::Auto) => Some(CommonAspectRatio::Auto),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::OneByOne) => Some(CommonAspectRatio::Square),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::FiveByFour) => Some(CommonAspectRatio::WideFiveByFour),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::FourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::ThreeByTwo) => Some(CommonAspectRatio::WideThreeByTwo),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::SixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::TwentyOneByNine) => Some(CommonAspectRatio::WideTwentyOneByNine),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::FourByFive) => Some(CommonAspectRatio::TallFourByFive),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::ThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::TwoByThree) => Some(CommonAspectRatio::TallTwoByThree),
Some(NanoBananaProMultiFunctionImageGenAspectRatio::NineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_resolution = match request.resolution {
Some(NanoBananaProMultiFunctionImageGenImageResolution::OneK) => Some(CommonResolution::OneK),
Some(NanoBananaProMultiFunctionImageGenImageResolution::TwoK) => Some(CommonResolution::TwoK),
Some(NanoBananaProMultiFunctionImageGenImageResolution::FourK) => Some(CommonResolution::FourK),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(NanoBananaProMultiFunctionImageGenNumImages::One) => Some(1),
Some(NanoBananaProMultiFunctionImageGenNumImages::Two) => Some(2),
Some(NanoBananaProMultiFunctionImageGenNumImages::Three) => Some(3),
Some(NanoBananaProMultiFunctionImageGenNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -300,10 +336,10 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio,
maybe_resolution,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -15,6 +15,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::requests::webhook::image::text::enqueue_flux_1_dev_text_to_image_webhook::enqueue_flux_1_dev_text_to_image_webhook;
use fal_client::requests::webhook::image::text::enqueue_flux_1_dev_text_to_image_webhook::{Flux1DevArgs, Flux1DevAspectRatio, Flux1DevNumImages};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -187,6 +189,24 @@ pub async fn generate_flux_1_dev_text_to_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(GenerateFlux1DevTextToImageAspectRatio::Square) => Some(CommonAspectRatio::Square),
Some(GenerateFlux1DevTextToImageAspectRatio::SquareHd) => Some(CommonAspectRatio::SquareHd),
Some(GenerateFlux1DevTextToImageAspectRatio::LandscapeFourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(GenerateFlux1DevTextToImageAspectRatio::LandscapeSixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GenerateFlux1DevTextToImageAspectRatio::PortraitThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(GenerateFlux1DevTextToImageAspectRatio::PortraitNineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GenerateFlux1DevTextToImageNumImages::One) => Some(1),
Some(GenerateFlux1DevTextToImageNumImages::Two) => Some(2),
Some(GenerateFlux1DevTextToImageNumImages::Three) => Some(3),
Some(GenerateFlux1DevTextToImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -198,10 +218,10 @@ pub async fn generate_flux_1_dev_text_to_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Text),
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -283,7 +303,7 @@ async fn insert_mock_failure_job(
maybe_positive_prompt: prompt,
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Text), // TODO: This endpoint only supports "text" for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -12,6 +12,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::requests::webhook::image::text::enqueue_flux_1_schnell_text_to_image_webhook::enqueue_flux_1_schnell_text_to_image_webhook;
use fal_client::requests::webhook::image::text::enqueue_flux_1_schnell_text_to_image_webhook::{Flux1SchnellArgs, Flux1SchnellAspectRatio, Flux1SchnellNumImages};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -167,6 +169,24 @@ pub async fn generate_flux_1_schnell_text_to_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(GenerateFlux1SchnellTextToImageAspectRatio::Square) => Some(CommonAspectRatio::Square),
Some(GenerateFlux1SchnellTextToImageAspectRatio::SquareHd) => Some(CommonAspectRatio::SquareHd),
Some(GenerateFlux1SchnellTextToImageAspectRatio::LandscapeFourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(GenerateFlux1SchnellTextToImageAspectRatio::LandscapeSixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GenerateFlux1SchnellTextToImageAspectRatio::PortraitThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(GenerateFlux1SchnellTextToImageAspectRatio::PortraitNineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GenerateFlux1SchnellTextToImageNumImages::One) => Some(1),
Some(GenerateFlux1SchnellTextToImageNumImages::Two) => Some(2),
Some(GenerateFlux1SchnellTextToImageNumImages::Three) => Some(3),
Some(GenerateFlux1SchnellTextToImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -178,10 +198,10 @@ pub async fn generate_flux_1_schnell_text_to_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Text), // TODO: This endpoint only supports "text" for now
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -15,6 +15,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_text_to_image_webhook::FluxPro11Args;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_text_to_image_webhook::{enqueue_flux_pro_11_text_to_image_webhook, FluxPro11AspectRatio, FluxPro11NumImages};
@@ -153,6 +155,23 @@ pub async fn generate_flux_pro_11_text_to_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(GenerateFluxPro11TextToImageAspectRatio::Square) => Some(CommonAspectRatio::Square),
Some(GenerateFluxPro11TextToImageAspectRatio::LandscapeFourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(GenerateFluxPro11TextToImageAspectRatio::LandscapeSixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GenerateFluxPro11TextToImageAspectRatio::PortraitThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(GenerateFluxPro11TextToImageAspectRatio::PortraitNineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GenerateFluxPro11TextToImageNumImages::One) => Some(1),
Some(GenerateFluxPro11TextToImageNumImages::Two) => Some(2),
Some(GenerateFluxPro11TextToImageNumImages::Three) => Some(3),
Some(GenerateFluxPro11TextToImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -162,10 +181,10 @@ pub async fn generate_flux_pro_11_text_to_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Text), // TODO: This endpoint only supports "text" for now
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -15,6 +15,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_ultra_text_to_image_webhook::FluxPro11UltraArgs;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_ultra_text_to_image_webhook::{enqueue_flux_pro_11_ultra_text_to_image_webhook, FluxPro11UltraAspectRatio, FluxPro11UltraNumImages};
@@ -157,6 +159,27 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.aspect_ratio {
Some(GenerateFluxPro11UltraTextToImageAspectRatio::Square) => Some(CommonAspectRatio::Square),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::LandscapeThreeByTwo) => Some(CommonAspectRatio::WideThreeByTwo),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::LandscapeFourByThree) => Some(CommonAspectRatio::WideFourByThree),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::LandscapeSixteenByNine) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::LandscapeTwentyOneByNine) => Some(CommonAspectRatio::WideTwentyOneByNine),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::PortraitTwoByThree) => Some(CommonAspectRatio::TallTwoByThree),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::PortraitThreeByFour) => Some(CommonAspectRatio::TallThreeByFour),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::PortraitNineBySixteen) => Some(CommonAspectRatio::TallNineBySixteen),
Some(GenerateFluxPro11UltraTextToImageAspectRatio::PortraitNineByTwentyOne) => Some(CommonAspectRatio::TallNineByTwentyOne),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GenerateFluxPro11UltraTextToImageNumImages::One) => Some(1),
Some(GenerateFluxPro11UltraTextToImageNumImages::Two) => Some(2),
Some(GenerateFluxPro11UltraTextToImageNumImages::Three) => Some(3),
Some(GenerateFluxPro11UltraTextToImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -166,10 +189,10 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Text), // TODO: This endpoint only supports "text" for now
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -17,6 +17,8 @@ use enums::common::generation::common_model_type::CommonModelType;
use enums::common::payments_namespace::PaymentsNamespace;
use enums::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::text::enqueue_gpt_image_1_text_to_image_webhook::{enqueue_gpt_image_1_text_to_image_webhook, GptTextToImageByokArgs, GptTextToImageNumImages, GptTextToImageQuality, GptTextToImageSize};
@@ -199,6 +201,21 @@ pub async fn generate_gpt_image_1_text_to_image_handler(
})?;
// NB: Don't fail the job if the query fails.
let maybe_aspect_ratio = match request.image_size {
Some(GenerateGptImage1TextToImageImageSize::Square) => Some(CommonAspectRatio::Square),
Some(GenerateGptImage1TextToImageImageSize::Horizontal) => Some(CommonAspectRatio::WideSixteenByNine),
Some(GenerateGptImage1TextToImageImageSize::Vertical) => Some(CommonAspectRatio::TallNineBySixteen),
None => None,
};
let maybe_batch_count: Option<u8> = match request.num_images {
Some(GenerateGptImage1TextToImageNumImages::One) => Some(1),
Some(GenerateGptImage1TextToImageNumImages::Two) => Some(2),
Some(GenerateGptImage1TextToImageNumImages::Three) => Some(3),
Some(GenerateGptImage1TextToImageNumImages::Four) => Some(4),
None => None,
};
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
@@ -208,10 +225,10 @@ pub async fn generate_gpt_image_1_text_to_image_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Text), // TODO: This endpoint only supports "text" for now
maybe_aspect_ratio,
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -0,0 +1,5 @@
pub mod generate_flux_1_dev_text_to_image_handler;
pub mod generate_flux_1_schnell_text_to_image_handler;
pub mod generate_flux_pro_11_text_to_image_handler;
pub mod generate_flux_pro_11_ultra_text_to_image_handler;
pub mod generate_gpt_image_1_text_to_image_handler;
@@ -10,6 +10,11 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::object::generate_hunyuan_2_0_image_to_3d::GenerateHunyuan20ImageTo3dRequest;
use artcraft_api_defs::generate::object::generate_hunyuan_2_0_image_to_3d::GenerateHunyuan20ImageTo3dResponse;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_2_image_to_3d_webhook::enqueue_hunyuan_3d_2_image_to_3d_webhook;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_2_image_to_3d_webhook::Hunyuan3d2Args;
@@ -20,6 +25,9 @@ use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job
use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs;
use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token;
use mysql_queries::queries::media_files::get::get_media_file::{get_media_file, get_media_file_with_connection};
use mysql_queries::queries::prompt_context_items::insert_batch_prompt_context_items::{insert_batch_prompt_context_items, InsertBatchArgs, PromptContextItem};
use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs};
use sqlx::Acquire;
use utoipa::ToSchema;
/// Hunyuan 2.0 Image to 3D
@@ -145,17 +153,74 @@ pub async fn generate_hunyuan_2_0_image_to_3d_handler(
let ip_address = get_request_ip(&http_request);
let mut transaction = mysql_connection.begin().await.map_err(|err| {
error!("Error starting MySQL transaction: {:?}", err);
CommonWebError::ServerError
})?;
// Insert prompt record if we have a prompt
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_model_type: Some(CommonModelType::Hunyuan3d2_0),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_positive_prompt: None,
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
})
.await;
let prompt_token = match prompt_result {
Ok(token) => Some(token),
Err(err) => {
warn!("Error inserting prompt: {:?}", err);
None // Don't fail the job if the prompt insertion fails.
}
};
// Insert context items for any images used
if let Some(token) = prompt_token.as_ref() {
let mut context_items = Vec::new();
context_items.push(PromptContextItem {
media_token: media_file.token.clone(),
context_semantic_type: PromptContextSemanticType::Imgref,
});
if !context_items.is_empty() {
let result = insert_batch_prompt_context_items(InsertBatchArgs {
prompt_token: token.clone(),
items: context_items,
transaction: &mut transaction,
}).await;
if let Err(err) = result {
// NB: Fail open.
warn!("Error inserting batch prompt context items: {:?}", err);
}
}
}
let db_result = insert_generic_inference_job_for_fal_queue(InsertGenericInferenceForFalArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
maybe_external_third_party_id: &external_job_id,
fal_category: FalCategory::ObjectGeneration,
maybe_inference_args: None,
maybe_prompt_token: None,
maybe_prompt_token: prompt_token.as_ref(),
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
mysql_executor: &mut *mysql_connection,
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -167,6 +232,11 @@ pub async fn generate_hunyuan_2_0_image_to_3d_handler(
}
};
let _r = transaction.commit().await.map_err(|err| {
error!("Error committing MySQL transaction: {:?}", err);
CommonWebError::ServerError
})?;
Ok(Json(GenerateHunyuan20ImageTo3dResponse {
success: true,
inference_job_token: job_token,
@@ -15,12 +15,19 @@ use fal_client::requests::webhook::object::enqueue_hunyuan_3d_21_image_to_3d_web
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_21_image_to_3d_webhook::Hunyuan3d21Args;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{error, info, warn};
use sqlx::Acquire;
use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue;
use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::FalCategory;
use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs;
use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token;
use mysql_queries::queries::media_files::get::get_media_file::{get_media_file, get_media_file_with_connection};
use utoipa::ToSchema;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use mysql_queries::queries::prompt_context_items::insert_batch_prompt_context_items::{insert_batch_prompt_context_items, InsertBatchArgs, PromptContextItem};
use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs};
/// Hunyuan 2.1 Image to 3D
#[utoipa::path(
@@ -145,17 +152,74 @@ pub async fn generate_hunyuan_2_1_image_to_3d_handler(
let ip_address = get_request_ip(&http_request);
let mut transaction = mysql_connection.begin().await.map_err(|err| {
error!("Error starting MySQL transaction: {:?}", err);
CommonWebError::ServerError
})?;
// Insert prompt record if we have a prompt
let prompt_result = insert_prompt(InsertPromptArgs {
maybe_apriori_prompt_token: None,
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_model_type: Some(CommonModelType::Hunyuan3d2_1),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_positive_prompt: None,
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
})
.await;
let prompt_token = match prompt_result {
Ok(token) => Some(token),
Err(err) => {
warn!("Error inserting prompt: {:?}", err);
None // Don't fail the job if the prompt insertion fails.
}
};
// Insert context items for any images used
if let Some(token) = prompt_token.as_ref() {
let mut context_items = Vec::new();
context_items.push(PromptContextItem {
media_token: media_file.token.clone(),
context_semantic_type: PromptContextSemanticType::Imgref,
});
if !context_items.is_empty() {
let result = insert_batch_prompt_context_items(InsertBatchArgs {
prompt_token: token.clone(),
items: context_items,
transaction: &mut transaction,
}).await;
if let Err(err) = result {
// NB: Fail open.
warn!("Error inserting batch prompt context items: {:?}", err);
}
}
}
let db_result = insert_generic_inference_job_for_fal_queue(InsertGenericInferenceForFalArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
maybe_external_third_party_id: &external_job_id,
fal_category: FalCategory::ObjectGeneration,
maybe_inference_args: None,
maybe_prompt_token: None,
maybe_prompt_token: prompt_token.as_ref(),
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
mysql_executor: &mut *mysql_connection,
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -167,6 +231,11 @@ pub async fn generate_hunyuan_2_1_image_to_3d_handler(
}
};
let _r = transaction.commit().await.map_err(|err| {
error!("Error committing MySQL transaction: {:?}", err);
CommonWebError::ServerError
})?;
Ok(Json(GenerateHunyuan21ImageTo3dResponse {
success: true,
inference_job_token: job_token,
@@ -307,7 +307,7 @@ pub async fn generate_hunyuan3d_v3_multi_function_object_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -15,6 +15,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{error, info, warn};
use mysql_queries::queries::generic_inference::worldlabs::insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token::{insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token, InsertGenericInferenceForWorldlabsWithAprioriJobTokenArgs};
@@ -179,7 +180,7 @@ pub async fn generate_worldlabs_marble_0p1_mini_splat_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Reference),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -15,6 +15,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{error, info, warn};
use mysql_queries::queries::generic_inference::worldlabs::insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token::{insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token, InsertGenericInferenceForWorldlabsWithAprioriJobTokenArgs};
@@ -179,7 +180,7 @@ pub async fn generate_worldlabs_marble_0p1_plus_splat_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Reference),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -33,6 +33,8 @@ use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPrompt
use sqlx::Acquire;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use utoipa::ToSchema;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
/// Kling 1.6 Pro Image to Video
#[utoipa::path(
@@ -221,8 +223,12 @@ pub async fn generate_kling_1_6_pro_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateKling16ProAspectRatio::Square => CommonAspectRatio::Square,
GenerateKling16ProAspectRatio::WideSixteenNine => CommonAspectRatio::WideSixteenByNine,
GenerateKling16ProAspectRatio::TallNineSixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -30,6 +30,8 @@ use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPrompt
use sqlx::Acquire;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use utoipa::ToSchema;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
/// Kling 2.1 Master Image to Video
#[utoipa::path(
@@ -208,8 +210,12 @@ pub async fn generate_kling_2_1_master_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateKling21MasterAspectRatio::Square => CommonAspectRatio::Square,
GenerateKling21MasterAspectRatio::WideSixteenNine => CommonAspectRatio::WideSixteenByNine,
GenerateKling21MasterAspectRatio::TallNineSixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -35,6 +35,8 @@ use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPrompt
use sqlx::Acquire;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use utoipa::ToSchema;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
/// Kling 2.1 Pro Image to Video
#[utoipa::path(
@@ -223,8 +225,12 @@ pub async fn generate_kling_2_1_pro_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateKling21ProAspectRatio::Square => CommonAspectRatio::Square,
GenerateKling21ProAspectRatio::WideSixteenNine => CommonAspectRatio::WideSixteenByNine,
GenerateKling21ProAspectRatio::TallNineSixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -20,6 +20,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_lite_image_to_video_webhook::Seedance1LiteDuration;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_lite_image_to_video_webhook::{enqueue_seedance_1_lite_image_to_video_webhook, Seedance1LiteAspectRatio};
@@ -238,8 +240,16 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateSeedance10LiteAspectRatio::Auto => CommonAspectRatio::Auto,
GenerateSeedance10LiteAspectRatio::TwentyOneByNine => CommonAspectRatio::WideTwentyOneByNine,
GenerateSeedance10LiteAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
GenerateSeedance10LiteAspectRatio::FourByThree => CommonAspectRatio::WideFourByThree,
GenerateSeedance10LiteAspectRatio::Square => CommonAspectRatio::Square,
GenerateSeedance10LiteAspectRatio::ThreeByFour => CommonAspectRatio::TallThreeByFour,
GenerateSeedance10LiteAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -20,6 +20,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_pro_image_to_video_webhook::enqueue_seedance_1_pro_image_to_video_webhook;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_pro_image_to_video_webhook::Seedance1ProDuration;
@@ -215,7 +216,7 @@ pub async fn generate_seedance_1_0_pro_image_to_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -20,6 +20,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_2_image_to_video_webhook::enqueue_veo_2_image_to_video_webhook;
use fal_client::requests::webhook::video::image::enqueue_veo_2_image_to_video_webhook::Veo2Args;
@@ -219,8 +221,13 @@ pub async fn generate_veo_2_image_to_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateVeo2AspectRatio::Auto => CommonAspectRatio::Auto,
GenerateVeo2AspectRatio::AutoPreferPortrait => CommonAspectRatio::Auto,
GenerateVeo2AspectRatio::WideSixteenNine => CommonAspectRatio::WideSixteenByNine,
GenerateVeo2AspectRatio::TallNineSixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -17,6 +17,7 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3_fast_image_to_video_webhook::{enqueue_veo_3_fast_image_to_video_webhook, Veo3FastArgs, Veo3FastDuration, Veo3FastResolution};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -212,11 +213,11 @@ pub async fn generate_veo_3_fast_image_to_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -17,6 +17,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3_image_to_video_webhook::{enqueue_veo_3_image_to_video_webhook, Veo3Args, Veo3AspectRatio, Veo3Duration, Veo3Resolution};
use http_server_common::request::get_request_ip::get_request_ip;
@@ -220,11 +222,15 @@ pub async fn generate_veo_3_image_to_video_handler(
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(CommonGenerationMode::Keyframe), // TODO: This endpoint only supports keyframes for now
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
GenerateVeo3AspectRatio::WideSixteenNine => CommonAspectRatio::WideSixteenByNine,
GenerateVeo3AspectRatio::TallNineSixteen => CommonAspectRatio::TallNineBySixteen,
GenerateVeo3AspectRatio::Square => CommonAspectRatio::Square,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -0,0 +1,8 @@
pub mod generate_kling_1_6_pro_video_handler;
pub mod generate_kling_2_1_master_video_handler;
pub mod generate_kling_2_1_pro_video_handler;
pub mod generate_seedance_1_0_lite_image_to_video_handler;
pub mod generate_seedance_1_0_pro_image_to_video_handler;
pub mod generate_veo_2_image_to_video_handler;
pub mod generate_veo_3_fast_image_to_video_handler;
pub mod generate_veo_3_image_to_video_handler;
@@ -1,9 +1,2 @@
pub mod generate_kling_1_6_pro_video_handler;
pub mod generate_kling_2_1_master_video_handler;
pub mod generate_kling_2_1_pro_video_handler;
pub mod generate_seedance_1_0_lite_image_to_video_handler;
pub mod generate_seedance_1_0_pro_image_to_video_handler;
pub mod generate_veo_2_image_to_video_handler;
pub mod generate_veo_3_fast_image_to_video_handler;
pub mod generate_veo_3_image_to_video_handler;
pub mod image;
pub mod multi_function;
@@ -16,8 +16,10 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_5_turbo_multi_fu
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -149,10 +151,13 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(start_frame_url) = maybe_start_frame_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Kling2p5TurboProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKlingV2p5TurboProImageToVideoDurationSeconds::Five,
Some(Kling2p5TurboProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKlingV2p5TurboProImageToVideoDurationSeconds::Ten,
@@ -189,7 +194,9 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Kling2p5TurboProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKlingV2p5TurboProTextToVideoDurationSeconds::Five,
Some(Kling2p5TurboProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKlingV2p5TurboProTextToVideoDurationSeconds::Ten,
@@ -261,8 +268,12 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Kling2p5TurboProMultiFunctionVideoGenAspectRatio::Square => CommonAspectRatio::Square,
Kling2p5TurboProMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Kling2p5TurboProMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -16,8 +16,10 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_6_multi_function
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -147,9 +149,11 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(start_frame_url) = maybe_start_frame_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Kling2p6ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKlingV2p6ProImageToVideoDurationSeconds::Five,
@@ -187,6 +191,7 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Kling2p6ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKlingV2p6ProTextToVideoDurationSeconds::Five,
@@ -260,11 +265,15 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Kling2p6ProMultiFunctionVideoGenAspectRatio::Square => CommonAspectRatio::Square,
Kling2p6ProMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Kling2p6ProMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: request.generate_audio,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -16,8 +16,10 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_pro_multi_func
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -40,61 +42,6 @@ use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::media_files::MediaFileToken;
use utoipa::ToSchema;
fn map_duration_i2v(duration: Option<Kling3p0ProMultiFunctionVideoGenDuration>) -> EnqueueKling3p0ProImageToVideoDuration {
match duration {
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0ProImageToVideoDuration::ThreeSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0ProImageToVideoDuration::FourSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0ProImageToVideoDuration::FiveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0ProImageToVideoDuration::SixSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0ProImageToVideoDuration::SevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0ProImageToVideoDuration::EightSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0ProImageToVideoDuration::NineSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0ProImageToVideoDuration::TenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0ProImageToVideoDuration::ElevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0ProImageToVideoDuration::TwelveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::ThirteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::FourteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0ProImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(duration: Option<Kling3p0ProMultiFunctionVideoGenDuration>) -> EnqueueKling3p0ProTextToVideoDuration {
match duration {
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0ProTextToVideoDuration::ThreeSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0ProTextToVideoDuration::FourSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0ProTextToVideoDuration::FiveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0ProTextToVideoDuration::SixSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0ProTextToVideoDuration::SevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0ProTextToVideoDuration::EightSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0ProTextToVideoDuration::NineSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0ProTextToVideoDuration::TenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0ProTextToVideoDuration::ElevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0ProTextToVideoDuration::TwelveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::ThirteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::FourteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0ProTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_t2v(aspect_ratio: Option<Kling3p0ProMultiFunctionVideoGenAspectRatio>) -> EnqueueKling3p0ProTextToVideoAspectRatio {
match aspect_ratio {
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueKling3p0ProTextToVideoAspectRatio::Square,
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueKling3p0ProTextToVideoAspectRatio::SixteenByNine,
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueKling3p0ProTextToVideoAspectRatio::NineBySixteen,
None => EnqueueKling3p0ProTextToVideoAspectRatio::Square,
}
}
fn map_aspect_ratio_i2v(aspect_ratio: Option<Kling3p0ProMultiFunctionVideoGenAspectRatio>) -> Option<EnqueueKling3p0ProImageToVideoAspectRatio> {
aspect_ratio.map(|ar| match ar {
Kling3p0ProMultiFunctionVideoGenAspectRatio::Square => EnqueueKling3p0ProImageToVideoAspectRatio::Square,
Kling3p0ProMultiFunctionVideoGenAspectRatio::SixteenByNine => EnqueueKling3p0ProImageToVideoAspectRatio::SixteenByNine,
Kling3p0ProMultiFunctionVideoGenAspectRatio::NineBySixteen => EnqueueKling3p0ProImageToVideoAspectRatio::NineBySixteen,
})
}
/// Kling 3.0 Pro Multi-Function (text and image to video)
#[utoipa::path(
post,
@@ -204,9 +151,11 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
let generate_audio = request.generate_audio.unwrap_or(true);
let fal_result;
let generation_mode;
if let Some(start_frame_url) = maybe_start_frame_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = map_duration_i2v(request.duration);
let aspect_ratio = map_aspect_ratio_i2v(request.aspect_ratio);
@@ -244,6 +193,7 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = map_duration_t2v(request.duration);
@@ -309,11 +259,15 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Kling3p0ProMultiFunctionVideoGenAspectRatio::Square => CommonAspectRatio::Square,
Kling3p0ProMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Kling3p0ProMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -397,3 +351,58 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
inference_job_token: job_token,
}))
}
fn map_duration_i2v(duration: Option<Kling3p0ProMultiFunctionVideoGenDuration>) -> EnqueueKling3p0ProImageToVideoDuration {
match duration {
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0ProImageToVideoDuration::ThreeSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0ProImageToVideoDuration::FourSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0ProImageToVideoDuration::FiveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0ProImageToVideoDuration::SixSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0ProImageToVideoDuration::SevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0ProImageToVideoDuration::EightSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0ProImageToVideoDuration::NineSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0ProImageToVideoDuration::TenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0ProImageToVideoDuration::ElevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0ProImageToVideoDuration::TwelveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::ThirteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::FourteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0ProImageToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0ProImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(duration: Option<Kling3p0ProMultiFunctionVideoGenDuration>) -> EnqueueKling3p0ProTextToVideoDuration {
match duration {
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0ProTextToVideoDuration::ThreeSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0ProTextToVideoDuration::FourSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0ProTextToVideoDuration::FiveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0ProTextToVideoDuration::SixSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0ProTextToVideoDuration::SevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0ProTextToVideoDuration::EightSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0ProTextToVideoDuration::NineSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0ProTextToVideoDuration::TenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0ProTextToVideoDuration::ElevenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0ProTextToVideoDuration::TwelveSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::ThirteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::FourteenSeconds,
Some(Kling3p0ProMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0ProTextToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0ProTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_t2v(aspect_ratio: Option<Kling3p0ProMultiFunctionVideoGenAspectRatio>) -> EnqueueKling3p0ProTextToVideoAspectRatio {
match aspect_ratio {
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueKling3p0ProTextToVideoAspectRatio::Square,
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueKling3p0ProTextToVideoAspectRatio::SixteenByNine,
Some(Kling3p0ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueKling3p0ProTextToVideoAspectRatio::NineBySixteen,
None => EnqueueKling3p0ProTextToVideoAspectRatio::Square,
}
}
fn map_aspect_ratio_i2v(aspect_ratio: Option<Kling3p0ProMultiFunctionVideoGenAspectRatio>) -> Option<EnqueueKling3p0ProImageToVideoAspectRatio> {
aspect_ratio.map(|ar| match ar {
Kling3p0ProMultiFunctionVideoGenAspectRatio::Square => EnqueueKling3p0ProImageToVideoAspectRatio::Square,
Kling3p0ProMultiFunctionVideoGenAspectRatio::SixteenByNine => EnqueueKling3p0ProImageToVideoAspectRatio::SixteenByNine,
Kling3p0ProMultiFunctionVideoGenAspectRatio::NineBySixteen => EnqueueKling3p0ProImageToVideoAspectRatio::NineBySixteen,
})
}
@@ -16,8 +16,10 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_standard_multi
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -40,61 +42,6 @@ use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::media_files::MediaFileToken;
use utoipa::ToSchema;
fn map_duration_i2v(duration: Option<Kling3p0StandardMultiFunctionVideoGenDuration>) -> EnqueueKling3p0StandardImageToVideoDuration {
match duration {
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ThreeSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FourSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FiveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0StandardImageToVideoDuration::SixSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::SevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0StandardImageToVideoDuration::EightSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0StandardImageToVideoDuration::NineSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::TenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ElevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0StandardImageToVideoDuration::TwelveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ThirteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FourteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0StandardImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(duration: Option<Kling3p0StandardMultiFunctionVideoGenDuration>) -> EnqueueKling3p0StandardTextToVideoDuration {
match duration {
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ThreeSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FourSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FiveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0StandardTextToVideoDuration::SixSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::SevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0StandardTextToVideoDuration::EightSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0StandardTextToVideoDuration::NineSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::TenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ElevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0StandardTextToVideoDuration::TwelveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ThirteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FourteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0StandardTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_t2v(aspect_ratio: Option<Kling3p0StandardMultiFunctionVideoGenAspectRatio>) -> EnqueueKling3p0StandardTextToVideoAspectRatio {
match aspect_ratio {
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::Square) => EnqueueKling3p0StandardTextToVideoAspectRatio::Square,
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueKling3p0StandardTextToVideoAspectRatio::SixteenByNine,
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueKling3p0StandardTextToVideoAspectRatio::NineBySixteen,
None => EnqueueKling3p0StandardTextToVideoAspectRatio::Square,
}
}
fn map_aspect_ratio_i2v(aspect_ratio: Option<Kling3p0StandardMultiFunctionVideoGenAspectRatio>) -> Option<EnqueueKling3p0StandardImageToVideoAspectRatio> {
aspect_ratio.map(|ar| match ar {
Kling3p0StandardMultiFunctionVideoGenAspectRatio::Square => EnqueueKling3p0StandardImageToVideoAspectRatio::Square,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::SixteenByNine => EnqueueKling3p0StandardImageToVideoAspectRatio::SixteenByNine,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::NineBySixteen => EnqueueKling3p0StandardImageToVideoAspectRatio::NineBySixteen,
})
}
/// Kling 3.0 Standard Multi-Function (text and image to video)
#[utoipa::path(
post,
@@ -204,9 +151,11 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
let generate_audio = request.generate_audio.unwrap_or(true);
let fal_result;
let generation_mode;
if let Some(start_frame_url) = maybe_start_frame_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = map_duration_i2v(request.duration);
let aspect_ratio = map_aspect_ratio_i2v(request.aspect_ratio);
@@ -244,6 +193,7 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = map_duration_t2v(request.duration);
@@ -309,11 +259,15 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Kling3p0StandardMultiFunctionVideoGenAspectRatio::Square => CommonAspectRatio::Square,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -397,3 +351,58 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
inference_job_token: job_token,
}))
}
fn map_duration_i2v(duration: Option<Kling3p0StandardMultiFunctionVideoGenDuration>) -> EnqueueKling3p0StandardImageToVideoDuration {
match duration {
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ThreeSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FourSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FiveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0StandardImageToVideoDuration::SixSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::SevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0StandardImageToVideoDuration::EightSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0StandardImageToVideoDuration::NineSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::TenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ElevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0StandardImageToVideoDuration::TwelveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::ThirteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FourteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0StandardImageToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0StandardImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(duration: Option<Kling3p0StandardMultiFunctionVideoGenDuration>) -> EnqueueKling3p0StandardTextToVideoDuration {
match duration {
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThreeSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ThreeSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FourSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FiveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SixSeconds) => EnqueueKling3p0StandardTextToVideoDuration::SixSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::SevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::EightSeconds) => EnqueueKling3p0StandardTextToVideoDuration::EightSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::NineSeconds) => EnqueueKling3p0StandardTextToVideoDuration::NineSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::TenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ElevenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueKling3p0StandardTextToVideoDuration::TwelveSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::ThirteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::ThirteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FourteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FourteenSeconds,
Some(Kling3p0StandardMultiFunctionVideoGenDuration::FifteenSeconds) => EnqueueKling3p0StandardTextToVideoDuration::FifteenSeconds,
None => EnqueueKling3p0StandardTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_t2v(aspect_ratio: Option<Kling3p0StandardMultiFunctionVideoGenAspectRatio>) -> EnqueueKling3p0StandardTextToVideoAspectRatio {
match aspect_ratio {
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::Square) => EnqueueKling3p0StandardTextToVideoAspectRatio::Square,
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueKling3p0StandardTextToVideoAspectRatio::SixteenByNine,
Some(Kling3p0StandardMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueKling3p0StandardTextToVideoAspectRatio::NineBySixteen,
None => EnqueueKling3p0StandardTextToVideoAspectRatio::Square,
}
}
fn map_aspect_ratio_i2v(aspect_ratio: Option<Kling3p0StandardMultiFunctionVideoGenAspectRatio>) -> Option<EnqueueKling3p0StandardImageToVideoAspectRatio> {
aspect_ratio.map(|ar| match ar {
Kling3p0StandardMultiFunctionVideoGenAspectRatio::Square => EnqueueKling3p0StandardImageToVideoAspectRatio::Square,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::SixteenByNine => EnqueueKling3p0StandardImageToVideoAspectRatio::SixteenByNine,
Kling3p0StandardMultiFunctionVideoGenAspectRatio::NineBySixteen => EnqueueKling3p0StandardImageToVideoAspectRatio::NineBySixteen,
})
}
@@ -12,8 +12,10 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::seedance_1p5_pro_multi_function_video_gen::{Seedance1p5ProMultiFunctionVideoGenAspectRatio, Seedance1p5ProMultiFunctionVideoGenDuration, Seedance1p5ProMultiFunctionVideoGenRequest, Seedance1p5ProMultiFunctionVideoGenResolution, Seedance1p5ProMultiFunctionVideoGenResponse};
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_seedance_1p5_pro_image_to_video_webhook::{enqueue_seedance_1p5_pro_image_to_video_webhook, EnqueueSeedance1p5ProImageToVideoArgs, EnqueueSeedance1p5ProImageToVideoAspectRatio, EnqueueSeedance1p5ProImageToVideoDuration, EnqueueSeedance1p5ProImageToVideoResolution};
@@ -28,79 +30,6 @@ use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPrompt
use sqlx::Acquire;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
fn map_duration_i2v(d: Option<Seedance1p5ProMultiFunctionVideoGenDuration>) -> EnqueueSeedance1p5ProImageToVideoDuration {
match d {
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::FourSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::FiveSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::SixSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::SevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::EightSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::NineSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::TenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::ElevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::TwelveSeconds,
None => EnqueueSeedance1p5ProImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(d: Option<Seedance1p5ProMultiFunctionVideoGenDuration>) -> EnqueueSeedance1p5ProTextToVideoDuration {
match d {
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::FourSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::FiveSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::SixSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::SevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::EightSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::NineSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::TenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::ElevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::TwelveSeconds,
None => EnqueueSeedance1p5ProTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_i2v(ar: Option<Seedance1p5ProMultiFunctionVideoGenAspectRatio>) -> EnqueueSeedance1p5ProImageToVideoAspectRatio {
match ar {
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::TwentyOneByNine) => EnqueueSeedance1p5ProImageToVideoAspectRatio::TwentyOneByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueSeedance1p5ProImageToVideoAspectRatio::SixteenByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::FourByThree) => EnqueueSeedance1p5ProImageToVideoAspectRatio::FourByThree,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueSeedance1p5ProImageToVideoAspectRatio::Square,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::ThreeByFour) => EnqueueSeedance1p5ProImageToVideoAspectRatio::ThreeByFour,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueSeedance1p5ProImageToVideoAspectRatio::NineBySixteen,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Auto) => EnqueueSeedance1p5ProImageToVideoAspectRatio::Auto,
None => EnqueueSeedance1p5ProImageToVideoAspectRatio::SixteenByNine,
}
}
fn map_aspect_ratio_t2v(ar: Option<Seedance1p5ProMultiFunctionVideoGenAspectRatio>) -> EnqueueSeedance1p5ProTextToVideoAspectRatio {
match ar {
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::TwentyOneByNine) => EnqueueSeedance1p5ProTextToVideoAspectRatio::TwentyOneByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::FourByThree) => EnqueueSeedance1p5ProTextToVideoAspectRatio::FourByThree,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueSeedance1p5ProTextToVideoAspectRatio::Square,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::ThreeByFour) => EnqueueSeedance1p5ProTextToVideoAspectRatio::ThreeByFour,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueSeedance1p5ProTextToVideoAspectRatio::NineBySixteen,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Auto) => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
None => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
}
}
fn map_resolution_i2v(r: Option<Seedance1p5ProMultiFunctionVideoGenResolution>) -> EnqueueSeedance1p5ProImageToVideoResolution {
match r {
Some(Seedance1p5ProMultiFunctionVideoGenResolution::FourEightyP) => EnqueueSeedance1p5ProImageToVideoResolution::FourEightyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::SevenTwentyP) => EnqueueSeedance1p5ProImageToVideoResolution::SevenTwentyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::TenEightyP) => EnqueueSeedance1p5ProImageToVideoResolution::TenEightyP,
None => EnqueueSeedance1p5ProImageToVideoResolution::SevenTwentyP,
}
}
fn map_resolution_t2v(r: Option<Seedance1p5ProMultiFunctionVideoGenResolution>) -> EnqueueSeedance1p5ProTextToVideoResolution {
match r {
Some(Seedance1p5ProMultiFunctionVideoGenResolution::FourEightyP) => EnqueueSeedance1p5ProTextToVideoResolution::FourEightyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::SevenTwentyP) => EnqueueSeedance1p5ProTextToVideoResolution::SevenTwentyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::TenEightyP) => EnqueueSeedance1p5ProTextToVideoResolution::TenEightyP,
None => EnqueueSeedance1p5ProTextToVideoResolution::SevenTwentyP,
}
}
/// Seedance 1.5 Pro Multi-Function (text and image to video)
#[utoipa::path(
@@ -210,9 +139,11 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
let generate_audio = request.generate_audio.unwrap_or(true);
let fal_result;
let generation_mode;
if let Some(image_url) = maybe_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = map_duration_i2v(request.duration);
let aspect_ratio = map_aspect_ratio_i2v(request.aspect_ratio);
@@ -250,6 +181,7 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = map_duration_t2v(request.duration);
let aspect_ratio = map_aspect_ratio_t2v(request.aspect_ratio);
@@ -314,11 +246,19 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Seedance1p5ProMultiFunctionVideoGenAspectRatio::Auto => CommonAspectRatio::Auto,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::TwentyOneByNine => CommonAspectRatio::WideTwentyOneByNine,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::FourByThree => CommonAspectRatio::WideFourByThree,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::Square => CommonAspectRatio::Square,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::ThreeByFour => CommonAspectRatio::TallThreeByFour,
Seedance1p5ProMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -402,3 +342,77 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
inference_job_token: job_token,
}))
}
fn map_duration_i2v(d: Option<Seedance1p5ProMultiFunctionVideoGenDuration>) -> EnqueueSeedance1p5ProImageToVideoDuration {
match d {
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::FourSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::FiveSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::SixSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::SevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::EightSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::NineSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::TenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::ElevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueSeedance1p5ProImageToVideoDuration::TwelveSeconds,
None => EnqueueSeedance1p5ProImageToVideoDuration::FiveSeconds,
}
}
fn map_duration_t2v(d: Option<Seedance1p5ProMultiFunctionVideoGenDuration>) -> EnqueueSeedance1p5ProTextToVideoDuration {
match d {
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::FourSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::FiveSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::FiveSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SixSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::SixSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::SevenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::SevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::EightSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::EightSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::NineSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::NineSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::TenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::ElevenSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::ElevenSeconds,
Some(Seedance1p5ProMultiFunctionVideoGenDuration::TwelveSeconds) => EnqueueSeedance1p5ProTextToVideoDuration::TwelveSeconds,
None => EnqueueSeedance1p5ProTextToVideoDuration::FiveSeconds,
}
}
fn map_aspect_ratio_i2v(ar: Option<Seedance1p5ProMultiFunctionVideoGenAspectRatio>) -> EnqueueSeedance1p5ProImageToVideoAspectRatio {
match ar {
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::TwentyOneByNine) => EnqueueSeedance1p5ProImageToVideoAspectRatio::TwentyOneByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueSeedance1p5ProImageToVideoAspectRatio::SixteenByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::FourByThree) => EnqueueSeedance1p5ProImageToVideoAspectRatio::FourByThree,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueSeedance1p5ProImageToVideoAspectRatio::Square,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::ThreeByFour) => EnqueueSeedance1p5ProImageToVideoAspectRatio::ThreeByFour,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueSeedance1p5ProImageToVideoAspectRatio::NineBySixteen,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Auto) => EnqueueSeedance1p5ProImageToVideoAspectRatio::Auto,
None => EnqueueSeedance1p5ProImageToVideoAspectRatio::SixteenByNine,
}
}
fn map_aspect_ratio_t2v(ar: Option<Seedance1p5ProMultiFunctionVideoGenAspectRatio>) -> EnqueueSeedance1p5ProTextToVideoAspectRatio {
match ar {
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::TwentyOneByNine) => EnqueueSeedance1p5ProTextToVideoAspectRatio::TwentyOneByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::SixteenByNine) => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::FourByThree) => EnqueueSeedance1p5ProTextToVideoAspectRatio::FourByThree,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Square) => EnqueueSeedance1p5ProTextToVideoAspectRatio::Square,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::ThreeByFour) => EnqueueSeedance1p5ProTextToVideoAspectRatio::ThreeByFour,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::NineBySixteen) => EnqueueSeedance1p5ProTextToVideoAspectRatio::NineBySixteen,
Some(Seedance1p5ProMultiFunctionVideoGenAspectRatio::Auto) => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
None => EnqueueSeedance1p5ProTextToVideoAspectRatio::SixteenByNine,
}
}
fn map_resolution_i2v(r: Option<Seedance1p5ProMultiFunctionVideoGenResolution>) -> EnqueueSeedance1p5ProImageToVideoResolution {
match r {
Some(Seedance1p5ProMultiFunctionVideoGenResolution::FourEightyP) => EnqueueSeedance1p5ProImageToVideoResolution::FourEightyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::SevenTwentyP) => EnqueueSeedance1p5ProImageToVideoResolution::SevenTwentyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::TenEightyP) => EnqueueSeedance1p5ProImageToVideoResolution::TenEightyP,
None => EnqueueSeedance1p5ProImageToVideoResolution::SevenTwentyP,
}
}
fn map_resolution_t2v(r: Option<Seedance1p5ProMultiFunctionVideoGenResolution>) -> EnqueueSeedance1p5ProTextToVideoResolution {
match r {
Some(Seedance1p5ProMultiFunctionVideoGenResolution::FourEightyP) => EnqueueSeedance1p5ProTextToVideoResolution::FourEightyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::SevenTwentyP) => EnqueueSeedance1p5ProTextToVideoResolution::SevenTwentyP,
Some(Seedance1p5ProMultiFunctionVideoGenResolution::TenEightyP) => EnqueueSeedance1p5ProTextToVideoResolution::TenEightyP,
None => EnqueueSeedance1p5ProTextToVideoResolution::SevenTwentyP,
}
}
@@ -20,6 +20,8 @@ use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{error, info, warn};
use mysql_queries::queries::generic_inference::seedance2pro::insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token::{
@@ -179,6 +181,21 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
"Reference audio",
).await?;
let is_keyframe = request.start_frame_media_token.is_some()
|| request.end_frame_media_token.is_some();
let is_reference = request.reference_image_media_tokens.is_some()
|| request.reference_video_media_tokens.is_some()
|| request.reference_audio_media_tokens.is_some();
let generation_mode = if is_keyframe {
CommonGenerationMode::Keyframe
} else if is_reference {
CommonGenerationMode::Reference
} else {
CommonGenerationMode::Text
};
// --- Map request params to seedance2pro types ---
let resolution = match request.aspect_ratio {
@@ -273,10 +290,20 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Seedance2p0AspectRatio::Landscape16x9 => CommonAspectRatio::WideSixteenByNine,
Seedance2p0AspectRatio::Portrait9x16 => CommonAspectRatio::TallNineBySixteen,
Seedance2p0AspectRatio::Square1x1 => CommonAspectRatio::Square,
Seedance2p0AspectRatio::Standard4x3 => CommonAspectRatio::WideFourByThree,
Seedance2p0AspectRatio::Portrait3x4 => CommonAspectRatio::TallThreeByFour,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_batch_count: request.batch_count.map(|bc| match bc {
Seedance2p0BatchCount::One => 1,
Seedance2p0BatchCount::Two => 2,
Seedance2p0BatchCount::Four => 4,
}),
maybe_generate_audio: None,
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
@@ -17,8 +17,10 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_sora_2_image_to_video_webhook::{enqueue_sora_2_image_to_video_webhook, EnqueueSora2ImageToVideoArgs, EnqueueSora2ImageToVideoAspectRatio, EnqueueSora2ImageToVideoDurationSeconds, EnqueueSora2ImageToVideoResolution};
@@ -147,9 +149,11 @@ pub async fn sora_2_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(image_url) = maybe_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Sora2MultiFunctionVideoGenDuration::FourSeconds) => EnqueueSora2ImageToVideoDurationSeconds::Four,
@@ -201,6 +205,7 @@ pub async fn sora_2_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Sora2MultiFunctionVideoGenDuration::FourSeconds) => EnqueueSora2TextToVideoDurationSeconds::Four,
@@ -280,8 +285,12 @@ pub async fn sora_2_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Sora2MultiFunctionVideoGenAspectRatio::Auto => CommonAspectRatio::Auto,
Sora2MultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Sora2MultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -17,8 +17,10 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_sora_2_pro_image_to_video_webhook::{enqueue_sora_2_pro_image_to_video_webhook, EnqueueSora2ProImageToVideoArgs, EnqueueSora2ProImageToVideoAspectRatio, EnqueueSora2ProImageToVideoDurationSeconds, EnqueueSora2ProImageToVideoResolution};
@@ -147,9 +149,11 @@ pub async fn sora_2_pro_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
if let Some(image_url) = maybe_image_url {
info!("image-to-video case");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Sora2ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSora2ProImageToVideoDurationSeconds::Four,
@@ -202,6 +206,7 @@ pub async fn sora_2_pro_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Sora2ProMultiFunctionVideoGenDuration::FourSeconds) => EnqueueSora2ProTextToVideoDurationSeconds::Four,
@@ -282,8 +287,12 @@ pub async fn sora_2_pro_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Sora2ProMultiFunctionVideoGenAspectRatio::Auto => CommonAspectRatio::Auto,
Sora2ProMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Sora2ProMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
@@ -17,8 +17,10 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3p1_fast_first_last_frame_image_to_video_webhook::{enqueue_veo_3p1_fast_first_last_frame_image_to_video_webhook, EnqueueVeo3p1FastFirstLastFrameImageToVideoArgs, EnqueueVeo3p1FastFirstLastFrameImageToVideoAspectRatio, EnqueueVeo3p1FastFirstLastFrameImageToVideoDurationSeconds, EnqueueVeo3p1FastFirstLastFrameImageToVideoResolution};
@@ -148,6 +150,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
let generate_audio = request.generate_audio.unwrap_or(true);
@@ -155,6 +158,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
if let Some(end_frame_url) = maybe_end_frame_image_url {
info!("image-to-video case (start and end frame)");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Veo3p1FastMultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1FastFirstLastFrameImageToVideoDurationSeconds::Four,
@@ -208,6 +212,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
} else {
info!("image-to-video case (start frame only)");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Veo3p1FastMultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1FastImageToVideoDurationSeconds::Four,
@@ -261,6 +266,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Veo3p1FastMultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1FastTextToVideoDurationSeconds::Four,
@@ -345,11 +351,15 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Veo3p1FastMultiFunctionVideoGenAspectRatio::Auto => CommonAspectRatio::Auto,
Veo3p1FastMultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Veo3p1FastMultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -17,8 +17,10 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums::by_table::prompts::prompt_type::PromptType;
use enums::common::generation_provider::GenerationProvider;
use enums::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::visibility::Visibility;
use enums::common::generation::common_generation_mode::CommonGenerationMode;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3p1_first_last_frame_image_to_video_webhook::{enqueue_veo_3p1_first_last_frame_image_to_video_webhook, EnqueueVeo3p1FirstLastFrameImageToVideoArgs, EnqueueVeo3p1FirstLastFrameImageToVideoAspectRatio, EnqueueVeo3p1FirstLastFrameImageToVideoDurationSeconds, EnqueueVeo3p1FirstLastFrameImageToVideoResolution};
@@ -148,6 +150,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
let apriori_job_token = InferenceJobToken::generate();
let fal_result;
let generation_mode;
let generate_audio = request.generate_audio.unwrap_or(true);
@@ -155,6 +158,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
if let Some(end_frame_url) = maybe_end_frame_image_url {
info!("image-to-video case (start and end frame)");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Veo3p1MultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1FirstLastFrameImageToVideoDurationSeconds::Four,
@@ -208,6 +212,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
} else {
info!("image-to-video case (start frame only)");
generation_mode = CommonGenerationMode::Keyframe;
let duration = match request.duration {
Some(Veo3p1MultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1ImageToVideoDurationSeconds::Four,
@@ -261,6 +266,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
} else {
info!("text-to-video case");
generation_mode = CommonGenerationMode::Text;
let duration = match request.duration {
Some(Veo3p1MultiFunctionVideoGenDuration::FourSeconds) => EnqueueVeo3p1TextToVideoDurationSeconds::Four,
@@ -345,11 +351,15 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
maybe_generation_mode: None,
maybe_aspect_ratio: None,
maybe_generation_mode: Some(generation_mode),
maybe_aspect_ratio: request.aspect_ratio.as_ref().map(|ar| match ar {
Veo3p1MultiFunctionVideoGenAspectRatio::Auto => CommonAspectRatio::Auto,
Veo3p1MultiFunctionVideoGenAspectRatio::SixteenByNine => CommonAspectRatio::WideSixteenByNine,
Veo3p1MultiFunctionVideoGenAspectRatio::NineBySixteen => CommonAspectRatio::TallNineBySixteen,
}),
maybe_resolution: None,
maybe_batch_count: None,
maybe_generate_audio: None,
maybe_generate_audio: Some(generate_audio),
creator_ip_address: &ip_address,
mysql_executor: &mut *transaction,
phantom: Default::default(),
@@ -6,11 +6,11 @@ use crate::http_server::endpoints::generate::image::edit::gemini_25_flash_edit_i
use crate::http_server::endpoints::generate::image::edit::gpt_image_1_edit_image_handler::gpt_image_1_edit_image_handler;
use crate::http_server::endpoints::generate::image::edit::qwen_edit_image_handler::qwen_edit_image_handler;
use crate::http_server::endpoints::generate::image::edit::seededit_3_edit_image_handler::seededit_3_edit_image_handler;
use crate::http_server::endpoints::generate::image::generate_flux_1_dev_text_to_image_handler::generate_flux_1_dev_text_to_image_handler;
use crate::http_server::endpoints::generate::image::generate_flux_1_schnell_text_to_image_handler::generate_flux_1_schnell_text_to_image_handler;
use crate::http_server::endpoints::generate::image::generate_flux_pro_11_text_to_image_handler::generate_flux_pro_11_text_to_image_handler;
use crate::http_server::endpoints::generate::image::generate_flux_pro_11_ultra_text_to_image_handler::generate_flux_pro_11_ultra_text_to_image_handler;
use crate::http_server::endpoints::generate::image::generate_gpt_image_1_text_to_image_handler::generate_gpt_image_1_text_to_image_handler;
use crate::http_server::endpoints::generate::image::text::generate_flux_1_dev_text_to_image_handler::generate_flux_1_dev_text_to_image_handler;
use crate::http_server::endpoints::generate::image::text::generate_flux_1_schnell_text_to_image_handler::generate_flux_1_schnell_text_to_image_handler;
use crate::http_server::endpoints::generate::image::text::generate_flux_pro_11_text_to_image_handler::generate_flux_pro_11_text_to_image_handler;
use crate::http_server::endpoints::generate::image::text::generate_flux_pro_11_ultra_text_to_image_handler::generate_flux_pro_11_ultra_text_to_image_handler;
use crate::http_server::endpoints::generate::image::text::generate_gpt_image_1_text_to_image_handler::generate_gpt_image_1_text_to_image_handler;
use crate::http_server::endpoints::generate::image::inpaint::flux_dev_juggernaut_inpaint_handler::flux_dev_juggernaut_inpaint_image_handler;
use crate::http_server::endpoints::generate::image::inpaint::flux_pro_1_inpaint_handler::flux_pro_1_inpaint_image_handler;
use crate::http_server::endpoints::generate::image::multi_function::bytedance_seedream_v4_multi_function_image_gen_handler::bytedance_seedream_v4_multi_function_image_gen_handler;
@@ -22,20 +22,20 @@ use crate::http_server::endpoints::generate::image::multi_function::nano_banana_
use crate::http_server::endpoints::generate::image::multi_function::nano_banana_pro_multi_function_image_gen_handler::nano_banana_pro_multi_function_image_gen_handler;
use crate::http_server::endpoints::generate::image::angle::flux_2_lora_edit_image_angle_handler::flux_2_lora_edit_image_angle_handler;
use crate::http_server::endpoints::generate::image::angle::qwen_edit_2511_edit_image_angle_handler::qwen_edit_2511_edit_image_angle_handler;
use crate::http_server::endpoints::generate::image::remove_image_background_handler::remove_image_background_handler;
use crate::http_server::endpoints::generate::image::bg_removal::remove_image_background_handler::remove_image_background_handler;
use crate::http_server::endpoints::generate::object::generate_hunyuan_2_0_image_to_3d_handler::generate_hunyuan_2_0_image_to_3d_handler;
use crate::http_server::endpoints::generate::splat::generate_worldlabs_marble_0p1_mini_splat_handler::generate_worldlabs_marble_0p1_mini_splat_handler;
use crate::http_server::endpoints::generate::splat::generate_worldlabs_marble_0p1_plus_splat_handler::generate_worldlabs_marble_0p1_plus_splat_handler;
use crate::http_server::endpoints::generate::object::generate_hunyuan_2_1_image_to_3d_handler::generate_hunyuan_2_1_image_to_3d_handler;
use crate::http_server::endpoints::generate::object::multi_function::generate_hunyuan3d_v3_multi_function_object_handler::generate_hunyuan3d_v3_multi_function_object_handler;
use crate::http_server::endpoints::generate::video::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler;
use crate::http_server::endpoints::generate::video::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler;
use crate::http_server::endpoints::generate::video::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler;
use crate::http_server::endpoints::generate::video::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler;
use crate::http_server::endpoints::generate::video::generate_seedance_1_0_pro_image_to_video_handler::generate_seedance_1_0_pro_image_to_video_handler;
use crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler;
use crate::http_server::endpoints::generate::video::generate_veo_3_fast_image_to_video_handler::generate_veo_3_fast_image_to_video_handler;
use crate::http_server::endpoints::generate::video::generate_veo_3_image_to_video_handler::generate_veo_3_image_to_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_seedance_1_0_pro_image_to_video_handler::generate_seedance_1_0_pro_image_to_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_veo_3_fast_image_to_video_handler::generate_veo_3_fast_image_to_video_handler;
use crate::http_server::endpoints::generate::video::image::generate_veo_3_image_to_video_handler::generate_veo_3_image_to_video_handler;
use crate::http_server::endpoints::generate::video::multi_function::kling_2p5_turbo_pro_multi_function_video_gen_handler::kling_2p5_turbo_pro_multi_function_video_gen_handler;
use crate::http_server::endpoints::generate::video::multi_function::kling_2p6_pro_multi_function_video_gen_handler::kling_2p6_pro_multi_function_video_gen_handler;
use crate::http_server::endpoints::generate::video::multi_function::kling_3p0_pro_multi_function_video_gen_handler::kling_3p0_pro_multi_function_video_gen_handler;