diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue.rs index 0d7cddb89d..58df7445e9 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue.rs @@ -13,6 +13,7 @@ use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; use crate::errors::database_query_error::DatabaseQueryError; @@ -36,6 +37,8 @@ pub struct InsertGenericInferenceForFalArgs<'a> { pub fal_category: FalCategory, pub maybe_inference_args: Option, + + pub maybe_prompt_token: Option<&'a PromptToken>, pub maybe_creator_user_token: Option<&'a UserToken>, pub maybe_avt_token: Option<&'a AnonymousVisitorTrackingToken>, @@ -105,6 +108,8 @@ SET maybe_download_url = NULL, maybe_cover_image_media_file_token = NULL, + + maybe_prompt_token = ?, maybe_raw_inference_text = NULL, @@ -134,6 +139,8 @@ SET product_category.to_str(), inference_category.to_str(), + + args.maybe_prompt_token.map(|t| t.to_string()), serialized_args_payload, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs index 06bbdef206..6897ca839a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs @@ -185,6 +185,7 @@ pub async fn gpt_image_1_edit_image_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs index 3480ac623f..46b5e51a18 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs @@ -120,6 +120,7 @@ pub async fn generate_flux_1_dev_text_to_image_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_schnell_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_schnell_text_to_image_handler.rs index 292481e0fb..505e02d84f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_schnell_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_schnell_text_to_image_handler.rs @@ -119,6 +119,7 @@ pub async fn generate_flux_1_schnell_text_to_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_prompt_token: None, maybe_inference_args: None, maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), maybe_avt_token: maybe_avt_token.as_ref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_text_to_image_handler.rs index a06dd2eddb..fded8a8261 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_text_to_image_handler.rs @@ -121,6 +121,7 @@ pub async fn generate_flux_pro_11_text_to_image_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_ultra_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_ultra_text_to_image_handler.rs index 1c3598678b..632ef1e9ba 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_ultra_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_pro_11_ultra_text_to_image_handler.rs @@ -121,6 +121,7 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs index 6a74a5ed58..8f84247e63 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs @@ -145,6 +145,7 @@ pub async fn remove_image_background_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::BackgroundRemoval, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_0_image_to_3d_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_0_image_to_3d_handler.rs index ffa8d885d9..70255f3a02 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_0_image_to_3d_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_0_image_to_3d_handler.rs @@ -146,6 +146,7 @@ pub async fn generate_hunyuan_2_0_image_to_3d_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ObjectGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_1_image_to_3d_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_1_image_to_3d_handler.rs index c35698c117..fbd529805a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_1_image_to_3d_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/generate_hunyuan_2_1_image_to_3d_handler.rs @@ -146,6 +146,7 @@ pub async fn generate_hunyuan_2_1_image_to_3d_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ObjectGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_1_6_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_1_6_pro_video_handler.rs index b2b7b743df..490444864b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_1_6_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_1_6_pro_video_handler.rs @@ -191,6 +191,7 @@ pub async fn generate_kling_1_6_pro_video_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_master_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_master_video_handler.rs index 9e029275bb..b14f0e4544 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_master_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_master_video_handler.rs @@ -192,6 +192,7 @@ pub async fn generate_kling_2_1_master_video_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_pro_video_handler.rs index 9d7a173663..b5700bbf4e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_kling_2_1_pro_video_handler.rs @@ -192,6 +192,7 @@ pub async fn generate_kling_2_1_pro_video_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs index 91a2bbc5c3..3dedc9a361 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs @@ -171,6 +171,7 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler( maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, maybe_inference_args: None, + maybe_prompt_token: None, 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, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_veo_2_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_veo_2_image_to_video_handler.rs index 2238eed669..3e5149bc3f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_veo_2_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_veo_2_image_to_video_handler.rs @@ -14,6 +14,7 @@ use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateV use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoRequest; use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoResponse; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use enums::by_table::prompts::prompt_type::PromptType; use enums::common::visibility::Visibility; use fal_client::requests::webhook::video::enqueue_veo_2_image_to_video_webhook::enqueue_veo_2_image_to_video_webhook; use fal_client::requests::webhook::video::enqueue_veo_2_image_to_video_webhook::Veo2Args; @@ -21,16 +22,15 @@ use fal_client::requests::webhook::video::enqueue_veo_2_image_to_video_webhook:: use fal_client::requests::webhook::video::enqueue_veo_2_image_to_video_webhook::Veo2Duration; 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_with_connection; -use utoipa::ToSchema; -use enums::by_table::prompts::prompt_type::PromptType; use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs}; +use sqlx::Acquire; use tokens::tokens::prompts::PromptToken; +use utoipa::ToSchema; /// Veo 2 Image to Video #[utoipa::path( @@ -183,8 +183,6 @@ pub async fn generate_veo_2_image_to_video_handler( let ip_address = get_request_ip(&http_request); - let prompt_token = PromptToken::generate(); - let mut transaction = mysql_connection .begin() .await @@ -192,10 +190,10 @@ pub async fn generate_veo_2_image_to_video_handler( error!("Error starting MySQL transaction: {:?}", err); CommonWebError::ServerError })?; - + // NB: Don't fail the job if the query fails. let prompt_result = insert_prompt(InsertPromptArgs { - maybe_apriori_prompt_token: Some(&prompt_token), + maybe_apriori_prompt_token: None, prompt_type: PromptType::ArtcraftApp, maybe_creator_user_token: maybe_user_session .as_ref() @@ -208,11 +206,20 @@ pub async fn generate_veo_2_image_to_video_handler( 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. + } + }; + 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::VideoGeneration, maybe_inference_args: None, + maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: maybe_user_session .as_ref() .map(|s| &s.user_token), @@ -222,14 +229,6 @@ pub async fn generate_veo_2_image_to_video_handler( mysql_pool: &server_state.mysql_pool, }).await; - let _r = transaction - .commit() - .await - .map_err(|err| { - error!("Error committing MySQL transaction: {:?}", err); - CommonWebError::ServerError - })?; - let job_token = match db_result { Ok(token) => token, Err(err) => { @@ -238,6 +237,14 @@ pub async fn generate_veo_2_image_to_video_handler( } }; + let _r = transaction + .commit() + .await + .map_err(|err| { + error!("Error committing MySQL transaction: {:?}", err); + CommonWebError::ServerError + })?; + Ok(Json(GenerateVeo2ImageToVideoResponse { success: true, inference_job_token: job_token,