diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/beeble/insert_generic_inference_job_for_beeble_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/beeble/insert_generic_inference_job_for_beeble_queue_with_apriori_job_token.rs index e63f4fb62f..051e224c98 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/beeble/insert_generic_inference_job_for_beeble_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/beeble/insert_generic_inference_job_for_beeble_queue_with_apriori_job_token.rs @@ -7,6 +7,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -34,6 +35,8 @@ pub struct InsertGenericInferenceForBeebleWithAprioriJobTokenArgs<'e, 'c, E> /// The external primary key identifier for the job. pub maybe_external_third_party_id: &'e str, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -72,6 +75,7 @@ pub async fn insert_generic_inference_job_for_beeble_queue_with_apriori_job_toke external_third_party_id: args.maybe_external_third_party_id, product_category: InferenceJobProductCategory::BeebleVideo, inference_category: InferenceCategory::VideoGeneration, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: args.maybe_prompt_token, maybe_wallet_ledger_entry_token: None, maybe_inference_args: args.maybe_inference_args, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/common/insert_generic_inference_job_for_provider.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/common/insert_generic_inference_job_for_provider.rs index a1a3b43331..d0bb6551ad 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/common/insert_generic_inference_job_for_provider.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/common/insert_generic_inference_job_for_provider.rs @@ -23,6 +23,8 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::by_table::generic_inference_jobs::inference_model_type::InferenceModelType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -53,6 +55,11 @@ pub(crate) struct InsertGenericInferenceJobForProviderArgs<'e, 'c, E> pub product_category: InferenceJobProductCategory, pub inference_category: InferenceCategory, + /// Optional model identifier. Converted to the legacy + /// [`InferenceModelType`] (which is a superset of `CommonModelType`) at + /// the call site of the root insert. + pub maybe_model_type: Option, + pub maybe_prompt_token: Option<&'e PromptToken>, pub maybe_wallet_ledger_entry_token: Option<&'e WalletLedgerEntryToken>, @@ -93,8 +100,11 @@ pub(crate) async fn insert_generic_inference_job_for_provider<'e, 'c: 'e, E>( maybe_product_category: Some(args.product_category), inference_category: args.inference_category, + // Convert from the canonical CommonModelType to the table-scoped + // InferenceModelType so the database column gets the right value. + maybe_model_type: args.maybe_model_type.map(InferenceModelType::from_common_model_type), + // Web-only fields — providers never set these. - maybe_model_type: None, maybe_model_token: None, maybe_input_source_token: None, maybe_input_source_token_type: None, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue.rs index e0e7f976e7..516639e207 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue.rs @@ -1,6 +1,7 @@ use sqlx::{Executor, MySql}; use std::marker::PhantomData; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; @@ -29,6 +30,8 @@ pub struct InsertGenericInferenceForFalArgs<'e, 'c, E> pub fal_category: FalCategory, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -56,6 +59,7 @@ pub async fn insert_generic_inference_job_for_fal_queue<'e, 'c : 'e, E>(args: In apriori_job_token: &job_token, maybe_external_third_party_id: args.maybe_external_third_party_id, fal_category: args.fal_category, + maybe_model_type: args.maybe_model_type, maybe_inference_args: args.maybe_inference_args, maybe_prompt_token: args.maybe_prompt_token, maybe_creator_user_token: args.maybe_creator_user_token, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs index 9692c8f150..307f0d8e6a 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs @@ -3,6 +3,7 @@ use sqlx::{Executor, MySql}; use std::marker::PhantomData; use enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -29,6 +30,8 @@ pub struct InsertGenericInferenceForFalMockFailureArgs<'e, 'c, E> pub fal_category: FalCategory, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -59,6 +62,7 @@ pub async fn insert_generic_inference_job_for_fal_queue_mock_failure<'e, 'c: 'e, apriori_job_token: &job_token, maybe_external_third_party_id: &synthetic_external_id, fal_category: args.fal_category, + maybe_model_type: args.maybe_model_type, maybe_inference_args: args.maybe_inference_args, maybe_prompt_token: args.maybe_prompt_token, maybe_creator_user_token: args.maybe_creator_user_token, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs index 9c16d46f73..a9b9663838 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs @@ -7,6 +7,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -37,6 +38,8 @@ pub struct InsertGenericInferenceForFalWithAprioriJobTokenArgs<'e, 'c, E> pub fal_category: FalCategory, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -94,6 +97,7 @@ pub async fn insert_generic_inference_job_for_fal_queue_with_apriori_job_token<' external_third_party_id: args.maybe_external_third_party_id, product_category, inference_category, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: args.maybe_prompt_token, maybe_wallet_ledger_entry_token: None, maybe_inference_args: args.maybe_inference_args, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/gmicloud/insert_generic_inference_job_for_gmicloud.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/gmicloud/insert_generic_inference_job_for_gmicloud.rs index b07c4fd347..afeb7ca406 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/gmicloud/insert_generic_inference_job_for_gmicloud.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/gmicloud/insert_generic_inference_job_for_gmicloud.rs @@ -6,6 +6,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -27,6 +28,7 @@ where pub apriori_job_token: &'e InferenceJobToken, pub uuid_idempotency_token: &'e str, pub external_request_id: &'e str, + pub maybe_model_type: Option, pub maybe_prompt_token: Option<&'e PromptToken>, pub maybe_creator_user_token: Option<&'e UserToken>, pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>, @@ -50,6 +52,7 @@ where external_third_party_id: args.external_request_id, product_category: InferenceJobProductCategory::GmiCloudVideo, inference_category: InferenceCategory::VideoGeneration, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: args.maybe_prompt_token, maybe_wallet_ledger_entry_token: None, // GmiCloud doesn't take inference args. diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_character_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_character_with_apriori_job_token.rs index e3f9b31349..e61bbfc646 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_character_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_character_with_apriori_job_token.rs @@ -6,6 +6,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -29,6 +30,8 @@ pub struct InsertGenericInferenceForSeedance2ProCharacterWithAprioriJobTokenArgs /// The Kinovi character_id returned by generate_character(). pub kinovi_character_id: &'e str, + pub maybe_model_type: Option, + pub maybe_creator_user_token: Option<&'e UserToken>, pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>, pub creator_ip_address: &'e str, @@ -51,6 +54,7 @@ pub async fn insert_generic_inference_job_for_seedance2pro_character_with_aprior external_third_party_id: args.kinovi_character_id, product_category: InferenceJobProductCategory::Seedance2ProCharacter, inference_category: InferenceCategory::CharacterGeneration, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: None, maybe_wallet_ledger_entry_token: None, // Character variant doesn't take inference args. diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs index 1aee2e65d1..bff68401f9 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs @@ -6,6 +6,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -36,6 +37,8 @@ pub struct InsertGenericInferenceForSeedance2ProWithAprioriJobTokenArgs<'e, 'c, /// The external order_id returned by the seedance2pro generate_video call. pub maybe_external_third_party_id: &'e str, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -81,6 +84,7 @@ pub async fn insert_generic_inference_job_for_seedance2pro_queue_with_apriori_jo external_third_party_id: args.maybe_external_third_party_id, product_category, inference_category: InferenceCategory::VideoGeneration, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: args.maybe_prompt_token, maybe_wallet_ledger_entry_token: args.maybe_wallet_ledger_entry_token, maybe_inference_args: args.maybe_inference_args, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/worldlabs/insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/worldlabs/insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token.rs index 68f4234ca2..0ce4a24f49 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/worldlabs/insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/worldlabs/insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token.rs @@ -6,6 +6,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty; use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory; use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType; +use enums::common::generation::common_model_type::CommonModelType; use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; @@ -31,6 +32,8 @@ pub struct InsertGenericInferenceForWorldlabsWithAprioriJobTokenArgs<'e, 'c, E> /// The external operation_id returned by World Labs generate_world call. pub maybe_external_third_party_id: &'e str, + pub maybe_model_type: Option, + pub maybe_inference_args: Option, pub maybe_prompt_token: Option<&'e PromptToken>, @@ -60,6 +63,7 @@ pub async fn insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_t external_third_party_id: args.maybe_external_third_party_id, product_category: InferenceJobProductCategory::WorldlabsSplat, inference_category: InferenceCategory::SplatGeneration, + maybe_model_type: args.maybe_model_type, maybe_prompt_token: args.maybe_prompt_token, maybe_wallet_ledger_entry_token: args.maybe_wallet_ledger_entry_token, maybe_inference_args: args.maybe_inference_args, diff --git a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs index 6aa4512ce7..5884fad5e6 100644 --- a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs +++ b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs @@ -5,6 +5,8 @@ use strum::EnumCount; #[cfg(test)] use strum::EnumIter; +use crate::common::generation::common_model_type::CommonModelType; + /// Used in the `generic_inference_jobs` table in `VARCHAR(32)` field `maybe_model_type`. /// /// Our "generic inference" pipeline supports a wide variety of ML models and other media. @@ -13,10 +15,19 @@ use strum::EnumIter; /// /// These types are present in the HTTP API and database columns as serialized here. /// +/// `InferenceModelType` is a **superset** of [`CommonModelType`]: every variant in +/// `CommonModelType` has a 1:1 mapping here (see [`from_common_model_type`]). The legacy +/// variants at the top of the enum (`ComfyUi`, `RvcV2`, …) only exist on this side. +/// /// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] pub enum InferenceModelType { + // --------------------------------------------------------------------------- + // Legacy / inference-pipeline-only variants. These predate CommonModelType + // and have no counterpart there. + // --------------------------------------------------------------------------- + // TODO(bt,2024-07-15): This is too generic. We probably need "StorytellerStudio", "LivePortrait", etc. #[serde(rename = "comfy_ui")] ComfyUi, @@ -55,7 +66,151 @@ pub enum InferenceModelType { #[serde(rename = "convert_fbx_gltf")] ConvertFbxToGltf, #[serde(rename = "bvh_to_workflow")] - BvhToWorkflow + BvhToWorkflow, + + // --------------------------------------------------------------------------- + // Mirror of `CommonModelType`. Names and serialized strings must stay in + // lock-step with that enum so `from_common_model_type` is trivially 1:1. + // When you add a new variant to `CommonModelType`, the match in + // `from_common_model_type` below will fail to compile until you mirror it + // here. + // --------------------------------------------------------------------------- + + // Image models + #[serde(rename = "flux_1_dev")] + Flux1Dev, + #[serde(rename = "flux_1_schnell")] + Flux1Schnell, + #[serde(rename = "flux_dev_juggernaut")] + FluxDevJuggernaut, + #[serde(rename = "flux_pro_1")] + FluxPro1, + #[serde(rename = "flux_pro_1p1")] + FluxPro11, + #[serde(rename = "flux_pro_1p1_ultra")] + FluxPro11Ultra, + #[serde(rename = "flux_pro_kontext_max")] + FluxProKontextMax, + #[serde(rename = "flux_2_lora_angles")] + Flux2LoraAngles, + #[serde(rename = "gpt_image_1")] + GptImage1, + #[serde(rename = "gpt_image_1p5")] + GptImage1p5, + #[serde(rename = "gpt_image_2")] + GptImage2, + #[serde(rename = "grok_image")] + GrokImage, + #[serde(rename = "recraft_3")] + Recraft3, + #[serde(rename = "seededit_3")] + SeedEdit3, + #[serde(rename = "qwen")] + Qwen, + #[serde(rename = "qwen_edit_2511_angles")] + QwenEdit2511Angles, + #[serde(rename = "gemini_25_flash")] + Gemini25Flash, + #[serde(rename = "nano_banana")] + NanoBanana, + #[serde(rename = "nano_banana_2")] + NanoBanana2, + #[serde(rename = "nano_banana_pro")] + NanoBananaPro, + #[serde(rename = "seedream_4")] + Seedream4, + #[serde(rename = "seedream_4p5")] + Seedream4p5, + #[serde(rename = "seedream_5_lite")] + Seedream5Lite, + #[serde(rename = "midjourney")] + Midjourney, + #[serde(rename = "midjourney_v6")] + MidjourneyV6, + #[serde(rename = "midjourney_v6p1")] + MidjourneyV6p1, + #[serde(rename = "midjourney_v6p1_raw")] + MidjourneyV6p1Raw, + #[serde(rename = "midjourney_v7")] + MidjourneyV7, + #[serde(rename = "midjourney_v7_draft")] + MidjourneyV7Draft, + #[serde(rename = "midjourney_v7_draft_raw")] + MidjourneyV7DraftRaw, + #[serde(rename = "midjourney_v7_raw")] + MidjourneyV7Raw, + + // Video models + #[serde(rename = "grok_video")] + GrokVideo, + #[serde(rename = "kling_1p6_pro")] + Kling16Pro, + #[serde(rename = "kling_2p1_pro")] + Kling21Pro, + #[serde(rename = "kling_2p1_master")] + Kling21Master, + #[serde(rename = "kling_2p5_turbo_pro")] + Kling2p5TurboPro, + #[serde(rename = "kling_2p6_pro")] + Kling2p6Pro, + #[serde(rename = "kling_3p0_standard")] + Kling3p0Standard, + #[serde(rename = "kling_3p0_pro")] + Kling3p0Pro, + #[serde(rename = "happy_horse_1p0")] + HappyHorse1p0, + #[serde(rename = "seedance_1p0_lite")] + Seedance10Lite, + #[serde(rename = "seedance_1p0_pro")] + Seedance10Pro, + #[serde(rename = "seedance_1p5_pro")] + Seedance1p5Pro, + #[serde(rename = "seedance_2p0")] + Seedance2p0, + #[serde(rename = "seedance_2p0_fast")] + Seedance2p0Fast, + #[serde(rename = "seedance_2p0_bp")] + Seedance2p0BytePlus, + #[serde(rename = "seedance_2p0_bp_fast")] + Seedance2p0BytePlusFast, + #[serde(rename = "seedance_2p0_u")] + Seedance2p0Ultra, + #[serde(rename = "seedance_2p0_u_fast")] + Seedance2p0UltraFast, + #[serde(rename = "sora_2")] + Sora2, + #[serde(rename = "sora_2_pro")] + Sora2Pro, + #[serde(rename = "veo_2")] + Veo2, + #[serde(rename = "veo_3")] + Veo3, + #[serde(rename = "veo_3_fast")] + Veo3Fast, + #[serde(rename = "veo_3p1")] + Veo3p1, + #[serde(rename = "veo_3p1_fast")] + Veo3p1Fast, + #[serde(rename = "preview_model")] + PreviewModel, + #[serde(rename = "preview_model_fast")] + PreviewModelFast, + #[serde(rename = "switch_x")] + SwitchX, + + // 3D Object generation models + #[serde(rename = "hunyuan_3d_2p0")] + Hunyuan3d2_0, + #[serde(rename = "hunyuan_3d_2p1")] + Hunyuan3d2_1, + #[serde(rename = "hunyuan_3d_3")] + Hunyuan3d3, + + // Splat generation models (World Labs) + #[serde(rename = "marble_0p1_mini")] + Marble0p1Mini, + #[serde(rename = "marble_0p1_plus")] + Marble0p1Plus, } // TODO(bt, 2022-12-21): This desperately needs MySQL integration tests! @@ -66,6 +221,7 @@ impl_mysql_enum_coders!(InferenceModelType); impl InferenceModelType { pub fn to_str(&self) -> &'static str { match self { + // Legacy variants Self::RvcV2 => "rvc_v2", Self::SadTalker => "sad_talker", Self::SoVitsSvc => "so_vits_svc", @@ -81,11 +237,84 @@ impl InferenceModelType { Self::ComfyUi => "comfy_ui", Self::ConvertFbxToGltf => "convert_fbx_gltf", Self::BvhToWorkflow => "bvh_to_workflow", + + // Image models (mirror of CommonModelType) + Self::Flux1Dev => "flux_1_dev", + Self::Flux1Schnell => "flux_1_schnell", + Self::FluxDevJuggernaut => "flux_dev_juggernaut", + Self::FluxPro1 => "flux_pro_1", + Self::FluxPro11 => "flux_pro_1p1", + Self::FluxPro11Ultra => "flux_pro_1p1_ultra", + Self::FluxProKontextMax => "flux_pro_kontext_max", + Self::Flux2LoraAngles => "flux_2_lora_angles", + Self::GptImage1 => "gpt_image_1", + Self::GptImage1p5 => "gpt_image_1p5", + Self::GptImage2 => "gpt_image_2", + Self::GrokImage => "grok_image", + Self::Recraft3 => "recraft_3", + Self::SeedEdit3 => "seededit_3", + Self::Qwen => "qwen", + Self::QwenEdit2511Angles => "qwen_edit_2511_angles", + Self::Gemini25Flash => "gemini_25_flash", + Self::NanoBanana => "nano_banana", + Self::NanoBanana2 => "nano_banana_2", + Self::NanoBananaPro => "nano_banana_pro", + Self::Seedream4 => "seedream_4", + Self::Seedream4p5 => "seedream_4p5", + Self::Seedream5Lite => "seedream_5_lite", + Self::Midjourney => "midjourney", + Self::MidjourneyV6 => "midjourney_v6", + Self::MidjourneyV6p1 => "midjourney_v6p1", + Self::MidjourneyV6p1Raw => "midjourney_v6p1_raw", + Self::MidjourneyV7 => "midjourney_v7", + Self::MidjourneyV7Draft => "midjourney_v7_draft", + Self::MidjourneyV7DraftRaw => "midjourney_v7_draft_raw", + Self::MidjourneyV7Raw => "midjourney_v7_raw", + + // Video models + Self::GrokVideo => "grok_video", + Self::Kling16Pro => "kling_1p6_pro", + Self::Kling21Pro => "kling_2p1_pro", + Self::Kling21Master => "kling_2p1_master", + Self::Kling2p5TurboPro => "kling_2p5_turbo_pro", + Self::Kling2p6Pro => "kling_2p6_pro", + Self::Kling3p0Standard => "kling_3p0_standard", + Self::Kling3p0Pro => "kling_3p0_pro", + Self::HappyHorse1p0 => "happy_horse_1p0", + Self::Seedance10Lite => "seedance_1p0_lite", + Self::Seedance10Pro => "seedance_1p0_pro", + Self::Seedance1p5Pro => "seedance_1p5_pro", + Self::Seedance2p0 => "seedance_2p0", + Self::Seedance2p0Fast => "seedance_2p0_fast", + Self::Seedance2p0BytePlus => "seedance_2p0_bp", + Self::Seedance2p0BytePlusFast => "seedance_2p0_bp_fast", + Self::Seedance2p0Ultra => "seedance_2p0_u", + Self::Seedance2p0UltraFast => "seedance_2p0_u_fast", + Self::Sora2 => "sora_2", + Self::Sora2Pro => "sora_2_pro", + Self::Veo2 => "veo_2", + Self::Veo3 => "veo_3", + Self::Veo3Fast => "veo_3_fast", + Self::Veo3p1 => "veo_3p1", + Self::Veo3p1Fast => "veo_3p1_fast", + Self::PreviewModel => "preview_model", + Self::PreviewModelFast => "preview_model_fast", + Self::SwitchX => "switch_x", + + // 3D Object generation models + Self::Hunyuan3d2_0 => "hunyuan_3d_2p0", + Self::Hunyuan3d2_1 => "hunyuan_3d_2p1", + Self::Hunyuan3d3 => "hunyuan_3d_3", + + // Splat generation models (World Labs) + Self::Marble0p1Mini => "marble_0p1_mini", + Self::Marble0p1Plus => "marble_0p1_plus", } } pub fn from_str(value: &str) -> Result { match value { + // Legacy variants "rvc_v2" => Ok(Self::RvcV2), "sad_talker" => Ok(Self::SadTalker), "so_vits_svc" => Ok(Self::SoVitsSvc), @@ -101,6 +330,79 @@ impl InferenceModelType { "comfy_ui" => Ok(Self::ComfyUi), "convert_fbx_gltf" => Ok(Self::ConvertFbxToGltf), "bvh_to_workflow" => Ok(Self::BvhToWorkflow), + + // Image models (mirror of CommonModelType) + "flux_1_dev" => Ok(Self::Flux1Dev), + "flux_1_schnell" => Ok(Self::Flux1Schnell), + "flux_dev_juggernaut" => Ok(Self::FluxDevJuggernaut), + "flux_pro_1" => Ok(Self::FluxPro1), + "flux_pro_1p1" => Ok(Self::FluxPro11), + "flux_pro_1p1_ultra" => Ok(Self::FluxPro11Ultra), + "flux_pro_kontext_max" => Ok(Self::FluxProKontextMax), + "flux_2_lora_angles" => Ok(Self::Flux2LoraAngles), + "gpt_image_1" => Ok(Self::GptImage1), + "gpt_image_1p5" => Ok(Self::GptImage1p5), + "gpt_image_2" => Ok(Self::GptImage2), + "grok_image" => Ok(Self::GrokImage), + "recraft_3" => Ok(Self::Recraft3), + "seededit_3" => Ok(Self::SeedEdit3), + "qwen" => Ok(Self::Qwen), + "qwen_edit_2511_angles" => Ok(Self::QwenEdit2511Angles), + "gemini_25_flash" => Ok(Self::Gemini25Flash), + "nano_banana" => Ok(Self::NanoBanana), + "nano_banana_2" => Ok(Self::NanoBanana2), + "nano_banana_pro" => Ok(Self::NanoBananaPro), + "seedream_4" => Ok(Self::Seedream4), + "seedream_4p5" => Ok(Self::Seedream4p5), + "seedream_5_lite" => Ok(Self::Seedream5Lite), + "midjourney" => Ok(Self::Midjourney), + "midjourney_v6" => Ok(Self::MidjourneyV6), + "midjourney_v6p1" => Ok(Self::MidjourneyV6p1), + "midjourney_v6p1_raw" => Ok(Self::MidjourneyV6p1Raw), + "midjourney_v7" => Ok(Self::MidjourneyV7), + "midjourney_v7_draft" => Ok(Self::MidjourneyV7Draft), + "midjourney_v7_draft_raw" => Ok(Self::MidjourneyV7DraftRaw), + "midjourney_v7_raw" => Ok(Self::MidjourneyV7Raw), + + // Video models + "grok_video" => Ok(Self::GrokVideo), + "kling_1p6_pro" => Ok(Self::Kling16Pro), + "kling_2p1_pro" => Ok(Self::Kling21Pro), + "kling_2p1_master" => Ok(Self::Kling21Master), + "kling_2p5_turbo_pro" => Ok(Self::Kling2p5TurboPro), + "kling_2p6_pro" => Ok(Self::Kling2p6Pro), + "kling_3p0_standard" => Ok(Self::Kling3p0Standard), + "kling_3p0_pro" => Ok(Self::Kling3p0Pro), + "happy_horse_1p0" => Ok(Self::HappyHorse1p0), + "seedance_1p0_lite" => Ok(Self::Seedance10Lite), + "seedance_1p0_pro" => Ok(Self::Seedance10Pro), + "seedance_1p5_pro" => Ok(Self::Seedance1p5Pro), + "seedance_2p0" => Ok(Self::Seedance2p0), + "seedance_2p0_fast" => Ok(Self::Seedance2p0Fast), + "seedance_2p0_bp" => Ok(Self::Seedance2p0BytePlus), + "seedance_2p0_bp_fast" => Ok(Self::Seedance2p0BytePlusFast), + "seedance_2p0_u" => Ok(Self::Seedance2p0Ultra), + "seedance_2p0_u_fast" => Ok(Self::Seedance2p0UltraFast), + "sora_2" => Ok(Self::Sora2), + "sora_2_pro" => Ok(Self::Sora2Pro), + "veo_2" => Ok(Self::Veo2), + "veo_3" => Ok(Self::Veo3), + "veo_3_fast" => Ok(Self::Veo3Fast), + "veo_3p1" => Ok(Self::Veo3p1), + "veo_3p1_fast" => Ok(Self::Veo3p1Fast), + "preview_model" => Ok(Self::PreviewModel), + "preview_model_fast" => Ok(Self::PreviewModelFast), + "switch_x" => Ok(Self::SwitchX), + + // 3D Object generation models + "hunyuan_3d_2p0" => Ok(Self::Hunyuan3d2_0), + "hunyuan_3d_2p1" => Ok(Self::Hunyuan3d2_1), + "hunyuan_3d_3" => Ok(Self::Hunyuan3d3), + + // Splat generation models (World Labs) + "marble_0p1_mini" => Ok(Self::Marble0p1Mini), + "marble_0p1_plus" => Ok(Self::Marble0p1Plus), + _ => Err(format!("invalid value: {:?}", value)), } } @@ -109,6 +411,7 @@ impl InferenceModelType { // NB: BTreeSet is sorted // NB: BTreeSet::from() isn't const, but not worth using LazyStatic, etc. BTreeSet::from([ + // Legacy variants Self::ComfyUi, Self::RvcV2, Self::SadTalker, @@ -124,13 +427,166 @@ impl InferenceModelType { Self::StyleTTS2, Self::ConvertFbxToGltf, Self::BvhToWorkflow, + + // Image models (mirror of CommonModelType) + Self::Flux1Dev, + Self::Flux1Schnell, + Self::FluxDevJuggernaut, + Self::FluxPro1, + Self::FluxPro11, + Self::FluxPro11Ultra, + Self::FluxProKontextMax, + Self::Flux2LoraAngles, + Self::GptImage1, + Self::GptImage1p5, + Self::GptImage2, + Self::GrokImage, + Self::Recraft3, + Self::SeedEdit3, + Self::Qwen, + Self::QwenEdit2511Angles, + Self::Gemini25Flash, + Self::NanoBanana, + Self::NanoBanana2, + Self::NanoBananaPro, + Self::Seedream4, + Self::Seedream4p5, + Self::Seedream5Lite, + Self::Midjourney, + Self::MidjourneyV6, + Self::MidjourneyV6p1, + Self::MidjourneyV6p1Raw, + Self::MidjourneyV7, + Self::MidjourneyV7Draft, + Self::MidjourneyV7DraftRaw, + Self::MidjourneyV7Raw, + + // Video models + Self::GrokVideo, + Self::Kling16Pro, + Self::Kling21Pro, + Self::Kling21Master, + Self::Kling2p5TurboPro, + Self::Kling2p6Pro, + Self::Kling3p0Standard, + Self::Kling3p0Pro, + Self::HappyHorse1p0, + Self::Seedance10Lite, + Self::Seedance10Pro, + Self::Seedance1p5Pro, + Self::Seedance2p0, + Self::Seedance2p0Fast, + Self::Seedance2p0BytePlus, + Self::Seedance2p0BytePlusFast, + Self::Seedance2p0Ultra, + Self::Seedance2p0UltraFast, + Self::Sora2, + Self::Sora2Pro, + Self::Veo2, + Self::Veo3, + Self::Veo3Fast, + Self::Veo3p1, + Self::Veo3p1Fast, + Self::PreviewModel, + Self::PreviewModelFast, + Self::SwitchX, + + // 3D Object generation models + Self::Hunyuan3d2_0, + Self::Hunyuan3d2_1, + Self::Hunyuan3d3, + + // Splat generation models (World Labs) + Self::Marble0p1Mini, + Self::Marble0p1Plus, ]) } + + /// Infallibly map a [`CommonModelType`] to its [`InferenceModelType`] + /// counterpart. The mapping is exhaustively 1:1 by variant name; when a + /// new variant is added to `CommonModelType`, this match will fail to + /// compile until you mirror the variant here too. + pub fn from_common_model_type(common: CommonModelType) -> Self { + match common { + // Image models + CommonModelType::Flux1Dev => Self::Flux1Dev, + CommonModelType::Flux1Schnell => Self::Flux1Schnell, + CommonModelType::FluxDevJuggernaut => Self::FluxDevJuggernaut, + CommonModelType::FluxPro1 => Self::FluxPro1, + CommonModelType::FluxPro11 => Self::FluxPro11, + CommonModelType::FluxPro11Ultra => Self::FluxPro11Ultra, + CommonModelType::FluxProKontextMax => Self::FluxProKontextMax, + CommonModelType::Flux2LoraAngles => Self::Flux2LoraAngles, + CommonModelType::GptImage1 => Self::GptImage1, + CommonModelType::GptImage1p5 => Self::GptImage1p5, + CommonModelType::GptImage2 => Self::GptImage2, + CommonModelType::GrokImage => Self::GrokImage, + CommonModelType::Recraft3 => Self::Recraft3, + CommonModelType::SeedEdit3 => Self::SeedEdit3, + CommonModelType::Qwen => Self::Qwen, + CommonModelType::QwenEdit2511Angles => Self::QwenEdit2511Angles, + CommonModelType::Gemini25Flash => Self::Gemini25Flash, + CommonModelType::NanoBanana => Self::NanoBanana, + CommonModelType::NanoBanana2 => Self::NanoBanana2, + CommonModelType::NanoBananaPro => Self::NanoBananaPro, + CommonModelType::Seedream4 => Self::Seedream4, + CommonModelType::Seedream4p5 => Self::Seedream4p5, + CommonModelType::Seedream5Lite => Self::Seedream5Lite, + CommonModelType::Midjourney => Self::Midjourney, + CommonModelType::MidjourneyV6 => Self::MidjourneyV6, + CommonModelType::MidjourneyV6p1 => Self::MidjourneyV6p1, + CommonModelType::MidjourneyV6p1Raw => Self::MidjourneyV6p1Raw, + CommonModelType::MidjourneyV7 => Self::MidjourneyV7, + CommonModelType::MidjourneyV7Draft => Self::MidjourneyV7Draft, + CommonModelType::MidjourneyV7DraftRaw => Self::MidjourneyV7DraftRaw, + CommonModelType::MidjourneyV7Raw => Self::MidjourneyV7Raw, + + // Video models + CommonModelType::GrokVideo => Self::GrokVideo, + CommonModelType::Kling16Pro => Self::Kling16Pro, + CommonModelType::Kling21Pro => Self::Kling21Pro, + CommonModelType::Kling21Master => Self::Kling21Master, + CommonModelType::Kling2p5TurboPro => Self::Kling2p5TurboPro, + CommonModelType::Kling2p6Pro => Self::Kling2p6Pro, + CommonModelType::Kling3p0Standard => Self::Kling3p0Standard, + CommonModelType::Kling3p0Pro => Self::Kling3p0Pro, + CommonModelType::HappyHorse1p0 => Self::HappyHorse1p0, + CommonModelType::Seedance10Lite => Self::Seedance10Lite, + CommonModelType::Seedance10Pro => Self::Seedance10Pro, + CommonModelType::Seedance1p5Pro => Self::Seedance1p5Pro, + CommonModelType::Seedance2p0 => Self::Seedance2p0, + CommonModelType::Seedance2p0Fast => Self::Seedance2p0Fast, + CommonModelType::Seedance2p0BytePlus => Self::Seedance2p0BytePlus, + CommonModelType::Seedance2p0BytePlusFast => Self::Seedance2p0BytePlusFast, + CommonModelType::Seedance2p0Ultra => Self::Seedance2p0Ultra, + CommonModelType::Seedance2p0UltraFast => Self::Seedance2p0UltraFast, + CommonModelType::Sora2 => Self::Sora2, + CommonModelType::Sora2Pro => Self::Sora2Pro, + CommonModelType::Veo2 => Self::Veo2, + CommonModelType::Veo3 => Self::Veo3, + CommonModelType::Veo3Fast => Self::Veo3Fast, + CommonModelType::Veo3p1 => Self::Veo3p1, + CommonModelType::Veo3p1Fast => Self::Veo3p1Fast, + CommonModelType::PreviewModel => Self::PreviewModel, + CommonModelType::PreviewModelFast => Self::PreviewModelFast, + CommonModelType::SwitchX => Self::SwitchX, + + // 3D Object generation models + CommonModelType::Hunyuan3d2_0 => Self::Hunyuan3d2_0, + CommonModelType::Hunyuan3d2_1 => Self::Hunyuan3d2_1, + CommonModelType::Hunyuan3d3 => Self::Hunyuan3d3, + + // Splat generation models (World Labs) + CommonModelType::Marble0p1Mini => Self::Marble0p1Mini, + CommonModelType::Marble0p1Plus => Self::Marble0p1Plus, + } + } } #[cfg(test)] mod tests { use crate::by_table::generic_inference_jobs::inference_model_type::InferenceModelType; + use crate::common::generation::common_model_type::CommonModelType; use crate::test_helpers::assert_serialization; mod explicit_checks { @@ -138,6 +594,7 @@ mod tests { #[test] fn test_serialization() { + // Legacy variants assert_serialization(InferenceModelType::RvcV2, "rvc_v2"); assert_serialization(InferenceModelType::SadTalker, "sad_talker"); assert_serialization(InferenceModelType::SeedVc, "seed_vc"); @@ -153,74 +610,336 @@ mod tests { assert_serialization(InferenceModelType::StyleTTS2, "styletts2"); assert_serialization(InferenceModelType::ConvertFbxToGltf, "convert_fbx_gltf"); assert_serialization(InferenceModelType::BvhToWorkflow, "bvh_to_workflow"); + + // Image models (mirror of CommonModelType) + assert_serialization(InferenceModelType::Flux1Dev, "flux_1_dev"); + assert_serialization(InferenceModelType::Flux1Schnell, "flux_1_schnell"); + assert_serialization(InferenceModelType::FluxDevJuggernaut, "flux_dev_juggernaut"); + assert_serialization(InferenceModelType::FluxPro1, "flux_pro_1"); + assert_serialization(InferenceModelType::FluxPro11, "flux_pro_1p1"); + assert_serialization(InferenceModelType::FluxPro11Ultra, "flux_pro_1p1_ultra"); + assert_serialization(InferenceModelType::FluxProKontextMax, "flux_pro_kontext_max"); + assert_serialization(InferenceModelType::Flux2LoraAngles, "flux_2_lora_angles"); + assert_serialization(InferenceModelType::GptImage1, "gpt_image_1"); + assert_serialization(InferenceModelType::GptImage1p5, "gpt_image_1p5"); + assert_serialization(InferenceModelType::GptImage2, "gpt_image_2"); + assert_serialization(InferenceModelType::GrokImage, "grok_image"); + assert_serialization(InferenceModelType::Recraft3, "recraft_3"); + assert_serialization(InferenceModelType::SeedEdit3, "seededit_3"); + assert_serialization(InferenceModelType::Qwen, "qwen"); + assert_serialization(InferenceModelType::QwenEdit2511Angles, "qwen_edit_2511_angles"); + assert_serialization(InferenceModelType::Gemini25Flash, "gemini_25_flash"); + assert_serialization(InferenceModelType::NanoBanana, "nano_banana"); + assert_serialization(InferenceModelType::NanoBanana2, "nano_banana_2"); + assert_serialization(InferenceModelType::NanoBananaPro, "nano_banana_pro"); + assert_serialization(InferenceModelType::Seedream4, "seedream_4"); + assert_serialization(InferenceModelType::Seedream4p5, "seedream_4p5"); + assert_serialization(InferenceModelType::Seedream5Lite, "seedream_5_lite"); + assert_serialization(InferenceModelType::Midjourney, "midjourney"); + assert_serialization(InferenceModelType::MidjourneyV6, "midjourney_v6"); + assert_serialization(InferenceModelType::MidjourneyV6p1, "midjourney_v6p1"); + assert_serialization(InferenceModelType::MidjourneyV6p1Raw, "midjourney_v6p1_raw"); + assert_serialization(InferenceModelType::MidjourneyV7, "midjourney_v7"); + assert_serialization(InferenceModelType::MidjourneyV7Draft, "midjourney_v7_draft"); + assert_serialization(InferenceModelType::MidjourneyV7DraftRaw, "midjourney_v7_draft_raw"); + assert_serialization(InferenceModelType::MidjourneyV7Raw, "midjourney_v7_raw"); + + // Video models + assert_serialization(InferenceModelType::GrokVideo, "grok_video"); + assert_serialization(InferenceModelType::Kling16Pro, "kling_1p6_pro"); + assert_serialization(InferenceModelType::Kling21Pro, "kling_2p1_pro"); + assert_serialization(InferenceModelType::Kling21Master, "kling_2p1_master"); + assert_serialization(InferenceModelType::Kling2p5TurboPro, "kling_2p5_turbo_pro"); + assert_serialization(InferenceModelType::Kling2p6Pro, "kling_2p6_pro"); + assert_serialization(InferenceModelType::Kling3p0Standard, "kling_3p0_standard"); + assert_serialization(InferenceModelType::Kling3p0Pro, "kling_3p0_pro"); + assert_serialization(InferenceModelType::HappyHorse1p0, "happy_horse_1p0"); + assert_serialization(InferenceModelType::Seedance10Lite, "seedance_1p0_lite"); + assert_serialization(InferenceModelType::Seedance10Pro, "seedance_1p0_pro"); + assert_serialization(InferenceModelType::Seedance1p5Pro, "seedance_1p5_pro"); + assert_serialization(InferenceModelType::Seedance2p0, "seedance_2p0"); + assert_serialization(InferenceModelType::Seedance2p0Fast, "seedance_2p0_fast"); + assert_serialization(InferenceModelType::Seedance2p0BytePlus, "seedance_2p0_bp"); + assert_serialization(InferenceModelType::Seedance2p0BytePlusFast, "seedance_2p0_bp_fast"); + assert_serialization(InferenceModelType::Seedance2p0Ultra, "seedance_2p0_u"); + assert_serialization(InferenceModelType::Seedance2p0UltraFast, "seedance_2p0_u_fast"); + assert_serialization(InferenceModelType::Sora2, "sora_2"); + assert_serialization(InferenceModelType::Sora2Pro, "sora_2_pro"); + assert_serialization(InferenceModelType::Veo2, "veo_2"); + assert_serialization(InferenceModelType::Veo3, "veo_3"); + assert_serialization(InferenceModelType::Veo3Fast, "veo_3_fast"); + assert_serialization(InferenceModelType::Veo3p1, "veo_3p1"); + assert_serialization(InferenceModelType::Veo3p1Fast, "veo_3p1_fast"); + assert_serialization(InferenceModelType::PreviewModel, "preview_model"); + assert_serialization(InferenceModelType::PreviewModelFast, "preview_model_fast"); + assert_serialization(InferenceModelType::SwitchX, "switch_x"); + + // 3D Object generation models + assert_serialization(InferenceModelType::Hunyuan3d2_0, "hunyuan_3d_2p0"); + assert_serialization(InferenceModelType::Hunyuan3d2_1, "hunyuan_3d_2p1"); + assert_serialization(InferenceModelType::Hunyuan3d3, "hunyuan_3d_3"); + + // Splat generation models (World Labs) + assert_serialization(InferenceModelType::Marble0p1Mini, "marble_0p1_mini"); + assert_serialization(InferenceModelType::Marble0p1Plus, "marble_0p1_plus"); } #[test] fn to_str() { + // Legacy variants assert_eq!(InferenceModelType::ComfyUi.to_str(), "comfy_ui"); assert_eq!(InferenceModelType::RvcV2.to_str(), "rvc_v2"); assert_eq!(InferenceModelType::SadTalker.to_str(), "sad_talker"); assert_eq!(InferenceModelType::SoVitsSvc.to_str(), "so_vits_svc"); - assert_eq!(InferenceModelType::SoVitsSvc.to_str(), "so_vits_svc"); + assert_eq!(InferenceModelType::SeedVc.to_str(), "seed_vc"); + assert_eq!(InferenceModelType::ImageGenApi.to_str(), "image_gen_api"); assert_eq!(InferenceModelType::Tacotron2.to_str(), "tacotron2"); assert_eq!(InferenceModelType::Vits.to_str(), "vits"); assert_eq!(InferenceModelType::VallEX.to_str(), "vall_e_x"); assert_eq!(InferenceModelType::RerenderAVideo.to_str(), "rerender_a_video"); assert_eq!(InferenceModelType::StableDiffusion.to_str(), "stable_diffusion"); - assert_eq!(InferenceModelType::ImageGenApi.to_str(), "image_gen_api"); assert_eq!(InferenceModelType::MocapNet.to_str(), "mocap_net"); assert_eq!(InferenceModelType::StyleTTS2.to_str(), "styletts2"); assert_eq!(InferenceModelType::ConvertFbxToGltf.to_str(), "convert_fbx_gltf"); assert_eq!(InferenceModelType::BvhToWorkflow.to_str(), "bvh_to_workflow"); + + // Image models (mirror of CommonModelType) + assert_eq!(InferenceModelType::Flux1Dev.to_str(), "flux_1_dev"); + assert_eq!(InferenceModelType::Flux1Schnell.to_str(), "flux_1_schnell"); + assert_eq!(InferenceModelType::FluxDevJuggernaut.to_str(), "flux_dev_juggernaut"); + assert_eq!(InferenceModelType::FluxPro1.to_str(), "flux_pro_1"); + assert_eq!(InferenceModelType::FluxPro11.to_str(), "flux_pro_1p1"); + assert_eq!(InferenceModelType::FluxPro11Ultra.to_str(), "flux_pro_1p1_ultra"); + assert_eq!(InferenceModelType::FluxProKontextMax.to_str(), "flux_pro_kontext_max"); + assert_eq!(InferenceModelType::Flux2LoraAngles.to_str(), "flux_2_lora_angles"); + assert_eq!(InferenceModelType::GptImage1.to_str(), "gpt_image_1"); + assert_eq!(InferenceModelType::GptImage1p5.to_str(), "gpt_image_1p5"); + assert_eq!(InferenceModelType::GptImage2.to_str(), "gpt_image_2"); + assert_eq!(InferenceModelType::GrokImage.to_str(), "grok_image"); + assert_eq!(InferenceModelType::Recraft3.to_str(), "recraft_3"); + assert_eq!(InferenceModelType::SeedEdit3.to_str(), "seededit_3"); + assert_eq!(InferenceModelType::Qwen.to_str(), "qwen"); + assert_eq!(InferenceModelType::QwenEdit2511Angles.to_str(), "qwen_edit_2511_angles"); + assert_eq!(InferenceModelType::Gemini25Flash.to_str(), "gemini_25_flash"); + assert_eq!(InferenceModelType::NanoBanana.to_str(), "nano_banana"); + assert_eq!(InferenceModelType::NanoBanana2.to_str(), "nano_banana_2"); + assert_eq!(InferenceModelType::NanoBananaPro.to_str(), "nano_banana_pro"); + assert_eq!(InferenceModelType::Seedream4.to_str(), "seedream_4"); + assert_eq!(InferenceModelType::Seedream4p5.to_str(), "seedream_4p5"); + assert_eq!(InferenceModelType::Seedream5Lite.to_str(), "seedream_5_lite"); + assert_eq!(InferenceModelType::Midjourney.to_str(), "midjourney"); + assert_eq!(InferenceModelType::MidjourneyV6.to_str(), "midjourney_v6"); + assert_eq!(InferenceModelType::MidjourneyV6p1.to_str(), "midjourney_v6p1"); + assert_eq!(InferenceModelType::MidjourneyV6p1Raw.to_str(), "midjourney_v6p1_raw"); + assert_eq!(InferenceModelType::MidjourneyV7.to_str(), "midjourney_v7"); + assert_eq!(InferenceModelType::MidjourneyV7Draft.to_str(), "midjourney_v7_draft"); + assert_eq!(InferenceModelType::MidjourneyV7DraftRaw.to_str(), "midjourney_v7_draft_raw"); + assert_eq!(InferenceModelType::MidjourneyV7Raw.to_str(), "midjourney_v7_raw"); + + // Video models + assert_eq!(InferenceModelType::GrokVideo.to_str(), "grok_video"); + assert_eq!(InferenceModelType::Kling16Pro.to_str(), "kling_1p6_pro"); + assert_eq!(InferenceModelType::Kling21Pro.to_str(), "kling_2p1_pro"); + assert_eq!(InferenceModelType::Kling21Master.to_str(), "kling_2p1_master"); + assert_eq!(InferenceModelType::Kling2p5TurboPro.to_str(), "kling_2p5_turbo_pro"); + assert_eq!(InferenceModelType::Kling2p6Pro.to_str(), "kling_2p6_pro"); + assert_eq!(InferenceModelType::Kling3p0Standard.to_str(), "kling_3p0_standard"); + assert_eq!(InferenceModelType::Kling3p0Pro.to_str(), "kling_3p0_pro"); + assert_eq!(InferenceModelType::HappyHorse1p0.to_str(), "happy_horse_1p0"); + assert_eq!(InferenceModelType::Seedance10Lite.to_str(), "seedance_1p0_lite"); + assert_eq!(InferenceModelType::Seedance10Pro.to_str(), "seedance_1p0_pro"); + assert_eq!(InferenceModelType::Seedance1p5Pro.to_str(), "seedance_1p5_pro"); + assert_eq!(InferenceModelType::Seedance2p0.to_str(), "seedance_2p0"); + assert_eq!(InferenceModelType::Seedance2p0Fast.to_str(), "seedance_2p0_fast"); + assert_eq!(InferenceModelType::Seedance2p0BytePlus.to_str(), "seedance_2p0_bp"); + assert_eq!(InferenceModelType::Seedance2p0BytePlusFast.to_str(), "seedance_2p0_bp_fast"); + assert_eq!(InferenceModelType::Seedance2p0Ultra.to_str(), "seedance_2p0_u"); + assert_eq!(InferenceModelType::Seedance2p0UltraFast.to_str(), "seedance_2p0_u_fast"); + assert_eq!(InferenceModelType::Sora2.to_str(), "sora_2"); + assert_eq!(InferenceModelType::Sora2Pro.to_str(), "sora_2_pro"); + assert_eq!(InferenceModelType::Veo2.to_str(), "veo_2"); + assert_eq!(InferenceModelType::Veo3.to_str(), "veo_3"); + assert_eq!(InferenceModelType::Veo3Fast.to_str(), "veo_3_fast"); + assert_eq!(InferenceModelType::Veo3p1.to_str(), "veo_3p1"); + assert_eq!(InferenceModelType::Veo3p1Fast.to_str(), "veo_3p1_fast"); + assert_eq!(InferenceModelType::PreviewModel.to_str(), "preview_model"); + assert_eq!(InferenceModelType::PreviewModelFast.to_str(), "preview_model_fast"); + assert_eq!(InferenceModelType::SwitchX.to_str(), "switch_x"); + + // 3D Object generation models + assert_eq!(InferenceModelType::Hunyuan3d2_0.to_str(), "hunyuan_3d_2p0"); + assert_eq!(InferenceModelType::Hunyuan3d2_1.to_str(), "hunyuan_3d_2p1"); + assert_eq!(InferenceModelType::Hunyuan3d3.to_str(), "hunyuan_3d_3"); + + // Splat generation models (World Labs) + assert_eq!(InferenceModelType::Marble0p1Mini.to_str(), "marble_0p1_mini"); + assert_eq!(InferenceModelType::Marble0p1Plus.to_str(), "marble_0p1_plus"); } #[test] fn from_str() { + // Legacy variants + assert_eq!(InferenceModelType::from_str("comfy_ui").unwrap(), InferenceModelType::ComfyUi); assert_eq!(InferenceModelType::from_str("rvc_v2").unwrap(), InferenceModelType::RvcV2); assert_eq!(InferenceModelType::from_str("sad_talker").unwrap(), InferenceModelType::SadTalker); - assert_eq!(InferenceModelType::from_str("seed_vc").unwrap(), InferenceModelType::SeedVc); assert_eq!(InferenceModelType::from_str("so_vits_svc").unwrap(), InferenceModelType::SoVitsSvc); + assert_eq!(InferenceModelType::from_str("seed_vc").unwrap(), InferenceModelType::SeedVc); + assert_eq!(InferenceModelType::from_str("image_gen_api").unwrap(), InferenceModelType::ImageGenApi); assert_eq!(InferenceModelType::from_str("tacotron2").unwrap(), InferenceModelType::Tacotron2); assert_eq!(InferenceModelType::from_str("vits").unwrap(), InferenceModelType::Vits); assert_eq!(InferenceModelType::from_str("vall_e_x").unwrap(), InferenceModelType::VallEX); assert_eq!(InferenceModelType::from_str("rerender_a_video").unwrap(), InferenceModelType::RerenderAVideo); assert_eq!(InferenceModelType::from_str("stable_diffusion").unwrap(), InferenceModelType::StableDiffusion); - assert_eq!(InferenceModelType::from_str("image_gen_api").unwrap(), InferenceModelType::ImageGenApi); assert_eq!(InferenceModelType::from_str("mocap_net").unwrap(), InferenceModelType::MocapNet); assert_eq!(InferenceModelType::from_str("styletts2").unwrap(), InferenceModelType::StyleTTS2); - assert_eq!(InferenceModelType::from_str("comfy_ui").unwrap(), InferenceModelType::ComfyUi); assert_eq!(InferenceModelType::from_str("convert_fbx_gltf").unwrap(), InferenceModelType::ConvertFbxToGltf); assert_eq!(InferenceModelType::from_str("bvh_to_workflow").unwrap(), InferenceModelType::BvhToWorkflow); + + // Image models (mirror of CommonModelType) + assert_eq!(InferenceModelType::from_str("flux_1_dev").unwrap(), InferenceModelType::Flux1Dev); + assert_eq!(InferenceModelType::from_str("flux_1_schnell").unwrap(), InferenceModelType::Flux1Schnell); + assert_eq!(InferenceModelType::from_str("flux_dev_juggernaut").unwrap(), InferenceModelType::FluxDevJuggernaut); + assert_eq!(InferenceModelType::from_str("flux_pro_1").unwrap(), InferenceModelType::FluxPro1); + assert_eq!(InferenceModelType::from_str("flux_pro_1p1").unwrap(), InferenceModelType::FluxPro11); + assert_eq!(InferenceModelType::from_str("flux_pro_1p1_ultra").unwrap(), InferenceModelType::FluxPro11Ultra); + assert_eq!(InferenceModelType::from_str("flux_pro_kontext_max").unwrap(), InferenceModelType::FluxProKontextMax); + assert_eq!(InferenceModelType::from_str("flux_2_lora_angles").unwrap(), InferenceModelType::Flux2LoraAngles); + assert_eq!(InferenceModelType::from_str("gpt_image_1").unwrap(), InferenceModelType::GptImage1); + assert_eq!(InferenceModelType::from_str("gpt_image_1p5").unwrap(), InferenceModelType::GptImage1p5); + assert_eq!(InferenceModelType::from_str("gpt_image_2").unwrap(), InferenceModelType::GptImage2); + assert_eq!(InferenceModelType::from_str("grok_image").unwrap(), InferenceModelType::GrokImage); + assert_eq!(InferenceModelType::from_str("recraft_3").unwrap(), InferenceModelType::Recraft3); + assert_eq!(InferenceModelType::from_str("seededit_3").unwrap(), InferenceModelType::SeedEdit3); + assert_eq!(InferenceModelType::from_str("qwen").unwrap(), InferenceModelType::Qwen); + assert_eq!(InferenceModelType::from_str("qwen_edit_2511_angles").unwrap(), InferenceModelType::QwenEdit2511Angles); + assert_eq!(InferenceModelType::from_str("gemini_25_flash").unwrap(), InferenceModelType::Gemini25Flash); + assert_eq!(InferenceModelType::from_str("nano_banana").unwrap(), InferenceModelType::NanoBanana); + assert_eq!(InferenceModelType::from_str("nano_banana_2").unwrap(), InferenceModelType::NanoBanana2); + assert_eq!(InferenceModelType::from_str("nano_banana_pro").unwrap(), InferenceModelType::NanoBananaPro); + assert_eq!(InferenceModelType::from_str("seedream_4").unwrap(), InferenceModelType::Seedream4); + assert_eq!(InferenceModelType::from_str("seedream_4p5").unwrap(), InferenceModelType::Seedream4p5); + assert_eq!(InferenceModelType::from_str("seedream_5_lite").unwrap(), InferenceModelType::Seedream5Lite); + assert_eq!(InferenceModelType::from_str("midjourney").unwrap(), InferenceModelType::Midjourney); + assert_eq!(InferenceModelType::from_str("midjourney_v6").unwrap(), InferenceModelType::MidjourneyV6); + assert_eq!(InferenceModelType::from_str("midjourney_v6p1").unwrap(), InferenceModelType::MidjourneyV6p1); + assert_eq!(InferenceModelType::from_str("midjourney_v6p1_raw").unwrap(), InferenceModelType::MidjourneyV6p1Raw); + assert_eq!(InferenceModelType::from_str("midjourney_v7").unwrap(), InferenceModelType::MidjourneyV7); + assert_eq!(InferenceModelType::from_str("midjourney_v7_draft").unwrap(), InferenceModelType::MidjourneyV7Draft); + assert_eq!(InferenceModelType::from_str("midjourney_v7_draft_raw").unwrap(), InferenceModelType::MidjourneyV7DraftRaw); + assert_eq!(InferenceModelType::from_str("midjourney_v7_raw").unwrap(), InferenceModelType::MidjourneyV7Raw); + + // Video models + assert_eq!(InferenceModelType::from_str("grok_video").unwrap(), InferenceModelType::GrokVideo); + assert_eq!(InferenceModelType::from_str("kling_1p6_pro").unwrap(), InferenceModelType::Kling16Pro); + assert_eq!(InferenceModelType::from_str("kling_2p1_pro").unwrap(), InferenceModelType::Kling21Pro); + assert_eq!(InferenceModelType::from_str("kling_2p1_master").unwrap(), InferenceModelType::Kling21Master); + assert_eq!(InferenceModelType::from_str("kling_2p5_turbo_pro").unwrap(), InferenceModelType::Kling2p5TurboPro); + assert_eq!(InferenceModelType::from_str("kling_2p6_pro").unwrap(), InferenceModelType::Kling2p6Pro); + assert_eq!(InferenceModelType::from_str("kling_3p0_standard").unwrap(), InferenceModelType::Kling3p0Standard); + assert_eq!(InferenceModelType::from_str("kling_3p0_pro").unwrap(), InferenceModelType::Kling3p0Pro); + assert_eq!(InferenceModelType::from_str("happy_horse_1p0").unwrap(), InferenceModelType::HappyHorse1p0); + assert_eq!(InferenceModelType::from_str("seedance_1p0_lite").unwrap(), InferenceModelType::Seedance10Lite); + assert_eq!(InferenceModelType::from_str("seedance_1p0_pro").unwrap(), InferenceModelType::Seedance10Pro); + assert_eq!(InferenceModelType::from_str("seedance_1p5_pro").unwrap(), InferenceModelType::Seedance1p5Pro); + assert_eq!(InferenceModelType::from_str("seedance_2p0").unwrap(), InferenceModelType::Seedance2p0); + assert_eq!(InferenceModelType::from_str("seedance_2p0_fast").unwrap(), InferenceModelType::Seedance2p0Fast); + assert_eq!(InferenceModelType::from_str("seedance_2p0_bp").unwrap(), InferenceModelType::Seedance2p0BytePlus); + assert_eq!(InferenceModelType::from_str("seedance_2p0_bp_fast").unwrap(), InferenceModelType::Seedance2p0BytePlusFast); + assert_eq!(InferenceModelType::from_str("seedance_2p0_u").unwrap(), InferenceModelType::Seedance2p0Ultra); + assert_eq!(InferenceModelType::from_str("seedance_2p0_u_fast").unwrap(), InferenceModelType::Seedance2p0UltraFast); + assert_eq!(InferenceModelType::from_str("sora_2").unwrap(), InferenceModelType::Sora2); + assert_eq!(InferenceModelType::from_str("sora_2_pro").unwrap(), InferenceModelType::Sora2Pro); + assert_eq!(InferenceModelType::from_str("veo_2").unwrap(), InferenceModelType::Veo2); + assert_eq!(InferenceModelType::from_str("veo_3").unwrap(), InferenceModelType::Veo3); + assert_eq!(InferenceModelType::from_str("veo_3_fast").unwrap(), InferenceModelType::Veo3Fast); + assert_eq!(InferenceModelType::from_str("veo_3p1").unwrap(), InferenceModelType::Veo3p1); + assert_eq!(InferenceModelType::from_str("veo_3p1_fast").unwrap(), InferenceModelType::Veo3p1Fast); + assert_eq!(InferenceModelType::from_str("preview_model").unwrap(), InferenceModelType::PreviewModel); + assert_eq!(InferenceModelType::from_str("preview_model_fast").unwrap(), InferenceModelType::PreviewModelFast); + assert_eq!(InferenceModelType::from_str("switch_x").unwrap(), InferenceModelType::SwitchX); + + // 3D Object generation models + assert_eq!(InferenceModelType::from_str("hunyuan_3d_2p0").unwrap(), InferenceModelType::Hunyuan3d2_0); + assert_eq!(InferenceModelType::from_str("hunyuan_3d_2p1").unwrap(), InferenceModelType::Hunyuan3d2_1); + assert_eq!(InferenceModelType::from_str("hunyuan_3d_3").unwrap(), InferenceModelType::Hunyuan3d3); + + // Splat generation models (World Labs) + assert_eq!(InferenceModelType::from_str("marble_0p1_mini").unwrap(), InferenceModelType::Marble0p1Mini); + assert_eq!(InferenceModelType::from_str("marble_0p1_plus").unwrap(), InferenceModelType::Marble0p1Plus); + } + + #[test] + fn from_str_unknown_value_errors() { + assert!(InferenceModelType::from_str("not_a_real_model").is_err()); } #[test] fn all_variants() { - // Static check - let mut variants = InferenceModelType::all_variants(); - assert_eq!(variants.len(), 15); - assert_eq!(variants.pop_first(), Some(InferenceModelType::ComfyUi)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::RvcV2)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::SadTalker)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::SoVitsSvc)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::SeedVc)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::Tacotron2)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::Vits)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::VallEX)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::RerenderAVideo)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::StableDiffusion)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::ImageGenApi)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::MocapNet)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::StyleTTS2)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::ConvertFbxToGltf)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::BvhToWorkflow)); - assert_eq!(variants.pop_first(), None); + // 15 legacy variants + every CommonModelType variant we mirror. + let variants = InferenceModelType::all_variants(); + assert_eq!(variants.len(), 15 + CommonModelType::all_variants().len()); - // Generated check - use strum::IntoEnumIterator; - assert_eq!(InferenceModelType::all_variants().len(), InferenceModelType::iter().len()); + // BTreeSet sort order is enum Ord = declaration order. The legacy + // block is declared first, so ComfyUi is always pop_first, and the + // legacy block is exhausted before the mirrored block begins. + assert_eq!(variants.iter().next(), Some(&InferenceModelType::ComfyUi)); + + // Every variant must be reachable via from_str(to_str(.)) — round-trip + // is the structural guarantee we actually care about here. + for variant in &variants { + assert_eq!(*variant, InferenceModelType::from_str(variant.to_str()).unwrap()); + } } } - + + mod from_common_model_type_tests { + use super::*; + + #[test] + fn round_trip_via_serialized_string() { + // Every CommonModelType maps to an InferenceModelType whose + // serialization matches exactly. This proves the 1:1 mapping + // is consistent (no swapped variants). + for common in CommonModelType::all_variants() { + let inference = InferenceModelType::from_common_model_type(common); + assert_eq!( + common.to_str(), + inference.to_str(), + "mismatch: CommonModelType::{:?} -> InferenceModelType::{:?}", + common, inference, + ); + } + } + + #[test] + fn every_common_variant_is_covered() { + // If a CommonModelType variant is missing from the match in + // from_common_model_type, this would fail to compile. The runtime + // assertion is a belt-and-suspenders sanity check. + let count = CommonModelType::all_variants().len(); + assert!(count > 0); + for common in CommonModelType::all_variants() { + let _ = InferenceModelType::from_common_model_type(common); + } + } + + #[test] + fn spot_check_specific_mappings() { + assert_eq!( + InferenceModelType::from_common_model_type(CommonModelType::Flux1Dev), + InferenceModelType::Flux1Dev, + ); + assert_eq!( + InferenceModelType::from_common_model_type(CommonModelType::Sora2Pro), + InferenceModelType::Sora2Pro, + ); + assert_eq!( + InferenceModelType::from_common_model_type(CommonModelType::Marble0p1Plus), + InferenceModelType::Marble0p1Plus, + ); + } + } + mod mechanical_checks { use super::*; @@ -245,7 +964,7 @@ mod tests { for variant in InferenceModelType::all_variants() { let serialized = variant.to_str(); assert!(serialized.len() > 0, "variant {:?} is too short", variant); - assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long", variant); + assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long ({} chars)", variant, serialized.len()); } } } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/create_character_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/create_character_handler.rs index 1e52b42384..2bfade6d55 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/create_character_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/create_character_handler.rs @@ -192,6 +192,7 @@ pub async fn create_character_handler( uuid_idempotency_token: &request.uuid_idempotency_token, apriori_job_token: &apriori_job_token, kinovi_character_id: &gen_result.character_id, + maybe_model_type: None, maybe_creator_user_token: Some(user_token), maybe_avt_token: None, creator_ip_address: &ip_address, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs index ac72405177..813ce38bae 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs @@ -232,6 +232,7 @@ pub async fn flux_2_lora_edit_image_angle_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Flux2LoraAngles), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs index bccc707f41..dcded09ba5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs @@ -233,6 +233,7 @@ pub async fn qwen_edit_2511_edit_image_angle_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::QwenEdit2511Angles), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/bg_removal/remove_image_background_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/bg_removal/remove_image_background_handler.rs index 6b8cbd507e..faa10a956a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/bg_removal/remove_image_background_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/bg_removal/remove_image_background_handler.rs @@ -152,6 +152,7 @@ pub async fn remove_image_background_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::BackgroundRemoval, + maybe_model_type: None, maybe_inference_args: None, maybe_prompt_token: None, maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/flux_pro_kontext_max_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/flux_pro_kontext_max_edit_image_handler.rs index 7004edc50f..c213757a27 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/flux_pro_kontext_max_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/flux_pro_kontext_max_edit_image_handler.rs @@ -270,6 +270,7 @@ pub async fn flux_pro_kontext_max_edit_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::FluxProKontextMax), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs index 5056b42d16..05bd1a8607 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs @@ -257,6 +257,7 @@ pub async fn gemini_25_flash_edit_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Gemini25Flash), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), 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 e84ac39498..c83d460061 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 @@ -289,6 +289,7 @@ pub async fn gpt_image_1_edit_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::GptImage1), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs index 35b1ca4303..8f19a63ebd 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs @@ -262,6 +262,7 @@ pub async fn qwen_edit_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Qwen), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/seededit_3_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/seededit_3_edit_image_handler.rs index 650d94e16e..f640137f1a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/seededit_3_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/seededit_3_edit_image_handler.rs @@ -223,6 +223,7 @@ pub async fn seededit_3_edit_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::SeedEdit3), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_dev_juggernaut_inpaint_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_dev_juggernaut_inpaint_handler.rs index fa3aae6bfa..8152248243 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_dev_juggernaut_inpaint_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_dev_juggernaut_inpaint_handler.rs @@ -270,6 +270,7 @@ pub async fn flux_dev_juggernaut_inpaint_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::FluxDevJuggernaut), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_pro_1_inpaint_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_pro_1_inpaint_handler.rs index 18da340d52..2c7497243e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_pro_1_inpaint_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/inpaint/flux_pro_1_inpaint_handler.rs @@ -270,6 +270,7 @@ pub async fn flux_pro_1_inpaint_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::FluxPro1), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs index 679c00d4b1..7877e40b4f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs @@ -311,6 +311,7 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Seedream5Lite), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs index a2bb31a86f..ed7b1522a4 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs @@ -332,6 +332,7 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Seedream4), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs index cdcd024583..12cac93730 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs @@ -329,6 +329,7 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Seedream4p5), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs index 375d80251b..0f8863109f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs @@ -380,6 +380,7 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::GptImage1p5), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs index 037241dc58..d165d44e4e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs @@ -341,6 +341,7 @@ pub async fn nano_banana_2_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::NanoBanana2), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs index 3a7c27b32f..d1521b2e4e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs @@ -329,6 +329,7 @@ pub async fn nano_banana_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::NanoBanana), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs index 5563be6042..b58a5558d2 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs @@ -350,6 +350,7 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::NanoBananaPro), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_dev_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_dev_text_to_image_handler.rs index 12f830f745..1719fbcc19 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_dev_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_dev_text_to_image_handler.rs @@ -243,6 +243,7 @@ pub async fn generate_flux_1_dev_text_to_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Flux1Dev), 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), @@ -328,6 +329,7 @@ async fn insert_mock_failure_job( let mock_result = insert_generic_inference_job_for_fal_queue_mock_failure(InsertGenericInferenceForFalMockFailureArgs { uuid_idempotency_token, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::Flux1Dev), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_schnell_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_schnell_text_to_image_handler.rs index 52d390be47..13ef78099b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_schnell_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_1_schnell_text_to_image_handler.rs @@ -223,6 +223,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_model_type: Some(CommonModelType::Flux1Schnell), maybe_prompt_token: prompt_token.as_ref(), maybe_inference_args: None, maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs index 7abac4c821..d04b874d7d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs @@ -209,6 +209,7 @@ pub async fn generate_flux_pro_11_text_to_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::FluxPro11), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs index ec1d24b78e..fcd15fcbba 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs @@ -217,6 +217,7 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::FluxPro11Ultra), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs index acc05838cb..e3d3902949 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs @@ -223,6 +223,7 @@ pub async fn generate_gpt_image_1_text_to_image_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: Some(CommonModelType::GptImage1), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(&user_token), 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 cfeffb1e68..ea8bc9813d 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 @@ -218,6 +218,7 @@ pub async fn generate_hunyuan_2_0_image_to_3d_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ObjectGeneration, + maybe_model_type: Some(CommonModelType::Hunyuan3d2_0), 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), 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 bff69e9d55..9ff3a290f5 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 @@ -217,6 +217,7 @@ pub async fn generate_hunyuan_2_1_image_to_3d_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ObjectGeneration, + maybe_model_type: Some(CommonModelType::Hunyuan3d2_1), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/multi_function/generate_hunyuan3d_v3_multi_function_object_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/multi_function/generate_hunyuan3d_v3_multi_function_object_handler.rs index a0d94bf889..7e5a56ef35 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/multi_function/generate_hunyuan3d_v3_multi_function_object_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/object/multi_function/generate_hunyuan3d_v3_multi_function_object_handler.rs @@ -384,6 +384,7 @@ pub async fn generate_hunyuan3d_v3_multi_function_object_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ObjectGeneration, + maybe_model_type: Some(CommonModelType::Hunyuan3d3), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs index 16c781f9e3..4f39d5c324 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs @@ -224,6 +224,7 @@ pub async fn generate_worldlabs_marble_0p1_mini_splat_handler( apriori_job_token: &apriori_job_token, uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: generate_result.operation_id.as_str(), + maybe_model_type: Some(CommonModelType::Marble0p1Mini), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_wallet_ledger_entry_token: Some(&wallet_deduction.ledger_entry_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs index 9c805ca3da..8d0df11c2d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs @@ -224,6 +224,7 @@ pub async fn generate_worldlabs_marble_0p1_plus_splat_handler( apriori_job_token: &apriori_job_token, uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: generate_result.operation_id.as_str(), + maybe_model_type: Some(CommonModelType::Marble0p1Plus), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_wallet_ledger_entry_token: Some(&wallet_deduction.ledger_entry_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs index 58dc355ec3..4170df645e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/edit/beeble_switchx_edit_video_gen_handler.rs @@ -310,6 +310,7 @@ pub async fn beeble_switchx_edit_video_gen_handler( apriori_job_token: &apriori_job_token, uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: external_job_id, + maybe_model_type: Some(CommonModelType::SwitchX), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs index ac43c2d8bf..5299853d74 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs @@ -22,9 +22,7 @@ use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestC use fal_client::requests::webhook::video::image::enqueue_kling_v1p6_pro_image_to_video_webhook::{enqueue_kling_v1p6_pro_image_to_video_webhook, Kling1p6ProArgs, Kling1p6ProRequest, Kling1p6ProAspectRatio, Kling1p6ProDuration}; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::media_files::get::batch_get_media_files_by_tokens::batch_get_media_files_by_tokens_with_connection; @@ -260,6 +258,7 @@ pub async fn generate_kling_1_6_pro_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling16Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs index afc814ba97..a724cbc508 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs @@ -245,6 +245,7 @@ pub async fn generate_kling_2_1_master_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling21Master), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs index 180d2ab655..a4f8328fa7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs @@ -261,6 +261,7 @@ pub async fn generate_kling_2_1_pro_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling21Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs index 3961785cd2..73b8b5552f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs @@ -279,6 +279,7 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Seedance10Lite), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs index 6e0e6c2e88..5f5bac127a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs @@ -27,9 +27,7 @@ use fal_client::requests::webhook::video::image::enqueue_seedance_1_pro_image_to use fal_client::requests::webhook::video::image::enqueue_seedance_1_pro_image_to_video_webhook::{Seedance1ProArgs, Seedance1ProRequest, Seedance1ProResolution}; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; 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}; @@ -255,6 +253,7 @@ pub async fn generate_seedance_1_0_pro_image_to_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Seedance10Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs index 9741d2e0e5..9b878a2e9e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs @@ -30,9 +30,7 @@ use fal_client::requests::webhook::video::image::enqueue_veo_2_image_to_video_we use fal_client::requests::webhook::video::image::enqueue_veo_2_image_to_video_webhook::Veo2Request; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; 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; @@ -250,6 +248,7 @@ pub async fn generate_veo_2_image_to_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Veo2), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: maybe_user_session diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs index 57afbbfcd0..4036e3eb43 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs @@ -22,9 +22,7 @@ use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestC use fal_client::requests::webhook::video::image::enqueue_veo_3_fast_image_to_video_webhook::{enqueue_veo_3_fast_image_to_video_webhook, Veo3FastArgs, Veo3FastAspectRatio, Veo3FastDuration, Veo3FastRequest, Veo3FastResolution}; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; 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; @@ -255,6 +253,7 @@ pub async fn generate_veo_3_fast_image_to_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Veo3Fast), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: maybe_user_session diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs index 1f1b15dd46..dc7c19a5b7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs @@ -257,6 +257,7 @@ pub async fn generate_veo_3_image_to_video_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Veo3), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: maybe_user_session diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs index 76449c8fe0..e83dccc848 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs @@ -338,6 +338,7 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling2p5TurboPro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs index 9d18d0896b..ecc16dcab9 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs @@ -335,6 +335,7 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling2p6Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs index b0a835e0ac..da216b1d8b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs @@ -340,6 +340,7 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling3p0Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs index 3bacaf51ea..a2304fcd04 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs @@ -340,6 +340,7 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Kling3p0Standard), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs index d994ea814f..e87ede927b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs @@ -327,6 +327,7 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Seedance1p5Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs index 893e3786cb..296bc27e1b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs @@ -416,6 +416,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( apriori_job_token: &job_token, uuid_idempotency_token: &idempotency_str, maybe_external_third_party_id: order_id, + maybe_model_type: Some(CommonModelType::Seedance2p0), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_wallet_ledger_entry_token: Some(&deduction_result.ledger_entry_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs index fbc14602e2..8009632276 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs @@ -356,6 +356,7 @@ pub async fn sora_2_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Sora2), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs index 5654ff85b6..45ff731594 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs @@ -358,6 +358,7 @@ pub async fn sora_2_pro_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Sora2Pro), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs index 28bb7ea067..32fb5458f7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs @@ -28,9 +28,7 @@ use fal_client::requests::webhook::video::image::enqueue_veo_3p1_fast_image_to_v use fal_client::requests::webhook::video::text::enqueue_veo_3p1_fast_text_to_video_webhook::{enqueue_veo_3p1_fast_text_to_video_webhook, EnqueueVeo3p1FastTextToVideoArgs, EnqueueVeo3p1FastTextToVideoRequest, EnqueueVeo3p1FastTextToVideoAspectRatio, EnqueueVeo3p1FastTextToVideoDurationSeconds, EnqueueVeo3p1FastTextToVideoResolution}; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::media_files::get::batch_get_media_files_by_tokens::{batch_get_media_files_by_tokens, batch_get_media_files_by_tokens_with_connection}; @@ -426,6 +424,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Veo3p1Fast), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs index 627e69744f..d100b97cab 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs @@ -28,9 +28,7 @@ use fal_client::requests::webhook::video::image::enqueue_veo_3p1_image_to_video_ use fal_client::requests::webhook::video::text::enqueue_veo_3p1_text_to_video_webhook::{enqueue_veo_3p1_text_to_video_webhook, EnqueueVeo3p1TextToVideoArgs, EnqueueVeo3p1TextToVideoRequest, EnqueueVeo3p1TextToVideoAspectRatio, EnqueueVeo3p1TextToVideoDurationSeconds, EnqueueVeo3p1TextToVideoResolution}; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::FalCategory; -use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; use mysql_queries::queries::generic_inference::api_providers::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{insert_generic_inference_job_for_fal_queue_with_apriori_job_token, InsertGenericInferenceForFalWithAprioriJobTokenArgs}; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::media_files::get::batch_get_media_files_by_tokens::{batch_get_media_files_by_tokens, batch_get_media_files_by_tokens_with_connection}; @@ -426,6 +424,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler( uuid_idempotency_token: &request.uuid_idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::VideoGeneration, + maybe_model_type: Some(CommonModelType::Veo3p1), 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), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs index 214a200b69..c2e7df58d8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs @@ -261,6 +261,7 @@ pub async fn omni_gen_image_generate_handler( uuid_idempotency_token: &idempotency_token, maybe_external_third_party_id: &external_job_id, fal_category: FalCategory::ImageGeneration, + maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_inference_args: None, maybe_prompt_token: prompt_token.as_ref(), maybe_creator_user_token: Some(user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs index 3b6afb9f29..54c2e19a86 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs @@ -29,6 +29,7 @@ pub async fn insert_fal_job(args: InsertFalJobArgs<'_, '_>) -> Result) -> Result< apriori_job_token: shared.apriori_job_token, uuid_idempotency_token: shared.idempotency_token, external_request_id, + maybe_model_type: shared.maybe_model_type, maybe_prompt_token: shared.maybe_prompt_token, maybe_creator_user_token: Some(shared.user_token), maybe_avt_token: shared.maybe_avt_token, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_seedance2pro_jobs.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_seedance2pro_jobs.rs index 2bf2e32e3d..7ee091458f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_seedance2pro_jobs.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_seedance2pro_jobs.rs @@ -61,6 +61,7 @@ pub async fn insert_seedance2pro_jobs(args: InsertSeedance2proJobsArgs<'_, '_>) apriori_job_token: &job_token, uuid_idempotency_token: &idempotency_str, maybe_external_third_party_id: order_id, + maybe_model_type: shared.maybe_model_type, maybe_prompt_token: shared.maybe_prompt_token, maybe_wallet_ledger_entry_token, maybe_creator_user_token: Some(shared.user_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs index e452d37d34..40ee1e2e72 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs @@ -1,3 +1,4 @@ +use enums::common::generation::common_model_type::CommonModelType; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; @@ -11,6 +12,7 @@ pub struct SharedJobArgs<'a, 'tx> { pub maybe_avt_token: Option<&'a AnonymousVisitorTrackingToken>, pub maybe_prompt_token: Option<&'a PromptToken>, pub maybe_debug_log_event_token: Option<&'a DebugLogEventToken>, + pub maybe_model_type: Option, pub ip_address: &'a str, pub transaction: &'a mut sqlx::Transaction<'tx, sqlx::MySql>, } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs index 2b3db0e211..65dc0a7fae 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs @@ -355,6 +355,7 @@ pub async fn omni_gen_video_generate_handler( idempotency_token: &idempotency_token, user_token, maybe_avt_token: maybe_avt_token.as_ref(), + maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), ip_address: &ip_address, @@ -376,6 +377,7 @@ pub async fn omni_gen_video_generate_handler( idempotency_token: &idempotency_token, user_token, maybe_avt_token: maybe_avt_token.as_ref(), + maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), ip_address: &ip_address, @@ -403,6 +405,7 @@ pub async fn omni_gen_video_generate_handler( idempotency_token: &idempotency_token, user_token, maybe_avt_token: maybe_avt_token.as_ref(), + maybe_model_type: request.model.map(|v| v.to_common_model_type()), maybe_prompt_token: prompt_token.as_ref(), maybe_debug_log_event_token: Some(&debug_log_event_token), ip_address: &ip_address,