write models to jobs (#1551)

This commit is contained in:
Brandon Thomas authored and GitHub committed 2026-05-22 19:08:34 -04:00
1 parent 6b5dcc8d35
commit 05a84194ac
63 files changed
+848 -43

No files matched your search

@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<CommonModelType>,
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,
@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<CommonModelType>,
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.
@@ -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<CommonModelType>,
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.
@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
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,
@@ -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<Self, String> {
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());
}
}
}
@@ -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,
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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,
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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
@@ -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
@@ -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
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -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),
@@ -29,6 +29,7 @@ pub async fn insert_fal_job(args: InsertFalJobArgs<'_, '_>) -> Result<InferenceJ
uuid_idempotency_token: shared.idempotency_token,
maybe_external_third_party_id: external_job_id,
fal_category: FalCategory::VideoGeneration,
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,
@@ -25,6 +25,7 @@ pub async fn insert_gmicloud_job(args: InsertGmiCloudJobArgs<'_, '_>) -> 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,
@@ -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),
@@ -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<CommonModelType>,
pub ip_address: &'a str,
pub transaction: &'a mut sqlx::Transaction<'tx, sqlx::MySql>,
}
@@ -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,