begin populating extra prompt details

This commit is contained in:
Brandon Thomas committed 2026-03-23 22:37:11 -04:00
1 parent 516d740e97
commit a324b04a1d
42 files changed
+217 -52

No files matched your search

@@ -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(),
@@ -14,6 +14,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::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,7 +174,7 @@ 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_generation_mode: Some(CommonGenerationMode::Edit),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -14,6 +14,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::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,7 +175,7 @@ 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_generation_mode: Some(CommonGenerationMode::Edit),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -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;
@@ -218,7 +219,7 @@ 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),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -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;
@@ -235,7 +236,7 @@ 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),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -18,6 +18,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::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;
@@ -257,7 +258,7 @@ 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_generation_mode: Some(CommonGenerationMode::Edit),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -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};
@@ -209,7 +210,7 @@ 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),
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::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),
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::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;
@@ -198,7 +199,7 @@ 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_generation_mode: Some(CommonGenerationMode::Text),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -283,7 +284,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),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -12,6 +12,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::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;
@@ -178,7 +179,7 @@ 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_generation_mode: Some(CommonGenerationMode::Text),
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::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};
@@ -162,7 +163,7 @@ 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_generation_mode: Some(CommonGenerationMode::Text),
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::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};
@@ -166,7 +167,7 @@ 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_generation_mode: Some(CommonGenerationMode::Text),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -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::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};
@@ -208,7 +209,7 @@ 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_generation_mode: Some(CommonGenerationMode::Text),
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,7 +218,7 @@ 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,
@@ -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,7 +218,7 @@ 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,
@@ -230,7 +230,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -254,7 +254,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -252,7 +252,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -342,7 +342,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -253,7 +253,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -285,7 +285,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -300,7 +300,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -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,
@@ -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_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,7 +239,7 @@ 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_generation_mode: Some(CommonGenerationMode::Keyframe),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: 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),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: 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_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,7 +220,7 @@ 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_generation_mode: Some(CommonGenerationMode::Keyframe),
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: 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),
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,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_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 +221,11 @@ 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_generation_mode: Some(CommonGenerationMode::Keyframe),
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(),
@@ -261,7 +261,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -260,11 +260,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
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(),
@@ -309,11 +309,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
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(),
@@ -309,11 +309,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
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(),
@@ -314,11 +314,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
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(),
@@ -273,7 +273,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -280,7 +280,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -282,7 +282,7 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
maybe_aspect_ratio: None,
maybe_resolution: None,
maybe_batch_count: None,
@@ -345,11 +345,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
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(),
@@ -345,11 +345,11 @@ 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_generation_mode: None, // TODO: Multi-function handlers support multiple modes
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(),