diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs b/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs index de8edc8347..27c8838aa5 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs @@ -1,6 +1,8 @@ use crate::core::artcraft_error::ArtcraftError; use anyhow::anyhow; use base64::DecodeError; +use enums::common::generation_provider::GenerationProvider; +use enums::common::model_type::ModelType; use errors::AnyhowError; use grok_client::error::grok_error::GrokError; use midjourney_client::error::midjourney_error::MidjourneyError; @@ -20,6 +22,12 @@ pub enum GenerateError { /// We pulled out Fal (for now) - it's impacting build speeds. We'll add it in the future. FalNoLongerSupported, + + /// Wrong provider for the model + BadProviderForModel { + provider: GenerationProvider, + model: ModelType, + }, /// There was a billing, credits, or payments issue. BillingIssue(BillingIssueReason), diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_flux_kontext_edit.rs similarity index 99% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_flux_kontext_edit.rs index b42ccd9070..57320206c1 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_flux_kontext_edit.rs @@ -29,7 +29,7 @@ use storyteller_client::endpoints::generate::image::generate_flux_pro_11_text_to use storyteller_client::endpoints::generate::image::generate_flux_pro_11_ultra_text_to_image::generate_flux_pro_11_ultra_text_to_image; use tauri::AppHandle; -pub async fn handle_flux_kontext_edit_artcraft( +pub async fn handle_artcraft_flux_kontext_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1_edit.rs similarity index 97% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1_edit.rs index d46ad693d6..6558570e81 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1_edit.rs @@ -1,6 +1,5 @@ use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize, EnqueueEditImageCommand}; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit::MAX_IMAGES; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; @@ -28,7 +27,9 @@ use storyteller_client::endpoints::generate::image::generate_flux_pro_11_text_to use storyteller_client::endpoints::generate::image::generate_flux_pro_11_ultra_text_to_image::generate_flux_pro_11_ultra_text_to_image; use tauri::AppHandle; -pub async fn handle_gpt_image_1_edit_artcraft( +const MAX_IMAGES: usize = 4; + +pub async fn handle_artcraft_gpt_image_1_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1p5_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1p5_edit.rs similarity index 97% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1p5_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1p5_edit.rs index 2c349d6dd0..c9f3becce2 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1p5_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_gpt_image_1p5_edit.rs @@ -1,6 +1,5 @@ use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageQuality, EditImageSize, EnqueueEditImageCommand}; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit::MAX_IMAGES; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; @@ -29,7 +28,9 @@ use storyteller_client::endpoints::generate::image::generate_flux_pro_11_ultra_t use storyteller_client::endpoints::generate::image::multi_function::gpt_image_1p5_multi_function_image_gen_image::gpt_image_1p5_multi_function_image_gen; use tauri::AppHandle; -pub async fn handle_gpt_image_1p5_edit_artcraft( +const MAX_IMAGES: usize = 4; + +pub async fn handle_artcraft_gpt_image_1p5_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_edit.rs similarity index 99% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_edit.rs index d4ba0f5fd0..045a20375a 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_edit.rs @@ -29,7 +29,7 @@ use tauri::AppHandle; pub(super) const MAX_IMAGES: usize = 10; -pub async fn handle_nano_banana_edit_artcraft( +pub async fn handle_artcraft_nano_banana_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_pro_edit.rs similarity index 99% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_pro_edit.rs index 5c6b518413..3af27c4cfb 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_nano_banana_pro_edit.rs @@ -32,7 +32,7 @@ use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::Imag pub(super) const MAX_IMAGES: usize = 10; -pub async fn handle_nano_banana_pro_edit_artcraft( +pub async fn handle_artcraft_nano_banana_pro_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs similarity index 99% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs index c6b4f11d43..eec53cf37a 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4_edit.rs @@ -21,7 +21,7 @@ use tauri::AppHandle; const MAX_IMAGES: usize = 4; -pub async fn handle_seedream_4_edit_artcraft( +pub async fn handle_artcraft_seedream_4_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4p5_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs similarity index 99% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4p5_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs index c075f1efcc..f0966bc49a 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/handle_seedream_4p5_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_artcraft_seedream_4p5_edit.rs @@ -21,7 +21,7 @@ use tauri::AppHandle; const MAX_IMAGES: usize = 4; -pub async fn handle_seedream_4p5_edit_artcraft( +pub async fn handle_artcraft_seedream_4p5_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_image_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_image_edit_artcraft.rs new file mode 100644 index 0000000000..51e07b0731 --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/handle_image_edit_artcraft.rs @@ -0,0 +1,36 @@ +use crate::core::commands::enqueue::generate_error::GenerateError; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_flux_kontext_edit::handle_artcraft_flux_kontext_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_gpt_image_1_edit::handle_artcraft_gpt_image_1_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_gpt_image_1p5_edit::handle_artcraft_gpt_image_1p5_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_nano_banana_edit::handle_artcraft_nano_banana_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_nano_banana_pro_edit::handle_artcraft_nano_banana_pro_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_seedream_4_edit::handle_artcraft_seedream_4_edit; +use crate::core::commands::enqueue::image_edit::artcraft::handle_artcraft_seedream_4p5_edit::handle_artcraft_seedream_4p5_edit; +use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EnqueueEditImageCommand, ImageEditModel}; +use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; +use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; +use crate::core::state::data_dir::app_data_root::AppDataRoot; +use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; +use tauri::AppHandle; + +pub async fn handle_image_edit_artcraft( + model: ImageEditModel, + request: &EnqueueEditImageCommand, + app: &AppHandle, + app_data_root: &AppDataRoot, + app_env_configs: &AppEnvConfigs, + storyteller_creds_manager: &StorytellerCredentialManager, +) -> Result { + + match model { + ImageEditModel::FluxProKontextMax => handle_artcraft_flux_kontext_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + ImageEditModel::Gemini25Flash | ImageEditModel::NanoBanana => { + handle_artcraft_nano_banana_edit( request, app, app_data_root, app_env_configs, storyteller_creds_manager).await + }, + ImageEditModel::NanoBananaPro => handle_artcraft_nano_banana_pro_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + ImageEditModel::GptImage1 => handle_artcraft_gpt_image_1_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + ImageEditModel::GptImage1p5 => handle_artcraft_gpt_image_1p5_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + ImageEditModel::Seedream4 => handle_artcraft_seedream_4_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + ImageEditModel::Seedream4p5 => handle_artcraft_seedream_4p5_edit(request, app, app_data_root, app_env_configs, storyteller_creds_manager).await, + } +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/mod.rs new file mode 100644 index 0000000000..cc0e60ba3f --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/artcraft/mod.rs @@ -0,0 +1,9 @@ +mod handle_artcraft_flux_kontext_edit; +mod handle_artcraft_gpt_image_1_edit; +mod handle_artcraft_gpt_image_1p5_edit; +mod handle_artcraft_nano_banana_edit; +mod handle_artcraft_nano_banana_pro_edit; +mod handle_artcraft_seedream_4_edit; +mod handle_artcraft_seedream_4p5_edit; + +pub (super) mod handle_image_edit_artcraft; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_edit_image_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_edit_image_command.rs index 8f8487d252..042210c385 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_edit_image_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_edit_image_command.rs @@ -1,12 +1,8 @@ use crate::core::commands::enqueue::common::notify_frontend_of_errors::notify_frontend_of_errors; use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; -use crate::core::commands::enqueue::image_edit::flux_kontext::handle_flux_kontext_edit::handle_flux_kontext_edit; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit::handle_gpt_image_1_edit; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1p5_artcraft::handle_gpt_image_1p5_edit_artcraft; -use crate::core::commands::enqueue::image_edit::nano_banana::handle_nano_banana_edit::handle_nano_banana_edit; -use crate::core::commands::enqueue::image_edit::nano_banana_pro::handle_nano_banana_pro_edit::handle_nano_banana_pro_edit; -use crate::core::commands::enqueue::image_edit::seedream::handle_seedream_4_artcraft::handle_seedream_4_edit_artcraft; -use crate::core::commands::enqueue::image_edit::seedream::handle_seedream_4p5_artcraft::handle_seedream_4p5_edit_artcraft; +use crate::core::commands::enqueue::image_edit::artcraft::handle_image_edit_artcraft::handle_image_edit_artcraft; +use crate::core::commands::enqueue::image_edit::image_edit_models::image_edit_model_to_model_type; +use crate::core::commands::enqueue::image_edit::sora::handle_image_edit_sora::handle_image_edit_sora; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::commands::response::shorthand::{Response, ResponseOrErrorType}; @@ -28,6 +24,7 @@ use crate::services::sora::state::sora_credential_manager::SoraCredentialManager use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use enums::common::generation_provider::GenerationProvider; +use enums::common::model_type::ModelType; use enums::tauri::tasks::task_status::TaskStatus; use enums::tauri::tasks::task_type::TaskType; use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; @@ -84,6 +81,10 @@ pub enum ImageEditModel { #[derive(Deserialize, Debug)] pub struct EnqueueEditImageCommand { + /// The provider to use (defaults to Artcraft/Storyteller). + /// Not all (provider, model) combinations are valid. + pub provider: Option, + /// The model to use. pub model: Option, @@ -268,84 +269,41 @@ pub async fn handle_request( sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { - let mut success_event= match request.model { + + let model = match request.model { + Some(model) => model, None => { return Err(GenerateError::no_model_specified()) } - Some(ImageEditModel::FluxProKontextMax) => { - handle_flux_kontext_edit( + }; + + let mut success_event = match request.provider { + None | Some(GenerationProvider::Artcraft) => { + handle_image_edit_artcraft( + model, request, app, app_data_root, app_env_configs, - provider_priority_store, storyteller_creds_manager, + ).await? + } + Some(GenerationProvider::Sora) => { + handle_image_edit_sora( + model, + request, + app, + app_data_root, + app_env_configs, sora_creds_manager, sora_task_queue, ).await? } - Some(ImageEditModel::Gemini25Flash | ImageEditModel::NanoBanana) => { - handle_nano_banana_edit( - request, - app, - app_data_root, - app_env_configs, - provider_priority_store, - storyteller_creds_manager, - sora_creds_manager, - sora_task_queue, - ).await? - } - Some(ImageEditModel::NanoBananaPro) => { - handle_nano_banana_pro_edit( - request, - app, - app_data_root, - app_env_configs, - provider_priority_store, - storyteller_creds_manager, - sora_creds_manager, - sora_task_queue, - ).await? - } - Some(ImageEditModel::GptImage1) => { - handle_gpt_image_1_edit( - request, - app, - app_data_root, - app_env_configs, - provider_priority_store, - storyteller_creds_manager, - sora_creds_manager, - sora_task_queue, - ).await? - } - Some(ImageEditModel::GptImage1p5) => { - handle_gpt_image_1p5_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager, - ).await? - } - Some(ImageEditModel::Seedream4) => { - handle_seedream_4_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager, - ).await? - } - Some(ImageEditModel::Seedream4p5) => { - handle_seedream_4p5_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager, - ).await? + _ => { + return Err(GenerateError::BadProviderForModel { + provider: request.provider.unwrap_or(GenerationProvider::Artcraft), + model: image_edit_model_to_model_type(model), + }) } }; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit.rs deleted file mode 100644 index 86cf1ede48..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::EnqueueEditImageCommand; -use crate::core::commands::enqueue::image_edit::flux_kontext::handle_flux_kontext_edit_artcraft::handle_flux_kontext_edit_artcraft; -use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; -use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; -use crate::services::sora::state::sora_task_queue::SoraTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use log::info; -use tauri::AppHandle; - -pub async fn handle_flux_kontext_edit( - request: &EnqueueEditImageCommand, - app: &AppHandle, - app_data_root: &AppDataRoot, - app_env_configs: &AppEnvConfigs, - provider_priority_store: &ProviderPriorityStore, - storyteller_creds_manager: &StorytellerCredentialManager, - sora_creds_manager: &SoraCredentialManager, - sora_task_queue: &SoraTaskQueue, -) -> Result { - - let priority = provider_priority_store.get_priority()?; - - // TODO: Check if providers are available before proceeding. - - info!("Providers by priority: {:?}", priority); - - for provider in priority.iter() { - match provider { - Provider::Fal => { - // Fallthrough (TODO) - } - Provider::Sora => { - // Fallthrough - } - Provider::Artcraft => { - info!("Dispatching gpt-image-1 (edit) via Artcraft..."); - return handle_flux_kontext_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager - ).await; - } - } - } - - Err(GenerateError::NoProviderAvailable) -} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/mod.rs deleted file mode 100644 index 54e79866ca..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub (super) mod handle_flux_kontext_edit; -mod handle_flux_kontext_edit_artcraft; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit.rs deleted file mode 100644 index faf1d556be..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit.rs +++ /dev/null @@ -1,67 +0,0 @@ -use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::EnqueueEditImageCommand; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit_artcraft::handle_gpt_image_1_edit_artcraft; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit_sora::handle_gpt_image_1_edit_sora; -use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; -use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; -use crate::services::sora::state::sora_task_queue::SoraTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use log::info; -use tauri::AppHandle; - -pub(super) const MAX_IMAGES: usize = 10; - -pub async fn handle_gpt_image_1_edit( - request: &EnqueueEditImageCommand, - app: &AppHandle, - app_data_root: &AppDataRoot, - app_env_configs: &AppEnvConfigs, - provider_priority_store: &ProviderPriorityStore, - storyteller_creds_manager: &StorytellerCredentialManager, - sora_creds_manager: &SoraCredentialManager, - sora_task_queue: &SoraTaskQueue, -) -> Result { - - let priority = provider_priority_store.get_priority()?; - - // TODO: Check if providers are available before proceeding. - - info!("Providers by priority: {:?}", priority); - - for provider in priority.iter() { - match provider { - Provider::Fal => { - // Fallthrough - // If in the future we support OpenAI API keys, it's worth considering whether we - // send those requests ourselves, or if we use FAL as an intermediary. FAL makes - // the API nicer to deal with, but the user needs an additional key. - } - Provider::Artcraft => { - info!("Dispatching gpt-image-1 (edit) via Artcraft..."); - return handle_gpt_image_1_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager - ).await; - } - Provider::Sora => { - info!("Dispatching gpt-image-1 (edit) via Sora..."); - return handle_gpt_image_1_edit_sora( - request, - app, - app_data_root, - app_env_configs, - sora_creds_manager, - sora_task_queue, - ).await; - } - } - } - - Err(GenerateError::NoProviderAvailable) -} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/mod.rs deleted file mode 100644 index 68ebceeb1e..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub (super) mod handle_gpt_image_1_edit; -pub (super) mod handle_gpt_image_1_edit_artcraft; -pub (super) mod handle_gpt_image_1_edit_sora; -pub (super) mod handle_gpt_image_1p5_artcraft; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/image_edit_models.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/image_edit_models.rs new file mode 100644 index 0000000000..dba05ba14b --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/image_edit_models.rs @@ -0,0 +1,15 @@ +use enums::common::model_type::ModelType; +use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::ImageEditModel; + +pub fn image_edit_model_to_model_type(model: ImageEditModel) -> ModelType { + match model { + ImageEditModel::FluxProKontextMax => ModelType::FluxProKontextMax, + ImageEditModel::Gemini25Flash => ModelType::NanoBanana, + ImageEditModel::NanoBanana => ModelType::NanoBanana, + ImageEditModel::NanoBananaPro => ModelType::NanoBananaPro, + ImageEditModel::GptImage1 => ModelType::GptImage1, + ImageEditModel::GptImage1p5 => ModelType::GptImage1p5, + ImageEditModel::Seedream4 => ModelType::Seedream4, + ImageEditModel::Seedream4p5 => ModelType::Seedream4p5, + } +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/mod.rs index c2cd55653c..146d166383 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/mod.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/mod.rs @@ -1,6 +1,5 @@ +pub (super) mod artcraft; +pub (super) mod sora; pub mod enqueue_edit_image_command; -pub mod gpt_image; -mod flux_kontext; -mod nano_banana; -mod nano_banana_pro; -mod seedream; +pub mod image_edit_models; + diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit.rs deleted file mode 100644 index 1707344a32..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/handle_nano_banana_edit.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::EnqueueEditImageCommand; -use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; -use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; -use crate::services::sora::state::sora_task_queue::SoraTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use log::info; -use tauri::AppHandle; -use crate::core::commands::enqueue::image_edit::nano_banana::handle_nano_banana_edit_artcraft::handle_nano_banana_edit_artcraft; - -pub async fn handle_nano_banana_edit( - request: &EnqueueEditImageCommand, - app: &AppHandle, - app_data_root: &AppDataRoot, - app_env_configs: &AppEnvConfigs, - provider_priority_store: &ProviderPriorityStore, - storyteller_creds_manager: &StorytellerCredentialManager, - sora_creds_manager: &SoraCredentialManager, - sora_task_queue: &SoraTaskQueue, -) -> Result { - - let priority = provider_priority_store.get_priority()?; - - // TODO: Check if providers are available before proceeding. - - info!("Providers by priority: {:?}", priority); - - for provider in priority.iter() { - match provider { - Provider::Fal => { - // Fallthrough (TODO) - } - Provider::Sora => { - // Fallthrough - } - Provider::Artcraft => { - info!("Dispatching Nano Banana (edit) via Artcraft..."); - return handle_nano_banana_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager - ).await; - } - } - } - - Err(GenerateError::NoProviderAvailable) -} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/mod.rs deleted file mode 100644 index 33cfb238f3..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub (super) mod handle_nano_banana_edit; -pub (super) mod handle_nano_banana_edit_artcraft; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit.rs deleted file mode 100644 index 32e0736d2f..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/handle_nano_banana_pro_edit.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::EnqueueEditImageCommand; -use crate::core::commands::enqueue::image_edit::nano_banana_pro::handle_nano_banana_pro_edit_artcraft::handle_nano_banana_pro_edit_artcraft; -use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; -use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; -use crate::services::sora::state::sora_task_queue::SoraTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use log::info; -use tauri::AppHandle; - -pub async fn handle_nano_banana_pro_edit( - request: &EnqueueEditImageCommand, - app: &AppHandle, - app_data_root: &AppDataRoot, - app_env_configs: &AppEnvConfigs, - provider_priority_store: &ProviderPriorityStore, - storyteller_creds_manager: &StorytellerCredentialManager, - sora_creds_manager: &SoraCredentialManager, - sora_task_queue: &SoraTaskQueue, -) -> Result { - - let priority = provider_priority_store.get_priority()?; - - // TODO: Check if providers are available before proceeding. - - info!("Providers by priority: {:?}", priority); - - for provider in priority.iter() { - match provider { - Provider::Fal => { - // Fallthrough (TODO) - } - Provider::Sora => { - // Fallthrough - } - Provider::Artcraft => { - info!("Dispatching Nano Banana Pro (edit) via Artcraft..."); - return handle_nano_banana_pro_edit_artcraft( - request, - app, - app_data_root, - app_env_configs, - storyteller_creds_manager - ).await; - } - } - } - - Err(GenerateError::NoProviderAvailable) -} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/mod.rs deleted file mode 100644 index 359d44ae7f..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/nano_banana_pro/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub (super) mod handle_nano_banana_pro_edit; -pub (super) mod handle_nano_banana_pro_edit_artcraft; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/mod.rs deleted file mode 100644 index 4cccb82f6e..0000000000 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/seedream/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub (super) mod handle_seedream_4p5_artcraft; -pub (super) mod handle_seedream_4_artcraft; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_image_edit_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_image_edit_sora.rs new file mode 100644 index 0000000000..5e15ec79ec --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_image_edit_sora.rs @@ -0,0 +1,40 @@ +use crate::core::commands::enqueue::generate_error::GenerateError; +use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EnqueueEditImageCommand, ImageEditModel}; +use crate::core::commands::enqueue::image_edit::image_edit_models::image_edit_model_to_model_type; +use crate::core::commands::enqueue::image_edit::sora::handle_sora_gpt_image_1_edit::handle_sora_gpt_image_1_edit; +use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; +use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; +use crate::core::state::data_dir::app_data_root::AppDataRoot; +use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; +use crate::services::sora::state::sora_task_queue::SoraTaskQueue; +use enums::common::generation_provider::GenerationProvider; +use tauri::AppHandle; + +pub async fn handle_image_edit_sora( + model: ImageEditModel, + request: &EnqueueEditImageCommand, + app: &AppHandle, + app_data_root: &AppDataRoot, + app_env_configs: &AppEnvConfigs, + sora_creds_manager: &SoraCredentialManager, + sora_task_queue: &SoraTaskQueue, +) -> Result { + match model { + ImageEditModel::GptImage1 => { + handle_sora_gpt_image_1_edit( + request, + app, + app_data_root, + app_env_configs, + sora_creds_manager, + sora_task_queue, + ).await + }, + _ => { + Err(GenerateError::BadProviderForModel { + provider: GenerationProvider::Sora, + model: image_edit_model_to_model_type(model), + }) + } + } +} diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_sora_gpt_image_1_edit.rs similarity index 98% rename from crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_sora.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_sora_gpt_image_1_edit.rs index aece7365bf..1d72abda44 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image/handle_gpt_image_1_edit_sora.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/handle_sora_gpt_image_1_edit.rs @@ -1,6 +1,5 @@ use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; use crate::core::commands::enqueue::image_edit::enqueue_edit_image_command::{EditImageSize, EnqueueEditImageCommand, EnqueueEditImageErrorType}; -use crate::core::commands::enqueue::image_edit::gpt_image::handle_gpt_image_1_edit::MAX_IMAGES; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; @@ -35,13 +34,14 @@ use std::time::Duration; use storyteller_client::endpoints::media_files::get_media_file::get_media_file; use tauri::AppHandle; +const MAX_IMAGES: usize = 4; const SORA_IMAGE_UPLOAD_TIMEOUT: Duration = Duration::from_millis(1000 * 30); // 30 seconds const SORA_IMAGE_REMIX_TIMEOUT: Duration = Duration::from_millis(1000 * 30); // 30 seconds const DEFAULT_ASPECT_RATIO : EditImageSize = EditImageSize::Square; -pub async fn handle_gpt_image_1_edit_sora( +pub async fn handle_sora_gpt_image_1_edit( request: &EnqueueEditImageCommand, app: &AppHandle, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/mod.rs new file mode 100644 index 0000000000..f7b715be9d --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/sora/mod.rs @@ -0,0 +1,2 @@ +mod handle_sora_gpt_image_1_edit; +pub (super) mod handle_image_edit_sora; \ No newline at end of file