diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/common/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/common/mod.rs index d81449e79c..feab773fad 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/common/mod.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/common/mod.rs @@ -1,3 +1,3 @@ -mod maybe_notify_frontend_of_billing_errors; -mod maybe_notify_frontend_of_grok_errors; +pub mod maybe_notify_frontend_of_billing_errors; +pub mod maybe_notify_frontend_of_grok_errors; pub mod notify_frontend_of_errors; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/generate/generate_video/artcraft/handle_artcraft_video.rs b/crates/desktop/artcraft/src/core/commands/generate/generate_video/artcraft/handle_artcraft_video.rs index 855a4a08c9..f6688483c9 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/generate_video/artcraft/handle_artcraft_video.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/generate_video/artcraft/handle_artcraft_video.rs @@ -1,15 +1,12 @@ use crate::core::commands::enqueue::generate_error::GenerateError; +use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::generate::generate_video::artcraft::get_storyteller_creds_or_error::get_storyteller_creds_or_error; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_kling_1p6_pro::handle_artcraft_kling_1p6_pro; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_kling_2p1_master::handle_artcraft_kling_2p1_master; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_kling_2p1_pro::handle_artcraft_kling_2p1_pro; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_kling_2p5_turbo_pro::handle_artcraft_kling_2p5_turbo_pro; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_kling_2p6_pro::handle_artcraft_kling_2p6_pro; -use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_video_via_router::handle_artcraft_video_via_router; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_seedance_1_lite::handle_artcraft_seedance_1_lite; -use crate::core::events::generation_events::common::GenerationModel; -use artcraft_router::api::common_video_model::CommonVideoModel; -use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_seedance_2p0::handle_artcraft_seedance_2p0; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_sora2::handle_artcraft_sora2; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_sora2_pro::handle_artcraft_sora2_pro; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_veo2::handle_artcraft_veo2; @@ -17,11 +14,13 @@ use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_v use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_veo3_fast::handle_artcraft_veo3_fast; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_veo3p1::handle_artcraft_veo3p1; use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_veo3p1_fast::handle_artcraft_veo3p1_fast; +use crate::core::commands::generate::generate_video::artcraft::handle_artcraft_video_via_router::handle_artcraft_video_via_router; use crate::core::commands::generate::generate_video::request::{TauriGenerateVideoRequest, TauriVideoModel}; -use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; +use crate::core::events::generation_events::common::GenerationModel; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use anyhow::anyhow; +use artcraft_router::api::common_video_model::CommonVideoModel; use tauri::AppHandle; pub async fn handle_video_artcraft( @@ -38,12 +37,12 @@ pub async fn handle_video_artcraft( Err(GenerateError::no_model_specified()) }, // Handled via router - Some(TauriVideoModel::Kling3p0Pro) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::Kling3p0Pro, GenerationModel::Kling3p0Pro).await, - Some(TauriVideoModel::Kling3p0Standard) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::Kling3p0Standard, GenerationModel::Kling3p0Standard).await, - Some(TauriVideoModel::Seedance1p5Pro) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::Seedance1p5Pro, GenerationModel::Seedance1p5Pro).await, - Some(TauriVideoModel::Seedance2p0) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::Seedance2p0, GenerationModel::Seedance2p0).await, - Some(TauriVideoModel::Seedance2p0Fast) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::Seedance2p0Fast, GenerationModel::Seedance2p0Fast).await, - Some(TauriVideoModel::HappyHorse1p0) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonTauriVideoModel::HappyHorse1p0, GenerationModel::HappyHorse1p0).await, + Some(TauriVideoModel::Kling3p0Pro) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::Kling3p0Pro, GenerationModel::Kling3p0Pro).await, + Some(TauriVideoModel::Kling3p0Standard) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::Kling3p0Standard, GenerationModel::Kling3p0Standard).await, + Some(TauriVideoModel::Seedance1p5Pro) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::Seedance1p5Pro, GenerationModel::Seedance1p5Pro).await, + Some(TauriVideoModel::Seedance2p0) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::Seedance2p0, GenerationModel::Seedance2p0).await, + Some(TauriVideoModel::Seedance2p0Fast) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::Seedance2p0Fast, GenerationModel::Seedance2p0Fast).await, + Some(TauriVideoModel::HappyHorse1p0) => handle_artcraft_video_via_router(request, app_env_configs, &creds, CommonVideoModel::HappyHorse1p0, GenerationModel::HappyHorse1p0).await, // Legacy endpoints Some(TauriVideoModel::Kling16Pro) => handle_artcraft_kling_1p6_pro(request, app_env_configs, &creds).await, Some(TauriVideoModel::Kling21Pro) => handle_artcraft_kling_2p1_pro(request, app_env_configs, &creds).await, diff --git a/crates/desktop/artcraft/src/core/commands/generate/generate_video/generate_video_command.rs b/crates/desktop/artcraft/src/core/commands/generate/generate_video/generate_video_command.rs index b3dd4e954b..882d07a15d 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/generate_video/generate_video_command.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/generate_video/generate_video_command.rs @@ -29,7 +29,7 @@ use tauri::{AppHandle, State}; #[tauri::command] pub async fn generate_video_command( - request: TauriGenerateVideoRequest, + mut request: TauriGenerateVideoRequest, app: AppHandle, app_env_configs: State<'_, AppEnvConfigs>, app_data_root: State<'_, AppDataRoot>, @@ -44,6 +44,18 @@ pub async fn generate_video_command( info!("generate_video_command called, request: {:?}", request); + if request.image_media_token.is_none() + && request.start_frame_image_media_token.is_some() { + // NB: This is to fix the legacy handlers + request.image_media_token = request.start_frame_image_media_token.clone(); + } + + if request.image_media_token.is_some() + && request.start_frame_image_media_token.is_none() { + // NB: This is to fix the modern handlers + request.start_frame_image_media_token = request.image_media_token.clone(); + } + let result = handle_request( request, &app, diff --git a/crates/desktop/artcraft/src/core/commands/generate/generate_video/request.rs b/crates/desktop/artcraft/src/core/commands/generate/generate_video/request.rs index eb3ae148e5..1e2412f8cc 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/generate_video/request.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/generate_video/request.rs @@ -74,37 +74,51 @@ pub enum TauriVideoModel { Veo3p1Fast, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone)] pub struct TauriGenerateVideoRequest { pub provider: Option, pub model: Option, + + pub prompt: Option, + pub negative_prompt: Option, + + #[deprecated(note = "Use start_frame_image_media_token instead")] pub image_media_token: Option, + + pub start_frame_image_media_token: Option, pub end_frame_image_media_token: Option, + pub reference_image_media_tokens: Option>, pub reference_video_media_tokens: Option>, pub reference_audio_media_tokens: Option>, pub reference_character_tokens: Option>, - pub prompt: Option, - pub generate_audio: Option, + pub aspect_ratio: Option, pub resolution: Option, + pub duration_seconds: Option, + pub generate_audio: Option, pub video_batch_count: Option, + + #[deprecated(note = "Use start_frame_image_media_token instead")] pub sora_orientation: Option, + + #[deprecated(note = "Use start_frame_image_media_token instead")] pub grok_aspect_ratio: Option, + pub frontend_caller: Option, pub frontend_subscriber_id: Option, pub frontend_subscriber_payload: Option, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone, Copy)] #[serde(rename_all = "snake_case")] pub enum SoraOrientation { Portrait, Landscape, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone, Copy)] #[serde(rename_all = "snake_case")] pub enum GrokAspectRatio { Portrait,