diff --git a/Cargo.lock b/Cargo.lock index 35c868cd2d..249c9b1f47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -660,7 +660,6 @@ dependencies = [ "discord-rich-presence", "enums", "errors", - "fal_client", "filesys", "futures 0.3.31", "idempotency", diff --git a/crates/desktop/artcraft/Cargo.toml b/crates/desktop/artcraft/Cargo.toml index 57385c8acb..37a51880ac 100644 --- a/crates/desktop/artcraft/Cargo.toml +++ b/crates/desktop/artcraft/Cargo.toml @@ -31,7 +31,6 @@ build_metadata.workspace = true cookie_store.workspace = true enums.workspace = true errors.workspace = true -fal_client.workspace = true filesys.workspace = true idempotency.workspace = true images.workspace = true 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 d9fc4d47da..000f236273 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/generate_error.rs @@ -1,10 +1,10 @@ use crate::core::artcraft_error::ArtcraftError; use base64::DecodeError; use errors::AnyhowError; -use fal_client::error::fal_error_plus::FalErrorPlus; use midjourney_client::error::midjourney_error::MidjourneyError; use openai_sora_client::error::sora_error::SoraError; use storyteller_client::error::storyteller_error::StorytellerError; +//use fal_client::error::fal_error_plus::FalErrorPlus; #[derive(Debug)] pub enum GenerateError { @@ -14,6 +14,9 @@ pub enum GenerateError { /// We couldn't find a provider to dispatch the request to. NoProviderAvailable, + + /// We pulled out Fal (for now) - it's impacting build speeds. We'll add it in the future. + FalNoLongerSupported, /// There was a billing, credits, or payments issue. BillingIssue(BillingIssueReason), @@ -73,7 +76,7 @@ pub enum BillingProvider { #[derive(Debug)] pub enum ProviderFailureReason { - Fal(FalErrorPlus), + //Fal(FalErrorPlus), MidjourneyError(MidjourneyError), /// NB: The midjourney client doesn't categorize all errors, so we have to do so on our end. MidjourneyJobEnqueueFailed, @@ -141,11 +144,11 @@ impl From for GenerateError { } } -impl From for GenerateError { - fn from(value: FalErrorPlus) -> Self { - Self::ProviderFailure(ProviderFailureReason::Fal(value)) - } -} +//impl From for GenerateError { +// fn from(value: FalErrorPlus) -> Self { +// Self::ProviderFailure(ProviderFailureReason::Fal(value)) +// } +//} impl From for GenerateError { fn from(value: MidjourneyError) -> Self { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs index 657ecc2bbd..1614289bfb 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs @@ -7,6 +7,7 @@ use crate::core::commands::response::failure_response_wrapper::{CommandErrorResp use crate::core::commands::response::shorthand::{Response, ResponseOrErrorType}; use crate::core::commands::response::success_response_wrapper::SerializeMarker; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; +use crate::core::events::functional_events::credits_balance_changed_event::CreditsBalanceChangedEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; @@ -18,8 +19,6 @@ use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; use crate::core::state::task_database::TaskDatabase; use crate::core::utils::get_url_file_extension::get_url_file_extension; use crate::core::utils::simple_http_download::simple_http_download; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -35,12 +34,11 @@ use openai_sora_client::requests::image_gen::common::{ImageSize, NumImages}; use serde_derive::{Deserialize, Serialize}; use sqlite_tasks::queries::create_task::{create_task, CreateTaskArgs}; use std::time::Duration; -use storyteller_client::error::storyteller_error::StorytellerError; use storyteller_client::endpoints::media_files::get_media_file::get_media_file; +use storyteller_client::error::storyteller_error::StorytellerError; use storyteller_client::utils::api_host::ApiHost; use tauri::{AppHandle, Manager, State}; use tokens::tokens::media_files::MediaFileToken; -use crate::core::events::functional_events::credits_balance_changed_event::CreditsBalanceChangedEvent; #[derive(Deserialize, Debug)] pub struct EnqueueImageBgRemovalCommand { @@ -103,8 +101,6 @@ pub async fn enqueue_image_bg_removal_command( provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_creds_manager: State<'_, FalCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, ) -> ResponseOrErrorType { info!("enqueue_image_bg_removal_command called"); @@ -117,8 +113,6 @@ pub async fn enqueue_image_bg_removal_command( &provider_priority_store, &task_database, &storyteller_creds_manager, - &fal_creds_manager, - &fal_task_queue, ).await; match result { @@ -167,8 +161,6 @@ pub async fn handle_request( provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { // TODO(bt,2025-07-07): Other model/provider routing... @@ -180,8 +172,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, ).await?; let result = success_event diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal.rs index 13b0a44811..8d91ef500c 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal.rs @@ -9,8 +9,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -24,8 +22,6 @@ pub async fn handle_generic_bg_removal( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { let priority = provider_priority_store.get_priority()?; @@ -57,8 +53,6 @@ pub async fn handle_generic_bg_removal( app, app_data_root, app_env_configs, - fal_creds_manager, - fal_task_queue, ).await; } } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs index abdcd3fd08..844bc9c286 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs @@ -9,8 +9,6 @@ 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::ProviderPriorityStore; use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -23,7 +21,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use artcraft_api_defs::generate::image::remove_image_background::RemoveImageBackgroundRequest; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::credentials::storyteller_credential_set::StorytellerCredentialSet; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_fal.rs index dafb4df6ec..8f6aa60e3f 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_fal.rs @@ -3,8 +3,6 @@ use crate::core::commands::enqueue::image_bg_removal::enqueue_image_bg_removal_c 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use tauri::AppHandle; pub async fn handle_generic_bg_removal_fal( @@ -12,8 +10,6 @@ pub async fn handle_generic_bg_removal_fal( app: &AppHandle, app_data_root: &AppDataRoot, app_env_configs: &AppEnvConfigs, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { Err(GenerateError::NotYetImplemented("TODO: Implement fal background removal handling".to_string())) } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs index d00e72e1a8..ca1c67fcfc 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs @@ -20,8 +20,6 @@ use crate::core::state::provider_priority::ProviderPriorityStore; use crate::core::state::task_database::TaskDatabase; use crate::core::utils::get_url_file_extension::get_url_file_extension; use crate::core::utils::simple_http_download::simple_http_download; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -169,8 +167,6 @@ pub async fn enqueue_contextual_edit_image_command( provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_creds_manager: State<'_, FalCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, sora_creds_manager: State<'_, SoraCredentialManager>, sora_task_queue: State<'_, SoraTaskQueue>, ) -> ResponseOrErrorType { @@ -186,8 +182,6 @@ pub async fn enqueue_contextual_edit_image_command( &provider_priority_store, &task_database, &storyteller_creds_manager, - &fal_creds_manager, - &fal_task_queue, &sora_creds_manager, &sora_task_queue, ).await; @@ -238,8 +232,6 @@ pub async fn handle_request( provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { @@ -255,8 +247,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? @@ -269,8 +259,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? @@ -283,8 +271,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? 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 index c3d581b386..0ac31bc151 100644 --- 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 @@ -7,8 +7,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -22,8 +20,6 @@ pub async fn handle_flux_kontext_edit( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { 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/flux_kontext/handle_flux_kontext_edit_artcraft.rs index bfb92b1375..70a4fe3c52 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/flux_kontext/handle_flux_kontext_edit_artcraft.rs @@ -7,8 +7,6 @@ use crate::core::events::generation_events::generation_enqueue_failure_event::Ge 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::ProviderPriorityStore; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -21,8 +19,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_text_to_image::Gene use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image::GenerateFluxPro11UltraTextToImageRequest; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use fal_client::requests::webhook::image::edit::enqueue_flux_pro_kontext_max_edit_webhook::FluxProKontextMaxNumImages; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::endpoints::generate::image::edit::flux_pro_kontext_max_edit_image::flux_pro_kontext_max_edit_image; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit.rs index 1b7cf58be4..4b585f5db8 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit.rs @@ -7,8 +7,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -22,8 +20,6 @@ pub async fn handle_gemini_25_flash_edit( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit_artcraft.rs index 4c5f60d01a..6ab9d96be4 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gemini_25_flash/handle_gemini_25_flash_edit_artcraft.rs @@ -7,8 +7,6 @@ use crate::core::events::generation_events::generation_enqueue_failure_event::Ge 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::ProviderPriorityStore; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit.rs index 83b4cd09a3..4ea8bb4021 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit.rs @@ -6,8 +6,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -23,8 +21,6 @@ pub async fn handle_gpt_image_1_edit( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs index da6418234f..58ad147293 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs @@ -8,8 +8,6 @@ use crate::core::events::generation_events::generation_enqueue_failure_event::Ge 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::ProviderPriorityStore; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -21,8 +19,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_text_to_image::Gene use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image::GenerateFluxPro11UltraTextToImageRequest; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use fal_client::requests::webhook::image::edit::enqueue_gpt_image_1_edit_image_webhook::GptEditImageQuality; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::endpoints::generate::image::edit::gpt_image_1_edit_image::gpt_image_1_edit_image; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs index f6581ee35b..5f37ca52d8 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs @@ -14,8 +14,6 @@ use crate::core::state::data_dir::trait_data_subdir::DataSubdir; use crate::core::state::provider_priority::ProviderPriorityStore; use crate::core::utils::get_url_file_extension::get_url_file_extension; use crate::core::utils::simple_http_download::simple_http_download; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -27,7 +25,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; use errors::AnyhowResult; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info, warn}; use openai_sora_client::recipes::image_remix_with_session_auto_renew::{image_remix_with_session_auto_renew, ImageRemixAutoRenewRequest}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs index 1b265a9947..bf0ea1b385 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs @@ -22,8 +22,6 @@ use crate::core::state::provider_priority::ProviderPriorityStore; use crate::core::state::task_database::TaskDatabase; use crate::core::utils::get_url_file_extension::get_url_file_extension; use crate::core::utils::simple_http_download::simple_http_download; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -40,8 +38,8 @@ use openai_sora_client::requests::image_gen::common::{ImageSize, NumImages}; use serde_derive::{Deserialize, Serialize}; use sqlite_tasks::queries::create_task::{create_task, CreateTaskArgs}; use std::time::Duration; -use storyteller_client::error::storyteller_error::StorytellerError; use storyteller_client::endpoints::media_files::get_media_file::get_media_file; +use storyteller_client::error::storyteller_error::StorytellerError; use storyteller_client::utils::api_host::ApiHost; use tauri::{AppHandle, Manager, State}; use tokens::tokens::media_files::MediaFileToken; @@ -158,8 +156,6 @@ pub async fn enqueue_image_inpaint_command( provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_creds_manager: State<'_, FalCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, sora_creds_manager: State<'_, SoraCredentialManager>, sora_task_queue: State<'_, SoraTaskQueue>, ) -> ResponseOrErrorType { @@ -175,8 +171,6 @@ pub async fn enqueue_image_inpaint_command( &provider_priority_store, &task_database, &storyteller_creds_manager, - &fal_creds_manager, - &fal_task_queue, &sora_creds_manager, &sora_task_queue, ).await; @@ -227,8 +221,6 @@ pub async fn handle_request( provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { @@ -244,8 +236,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? @@ -258,8 +248,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? @@ -273,8 +261,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? @@ -288,8 +274,6 @@ pub async fn handle_request( app_env_configs, provider_priority_store, storyteller_creds_manager, - fal_creds_manager, - fal_task_queue, sora_creds_manager, sora_task_queue, ).await? diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint.rs index 3cf1c38858..01914d8117 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint.rs @@ -8,8 +8,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -23,8 +21,6 @@ pub async fn handle_flux_dev_juggernaut_inpaint( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint_artcraft.rs index 2f94006ccf..2409772933 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_dev_juggernaut_inpaint/handle_flux_dev_juggernaut_inpaint_artcraft.rs @@ -10,8 +10,6 @@ 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::ProviderPriorityStore; use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -24,7 +22,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use artcraft_api_defs::generate::image::inpaint::flux_dev_juggernaut_inpaint_image::{FluxDevJuggernautInpaintImageNumImages, FluxDevJuggernautInpaintImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use images::encoding::image_bytes_to_png_bytes::image_bytes_to_png_bytes; use images::encoding::image_bytes_to_png_bytes_with_dimensions::image_bytes_to_png_bytes_with_dimensions; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint.rs index 48e402dd11..b8a2b4511b 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint.rs @@ -8,8 +8,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -23,8 +21,6 @@ pub async fn handle_flux_pro_1_inpaint( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs index bb21a52842..fa8b3eea78 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs @@ -10,8 +10,6 @@ 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::ProviderPriorityStore; use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -24,7 +22,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use artcraft_api_defs::generate::image::inpaint::flux_pro_1_inpaint_image::{FluxPro1InpaintImageNumImages, FluxPro1InpaintImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use images::encoding::image_bytes_to_png_bytes::image_bytes_to_png_bytes; use images::encoding::image_bytes_to_png_bytes_with_dimensions::image_bytes_to_png_bytes_with_dimensions; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint.rs index ff61f50504..b86ee5f396 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint.rs @@ -6,8 +6,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -21,8 +19,6 @@ pub async fn handle_flux_pro_kontext_inpaint( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint_artcraft.rs index 545c76385f..80980b646a 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_kontext_inpaint/handle_flux_pro_kontext_inpaint_artcraft.rs @@ -10,8 +10,6 @@ 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::ProviderPriorityStore; use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -25,7 +23,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use artcraft_api_defs::generate::image::inpaint::flux_pro_1_inpaint_image::{FluxPro1InpaintImageNumImages, FluxPro1InpaintImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use images::encoding::image_bytes_to_png_bytes::image_bytes_to_png_bytes; use images::encoding::image_bytes_to_png_bytes_with_dimensions::image_bytes_to_png_bytes_with_dimensions; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint.rs index 7e64121746..207bbadb85 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint.rs @@ -7,8 +7,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -22,8 +20,6 @@ pub async fn handle_gemini_25_flash_inpaint( app_env_configs: &AppEnvConfigs, provider_priority_store: &ProviderPriorityStore, storyteller_creds_manager: &StorytellerCredentialManager, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint_artcraft.rs index a5d499f057..8c884cfc8e 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/gemini_25_flash_inpaint/handle_gemini_25_flash_inpaint_artcraft.rs @@ -10,8 +10,6 @@ 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::ProviderPriorityStore; use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; @@ -26,7 +24,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image use artcraft_api_defs::generate::image::inpaint::flux_pro_1_inpaint_image::{FluxPro1InpaintImageNumImages, FluxPro1InpaintImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use images::encoding::image_bytes_to_png_bytes::image_bytes_to_png_bytes; use images::encoding::image_bytes_to_png_bytes_with_dimensions::image_bytes_to_png_bytes_with_dimensions; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs index fb31e7382b..eeb23130ea 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs @@ -12,11 +12,8 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info, warn}; use serde_derive::{Deserialize, Serialize}; use tauri::{AppHandle, State}; @@ -75,8 +72,6 @@ pub async fn enqueue_image_to_3d_object_command( app_data_root: State<'_, AppDataRoot>, provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, - fal_creds_manager: State<'_, FalCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, sora_task_queue: State<'_, SoraTaskQueue>, ) -> Response { @@ -90,9 +85,7 @@ pub async fn enqueue_image_to_3d_object_command( &app_data_root, &provider_priority_store, &task_database, - &fal_creds_manager, &storyteller_creds_manager, - &fal_task_queue, ).await; match result { @@ -162,9 +155,7 @@ pub async fn handle_request( app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, - fal_creds_manager: &FalCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { let result = handle_object( @@ -173,9 +164,7 @@ pub async fn handle_request( &app_env_configs, &app_data_root, &provider_priority_store, - &fal_creds_manager, &storyteller_creds_manager, - &fal_task_queue, ).await; let success_event = match result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs index c9d195f3d8..9ff02721d1 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs @@ -1,3 +1,4 @@ +use crate::core::commands::enqueue::generate_error::GenerateError; use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::EnqueueImageTo3dObjectRequest; use crate::core::commands::enqueue::image_to_object::generic::handle_object_artcraft::handle_object_artcraft; use crate::core::commands::enqueue::image_to_object::generic::handle_object_fal::handle_object_fal; @@ -5,11 +6,8 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use tauri::AppHandle; -use crate::core::commands::enqueue::generate_error::GenerateError; pub async fn handle_object( request: EnqueueImageTo3dObjectRequest, @@ -17,15 +15,14 @@ pub async fn handle_object( app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, - fal_creds_manager: &FalCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { let priority = provider_priority_store.get_priority()?; for provider in priority.iter() { match provider { + Provider::Fal => {} // Fallthrough Provider::Sora => {} // Fallthrough Provider::Artcraft => { return Ok(handle_object_artcraft( @@ -36,18 +33,6 @@ pub async fn handle_object( storyteller_creds_manager ).await?); } - Provider::Fal => { - if fal_creds_manager.has_apparent_api_token()? { - return Ok(handle_object_fal( - &app, - app_env_configs, - app_data_root, - request, - fal_creds_manager, - fal_task_queue - ).await?); - } - } } } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs index 573e75cde0..21296aa980 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs @@ -12,7 +12,6 @@ use artcraft_api_defs::generate::object::generate_hunyuan_2_0_image_to_3d::Gener use artcraft_api_defs::generate::object::generate_hunyuan_2_1_image_to_3d::GenerateHunyuan21ImageTo3dRequest; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::endpoints::generate::object::generate_hunyuan_3d_2_0_image_to_3d::generate_hunyuan3d_2_0_image_to_3d; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs index ce96716cee..191b4f27db 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs @@ -1,21 +1,8 @@ use crate::core::commands::enqueue::generate_error::GenerateError; -use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::{EnqueueImageTo3dObjectModel, EnqueueImageTo3dObjectRequest}; +use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::EnqueueImageTo3dObjectRequest; 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}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::utils::download_media_file_to_temp_dir::download_media_file_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use anyhow::anyhow; -use enums::common::generation_provider::GenerationProvider; -use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::enqueue_hunyuan2_image_to_3d::{enqueue_hunyuan2_image_to_3d, Hunyuan2Args}; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use log::{error, info}; use tauri::AppHandle; pub async fn handle_object_fal( @@ -23,114 +10,6 @@ pub async fn handle_object_fal( app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, request: EnqueueImageTo3dObjectRequest, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { - - let api_key = match fal_creds_manager.get_key()? { - Some(key) => key, - None => { - error!("No FAL API key is set. Can't perform action."); - let event = - GenerationEnqueueFailureEvent::no_fal_api_key(GenerationAction::ImageTo3d); - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::needs_fal_api_key()); - }, - }; - - //let api_key = fal_creds_manager.get_key_required() - // .map_err(|err| { - // error!("EnqueueTextToImage FAL api key required: {:?}", err); - // InternalObjectError::NeedsFalApiKey - // })?; - - let mut temp_download; - - if let Some(media_token) = request.image_media_token { - temp_download = download_media_file_to_temp_dir( - app_env_configs, - app_data_root, - &media_token - ).await?; - } else { - return Err(GenerateError::required_source_image_not_provided()); - } - - info!("Calling FAL image to 3d ..."); - - let filename = temp_download.path().to_path_buf(); - - let mut used_model = None; - - let result = match request.model { - None => { - return Err(GenerateError::no_model_specified()); - } - Some( - EnqueueImageTo3dObjectModel::Hunyuan3d2_0 | - EnqueueImageTo3dObjectModel::Hunyuan3d2 - ) => { - used_model = Some(GenerationModel::Hunyuan3d2_0); - info!("enqueue Hunyuan 3D 2.0"); - enqueue_hunyuan2_image_to_3d(Hunyuan2Args { - image_path: filename, - api_key: &api_key, - }).await - } - _ => { - return Err(GenerateError::AnyhowError(anyhow!("Wrong model specified: {:?}", request.model))); - } - }; - - let mut job_id = None; - - match result { - Ok(enqueued) => { - info!("Successfully enqueued text to image"); - - job_id = Some(enqueued.request_id.to_string()); - - let event = GenerationEnqueueSuccessEvent { - action: GenerationAction::ImageTo3d, - service: GenerationServiceProvider::Fal, - model: None, - }; - - if let Err(err) = event.send(app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - if let Err(err) = fal_task_queue.insert(&enqueued) { - error!("Failed to enqueue task: {:?}", err); - return Err(GenerateError::AnyhowError(anyhow!("Failed to enqueue task: {:?}", err))); - } - } - Err(err) => { - error!("Failed to enqueue image to 3d: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::ImageTo3d, - service: GenerationServiceProvider::Fal, - model: None, - reason: None, - }; - - if let Err(err) = event.send(app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::from(err)); - } - } - - Ok(TaskEnqueueSuccess { - task_type: TaskType::ObjectGeneration, - model: used_model, - provider: GenerationProvider::Fal, - provider_job_id: job_id, - }) + Err(GenerateError::FalNoLongerSupported) } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs index c36e6491a6..e4a2b19eac 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs @@ -13,12 +13,9 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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 fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info, warn}; use serde_derive::{Deserialize, Serialize}; use tauri::{AppHandle, State}; @@ -118,8 +115,6 @@ pub async fn enqueue_image_to_video_command( app_data_root: State<'_, AppDataRoot>, provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, - fal_creds_manager: State<'_, FalCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, sora_task_queue: State<'_, SoraTaskQueue>, sora_creds_manager: State<'_, SoraCredentialManager>, @@ -134,10 +129,8 @@ pub async fn enqueue_image_to_video_command( &app_data_root, &provider_priority_store, &task_database, - &fal_creds_manager, &sora_creds_manager, &storyteller_creds_manager, - &fal_task_queue, ).await; match result { @@ -207,10 +200,8 @@ pub async fn handle_request( app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, - fal_creds_manager: &FalCredentialManager, sora_creds_manager: &SoraCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { let result = match request.model { @@ -231,9 +222,7 @@ pub async fn handle_request( app_env_configs, app_data_root, provider_priority_store, - fal_creds_manager, storyteller_creds_manager, - fal_task_queue, ).await } }; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs index bac90076d2..58fda7b29d 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs @@ -1,13 +1,10 @@ use crate::core::commands::enqueue::generate_error::GenerateError; use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; use crate::core::commands::enqueue::image_to_video::generic::handle_video_artcraft::handle_video_artcraft; -use crate::core::commands::enqueue::image_to_video::generic::handle_video_fal::handle_video_fal; 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use tauri::AppHandle; @@ -17,15 +14,14 @@ pub async fn handle_video( app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, - fal_creds_manager: &FalCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { let priority = provider_priority_store.get_priority()?; for provider in priority.iter() { match provider { + Provider::Fal => {} // Fallthrough Provider::Sora => {} // Fallthrough Provider::Artcraft => { return Ok(handle_video_artcraft( @@ -36,18 +32,6 @@ pub async fn handle_video( storyteller_creds_manager ).await?); } - Provider::Fal => { - if fal_creds_manager.has_apparent_api_token()? { - return Ok(handle_video_fal( - &app, - app_env_configs, - app_data_root, - request, - fal_creds_manager, - fal_task_queue - ).await?); - } - } } } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs index 3e290361d8..d9112d57af 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs @@ -18,9 +18,6 @@ use artcraft_api_defs::generate::video::generate_veo_3_fast_image_to_video::Gene use artcraft_api_defs::generate::video::generate_veo_3_image_to_video::{GenerateVeo3AspectRatio, GenerateVeo3ImageToVideoRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use fal_client::requests::queue::video_gen::enqueue_kling_16_pro_image_to_video::Kling16ProAspectRatio; -use fal_client::requests::webhook::video::enqueue_veo_2_image_to_video_webhook::Veo2AspectRatio; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::endpoints::generate::video::generate_kling_16_pro_image_to_video::generate_kling_16_pro_image_to_video; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs index cecce0b59e..8f69f7ee48 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs @@ -1,21 +1,8 @@ -use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; -use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::{EnqueueImageToVideoRequest, VideoModel}; +use crate::core::commands::enqueue::generate_error::GenerateError; +use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; 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}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::utils::download_media_file_to_temp_dir::download_media_file_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use anyhow::anyhow; -use enums::common::generation_provider::GenerationProvider; -use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use fal_client::requests::queue::video_gen::enqueue_kling_16_pro_image_to_video::{enqueue_kling_16_pro_image_to_video, Kling16ProArgs, Kling16ProAspectRatio, Kling16ProDuration}; -use log::{error, info}; use tauri::AppHandle; pub async fn handle_video_fal( @@ -23,102 +10,6 @@ pub async fn handle_video_fal( app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, request: EnqueueImageToVideoRequest, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { - - let api_key = match fal_creds_manager.get_key()? { - Some(key) => key, - None => { - error!("No FAL API key is set. Can't perform action."); - let event = - GenerationEnqueueFailureEvent::no_fal_api_key(GenerationAction::GenerateVideo); - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::needs_fal_api_key()); - }, - }; - - //let api_key = fal_creds_manager.get_key_required() - // .map_err(|err| { - // error!("EnqueueTextToImage FAL api key required: {:?}", err); - // InternalVideoError::NeedsFalApiKey - // })?; - - let mut temp_download; - - if let Some(media_token) = request.image_media_token { - temp_download = download_media_file_to_temp_dir( - app_env_configs, - app_data_root, - &media_token - ).await?; - } else { - return Err(GenerateError::BadInput(BadInputReason::RequiredSourceImageNotProvided)); - } - - let filename = temp_download.path().to_path_buf(); - - let mut selected_model = None; - - let result = match request.model { - None => { - return Err(GenerateError::no_model_specified()); - } - Some(VideoModel::Kling16Pro) => { - info!("enqueue Kling 1.6 image to video with Kling API"); - selected_model = Some(GenerationModel::Kling1_6); - enqueue_kling_16_pro_image_to_video(Kling16ProArgs { - image_path: filename, - api_key: &api_key, - duration: Kling16ProDuration::Default, - aspect_ratio: Kling16ProAspectRatio::WideSixteenNine, - prompt: request.prompt.as_deref().unwrap_or(""), - }).await - } - _ => { - return Err(GenerateError::AnyhowError(anyhow!("Unsupported model: {:?}", request.model))); - } - }; - - let mut job_id = None; - - match result { - Ok(enqueued) => { - info!("Successfully enqueued Kling 1.6 image to video"); - - job_id = Some(enqueued.request_id.to_string()); - - if let Err(err) = fal_task_queue.insert(&enqueued) { - error!("Failed to enqueue task: {:?}", err); - return Err(GenerateError::AnyhowError(anyhow!("Failed to enqueue task: {:?}", err))); - } - } - Err(err) => { - error!("Failed to enqueue image to video: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::GenerateVideo, - service: GenerationServiceProvider::Fal, - model: selected_model, - reason: None, - }; - - if let Err(err) = event.send(app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::from(err)); - } - } - - Ok(TaskEnqueueSuccess { - task_type: TaskType::VideoGeneration, - model: selected_model, - provider: GenerationProvider::Fal, - provider_job_id: job_id, - }) + Err(GenerateError::FalNoLongerSupported) } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/sora2/handle_sora2_video.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/sora2/handle_sora2_video.rs index 19c51fded1..f19af807a1 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/sora2/handle_sora2_video.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/sora2/handle_sora2_video.rs @@ -7,8 +7,6 @@ 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::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; 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; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs index 48637a00ae..3eb152ea63 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs @@ -19,8 +19,6 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::midjourney::state::midjourney_credential_manager::MidjourneyCredentialManager; use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; @@ -29,7 +27,6 @@ use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_status::TaskStatus; use enums::tauri::tasks::task_type::TaskType; use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info, warn}; use serde::{Deserialize, Serialize}; use sqlite_tasks::queries::create_task::{create_task, CreateTaskArgs}; @@ -146,10 +143,8 @@ pub async fn enqueue_text_to_image_command( app_env_configs: State<'_, AppEnvConfigs>, provider_priority_store: State<'_, ProviderPriorityStore>, task_database: State<'_, TaskDatabase>, - fal_creds_manager: State<'_, FalCredentialManager>, mj_creds_manager: State<'_, MidjourneyCredentialManager>, storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, sora_creds_manager: State<'_, SoraCredentialManager>, sora_task_queue: State<'_, SoraTaskQueue>, ) -> Response { @@ -162,11 +157,9 @@ pub async fn enqueue_text_to_image_command( &app_data_root, &provider_priority_store, &task_database, - &fal_creds_manager, &mj_creds_manager, &storyteller_creds_manager, &app_env_configs, - &fal_task_queue, &sora_creds_manager, &sora_task_queue, ).await; @@ -232,11 +225,9 @@ pub async fn handle_request( app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, task_database: &TaskDatabase, - fal_creds_manager: &FalCredentialManager, mj_creds_manager: &MidjourneyCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, app_env_configs: &AppEnvConfigs, - fal_task_queue: &FalTaskQueue, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, ) -> Result { @@ -246,10 +237,8 @@ pub async fn handle_request( &app, &app_data_root, &provider_priority_store, - &fal_creds_manager, &storyteller_creds_manager, &app_env_configs, - &fal_task_queue, &mj_creds_manager, &sora_creds_manager, &sora_task_queue, @@ -282,10 +271,8 @@ pub async fn dispatch_request( app: &AppHandle, app_data_root: &AppDataRoot, provider_priority_store: &ProviderPriorityStore, - fal_creds_manager: &FalCredentialManager, storyteller_creds_manager: &StorytellerCredentialManager, app_env_configs: &AppEnvConfigs, - fal_task_queue: &FalTaskQueue, mj_creds_manager: &MidjourneyCredentialManager, sora_creds_manager: &SoraCredentialManager, sora_task_queue: &SoraTaskQueue, @@ -336,16 +323,12 @@ pub async fn dispatch_request( for provider in priority.iter() { match provider { + Provider::Fal => {} // Fallthrough Provider::Sora => {} // Fallthrough Provider::Artcraft => { return handle_image_artcraft( request, &app, app_env_configs, app_data_root, storyteller_creds_manager).await; } - Provider::Fal => { - if fal_creds_manager.has_apparent_api_token()? { - return handle_image_fal(&app, request, fal_creds_manager, fal_task_queue).await; - } - } } } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash.rs index 3b1133a48c..336fff626d 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash.rs @@ -17,7 +17,6 @@ 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::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; use openai_sora_client::recipes::simple_image_gen_with_session_auto_renew::{simple_image_gen_with_session_auto_renew, SimpleImageGenAutoRenewRequest}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash_artcraft.rs index ca11f35499..523066f477 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gemini_25_flash/handle_gemini_25_flash_artcraft.rs @@ -15,7 +15,6 @@ use artcraft_api_defs::generate::image::edit::gemini_25_flash_edit_image::{Gemin use artcraft_api_defs::generate::image::generate_gpt_image_1_text_to_image::{GenerateGptImage1TextToImageImageQuality, GenerateGptImage1TextToImageImageSize, GenerateGptImage1TextToImageNumImages, GenerateGptImage1TextToImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs index 721fdd561d..a9225d2fb4 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs @@ -14,7 +14,6 @@ use artcraft_api_defs::generate::image::generate_flux_pro_11_text_to_image::{Gen use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image::{GenerateFluxPro11UltraTextToImageAspectRatio, GenerateFluxPro11UltraTextToImageNumImages, GenerateFluxPro11UltraTextToImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use storyteller_client::endpoints::generate::image::generate_flux_1_dev_text_to_image::generate_flux_1_dev_text_to_image; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs index 1ecd6ba1df..e945b536e3 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs @@ -1,130 +1,11 @@ -use crate::core::commands::enqueue::generate_error::{BadInputReason, GenerateError}; +use crate::core::commands::enqueue::generate_error::GenerateError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, ImageModel}; -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use anyhow::anyhow; -use enums::common::generation_provider::GenerationProvider; -use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; -use fal_client::requests::queue::image_gen::enqueue_recraft3_text_to_image::{enqueue_recraft3_text_to_image, Recraft3TextToImageArgs}; -use log::{error, info}; +use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::EnqueueTextToImageRequest; use tauri::AppHandle; pub async fn handle_image_fal( app: &AppHandle, request: &EnqueueTextToImageRequest, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, ) -> Result { - - let api_key = match fal_creds_manager.get_key()? { - Some(key) => key, - None => { - error!("No FAL API key is set. Can't perform action."); - let event = - GenerationEnqueueFailureEvent::no_fal_api_key(GenerationAction::GenerateImage); - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::needs_fal_api_key()); - }, - }; - - let api_key = fal_creds_manager.get_key_required() - .map_err(|err| { - error!("EnqueueTextToImage FAL api key required: {:?}", err); - GenerateError::needs_fal_api_key() - })?; - - let prompt = request.prompt.as_deref().unwrap_or(""); - - let model; - - let result = match request.model { - None => { - return Err(GenerateError::BadInput(BadInputReason::NoModelSpecified)); - } - Some( - ImageModel::GptImage1 | - ImageModel::Midjourney - ) => { - return Err(GenerateError::AnyhowError(anyhow!("wrong logic: another branch should handle this: {:?}", request.model))); - } - Some( - ImageModel::Gemini25Flash | - ImageModel::Flux1Dev | - ImageModel::Flux1Schnell | - ImageModel::FluxPro11 - ) => { - return Err(GenerateError::NotYetImplemented(format!("not yet implemented: {:?}", request.model))); - } - Some(ImageModel::FluxPro11Ultra) => { - model = GenerationModel::FluxPro11Ultra; - info!("enqueue Flux Pro 1.1 Ultra text-to-image with prompt: {}", prompt); - enqueue_flux_pro_11_ultra_text_to_image(FluxPro11UltraTextToImageArgs { - prompt, - api_key: &api_key, - }).await - } - Some(ImageModel::Recraft3) => { - model = GenerationModel::Recraft3; - info!("enqueue Recraft v3 text-to-image with prompt: {}", prompt); - enqueue_recraft3_text_to_image(Recraft3TextToImageArgs { - prompt, - api_key: &api_key, - }).await - } - }; - - let success_result = match result { - Ok(enqueued) => { - info!("Successfully enqueued text to image"); - - //let event = GenerationEnqueueSuccessEvent { - // action: GenerationAction::GenerateImage, - // service: GenerationServiceProvider::Fal, - // model: None, - //}; - - //if let Err(err) = event.send(app) { - // error!("Failed to emit event: {:?}", err); // Fail open. - //} - - if let Err(err) = fal_task_queue.insert(&enqueued) { - error!("Failed to enqueue task: {:?}", err); - return Err(GenerateError::AnyhowError(anyhow!("Failed to enqueue task: {:?}", err))); - } - - enqueued - } - Err(err) => { - error!("Failed to enqueue text to image: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::GenerateImage, - service: GenerationServiceProvider::Fal, - model: None, - reason: None, - }; - - if let Err(err) = event.send(app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(GenerateError::from(err)); - } - }; - - Ok(TaskEnqueueSuccess { - provider: GenerationProvider::Fal, - task_type: TaskType::ImageGeneration, - model: Some(model), - provider_job_id: Some(success_result.request_id.to_string()), - }) + Err(GenerateError::FalNoLongerSupported) } diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs index 64e1d30347..37fe8f5404 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs @@ -16,7 +16,6 @@ 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::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; use openai_sora_client::recipes::simple_image_gen_with_session_auto_renew::{simple_image_gen_with_session_auto_renew, SimpleImageGenAutoRenewRequest}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs index d46d2871c7..24a14421ad 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs @@ -14,7 +14,6 @@ use crate::services::storyteller::state::storyteller_credential_manager::Storyte use artcraft_api_defs::generate::image::generate_gpt_image_1_text_to_image::{GenerateGptImage1TextToImageImageQuality, GenerateGptImage1TextToImageImageSize, GenerateGptImage1TextToImageNumImages, GenerateGptImage1TextToImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs index e212fc8e3a..d4151a17c5 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs @@ -10,7 +10,6 @@ use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; use errors::AnyhowResult; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; use openai_sora_client::recipes::simple_image_gen_with_session_auto_renew::{simple_image_gen_with_session_auto_renew, SimpleImageGenAutoRenewRequest}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs index 2e815c0b7e..a5bbc85571 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs @@ -18,7 +18,6 @@ use crate::services::storyteller::state::storyteller_credential_manager::Storyte use artcraft_api_defs::generate::image::generate_gpt_image_1_text_to_image::{GenerateGptImage1TextToImageImageQuality, GenerateGptImage1TextToImageImageSize, GenerateGptImage1TextToImageNumImages, GenerateGptImage1TextToImageRequest}; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; -use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use idempotency::uuid::generate_random_uuid; use log::{error, info}; use midjourney_client::client::midjourney_hostname::MidjourneyHostname; diff --git a/crates/desktop/artcraft/src/core/commands/media_files/media_file_delete_command.rs b/crates/desktop/artcraft/src/core/commands/media_files/media_file_delete_command.rs index 98346fc6ff..c7621ce4c7 100644 --- a/crates/desktop/artcraft/src/core/commands/media_files/media_file_delete_command.rs +++ b/crates/desktop/artcraft/src/core/commands/media_files/media_file_delete_command.rs @@ -5,8 +5,6 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use errors::AnyhowResult; diff --git a/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs b/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs index 1862e18cd4..b5c9f480d7 100644 --- a/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs +++ b/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs @@ -5,8 +5,6 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use chrono::{DateTime, Utc}; diff --git a/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs b/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs index 49d520030b..283da3b3da 100644 --- a/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs +++ b/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs @@ -5,8 +5,6 @@ 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::core::state::task_database::TaskDatabase; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use chrono::{DateTime, Utc}; diff --git a/crates/desktop/artcraft/src/core/lifecycle/startup/handle_tauri_startup.rs b/crates/desktop/artcraft/src/core/lifecycle/startup/handle_tauri_startup.rs index fc076efb5b..98904ef5b0 100644 --- a/crates/desktop/artcraft/src/core/lifecycle/startup/handle_tauri_startup.rs +++ b/crates/desktop/artcraft/src/core/lifecycle/startup/handle_tauri_startup.rs @@ -3,15 +3,12 @@ use crate::core::lifecycle::startup::tasks::initially_size_and_position_windows: use crate::core::lifecycle::startup::tasks::load_provider_priority_state::load_provider_priority_state; use crate::core::lifecycle::startup::tasks::set_app_log_level::set_app_log_level; use crate::core::lifecycle::startup::tasks::spawn_discord_presence_thread::spawn_discord_presence_thread; -use crate::core::lifecycle::startup::tasks::spawn_fal_task_polling_thread::spawn_fal_task_polling_thread; use crate::core::lifecycle::startup::tasks::spawn_main_window_thread::spawn_main_window_thread; use crate::core::lifecycle::startup::tasks::spawn_sora_task_polling_thread::spawn_sora_task_polling_thread; use crate::core::lifecycle::startup::tasks::spawn_storyteller_threads::spawn_storyteller_threads; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::artcraft_platform_info::ArtcraftPlatformInfo; use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::midjourney::state::midjourney_credential_manager::MidjourneyCredentialManager; use crate::services::midjourney::threads::midjourney_long_polling_thread::midjourney_long_polling_thread; use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; @@ -28,8 +25,6 @@ pub async fn handle_tauri_startup( storyteller_creds_manager: StorytellerCredentialManager, sora_credential_manager: SoraCredentialManager, sora_task_queue: SoraTaskQueue, - fal_credential_manager: FalCredentialManager, - fal_task_queue: FalTaskQueue, mj_creds_manager: MidjourneyCredentialManager, ) -> AnyhowResult<()> { @@ -70,15 +65,6 @@ pub async fn handle_tauri_startup( &sora_task_queue, )?; - spawn_fal_task_polling_thread( - &app, - &root, - &app_env_configs, - &fal_credential_manager, - &fal_task_queue, - &storyteller_creds_manager, - )?; - tauri::async_runtime::spawn(midjourney_long_polling_thread( app.clone(), app_env_configs.clone(), diff --git a/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/mod.rs b/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/mod.rs index ec3eef73c1..b69bc77f05 100644 --- a/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/mod.rs +++ b/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/mod.rs @@ -2,7 +2,6 @@ pub (super) mod bootstrap_task_database; pub (super) mod set_app_log_level; pub (super) mod initially_size_and_position_windows; pub (super) mod spawn_discord_presence_thread; -pub (super) mod spawn_fal_task_polling_thread; pub (super) mod spawn_main_window_thread; pub (super) mod spawn_sora_task_polling_thread; pub (super) mod spawn_storyteller_threads; diff --git a/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/spawn_fal_task_polling_thread.rs b/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/spawn_fal_task_polling_thread.rs deleted file mode 100644 index c95aee27c8..0000000000 --- a/crates/desktop/artcraft/src/core/lifecycle/startup/tasks/spawn_fal_task_polling_thread.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use crate::services::fal::threads::fal_task_polling_thread::fal_task_polling_thread; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use errors::AnyhowResult; -use tauri::{AppHandle, Manager}; - -pub fn spawn_fal_task_polling_thread( - app: &AppHandle, - root: &AppDataRoot, - app_env_configs: &AppEnvConfigs, - fal_credential_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, - storyteller_creds_manager: &StorytellerCredentialManager, -) -> AnyhowResult<()> { - - tauri::async_runtime::spawn(fal_task_polling_thread( - app.clone(), - app_env_configs.clone(), - root.clone(), - fal_credential_manager.clone(), - fal_task_queue.clone(), - storyteller_creds_manager.clone(), - )); - - Ok(()) -} diff --git a/crates/desktop/artcraft/src/lib.rs b/crates/desktop/artcraft/src/lib.rs index bc484d1659..f5dcf75c94 100644 --- a/crates/desktop/artcraft/src/lib.rs +++ b/crates/desktop/artcraft/src/lib.rs @@ -29,14 +29,6 @@ use crate::core::state::data_dir::app_data_root::AppDataRoot; use crate::core::state::provider_priority::ProviderPriorityStore; use crate::core::threads::discord_presence_thread::discord_presence_thread; use crate::core::threads::main_window_thread::main_window_thread::main_window_thread; -use crate::services::fal::commands::fal_background_removal_command::fal_background_removal_command; -use crate::services::fal::commands::fal_hunyuan_image_to_3d_command::fal_hunyuan_image_to_3d_command; -use crate::services::fal::commands::fal_kling_image_to_video_command::fal_kling_image_to_video_command; -use crate::services::fal::commands::get_fal_api_key_command::get_fal_api_key_command; -use crate::services::fal::commands::set_fal_api_key_command::set_fal_api_key_command; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use crate::services::fal::threads::fal_task_polling_thread::fal_task_polling_thread; use crate::services::midjourney::commands::midjourney_clear_credentials_command::midjourney_clear_credentials_command; use crate::services::midjourney::commands::midjourney_get_credential_info_command::midjourney_get_credential_info_command; use crate::services::midjourney::commands::midjourney_open_login_command::midjourney_open_login_command; @@ -93,17 +85,10 @@ pub fn run() { let sora_creds_manager = SoraCredentialManager::initialize_from_disk_infallible(&app_data_root); let sora_creds_manager_2 = sora_creds_manager.clone(); - println!("Attempting to read existing fal credentials..."); - let fal_creds_manager = FalCredentialManager::initialize_from_disk_infallible(&app_data_root); - let fal_creds_manager_2 = fal_creds_manager.clone(); - // Other state let sora_task_queue = SoraTaskQueue::new(); let sora_task_queue_2 = sora_task_queue.clone(); - let fal_task_queue = FalTaskQueue::new(); - let fal_task_queue_2 = fal_task_queue.clone(); - let app_env_configs = AppEnvConfigs::load_from_filesystem(&app_data_root) .expect("AppEnvConfigs should be loaded from disk"); @@ -136,8 +121,6 @@ pub fn run() { let storyteller_creds = storyteller_creds_manager_2.clone(); let sora_creds = sora_creds_manager_2.clone(); let sora_tasks = sora_task_queue_2.clone(); - let fal_creds = fal_creds_manager_2.clone(); - let fal_tasks = fal_task_queue_2.clone(); tauri::async_runtime::block_on(async move { let result = setup_main_window(&app).await; @@ -150,8 +133,6 @@ pub fn run() { storyteller_creds, sora_creds, sora_tasks, - fal_creds, - fal_tasks, midjourney_creds_manager_2, ).await; @@ -167,8 +148,6 @@ pub fn run() { .manage(app_env_configs) .manage(app_preferences) .manage(artcraft_platform_info) - .manage(fal_creds_manager) - .manage(fal_task_queue) .manage(midjourney_creds_manager) .manage(sora_creds_manager) .manage(sora_task_queue) @@ -184,13 +163,9 @@ pub fn run() { enqueue_image_to_3d_object_command, enqueue_image_to_video_command, enqueue_text_to_image_command, - fal_background_removal_command, - fal_hunyuan_image_to_3d_command, - fal_kling_image_to_video_command, flip_image, get_app_info_command, get_app_preferences_command, - get_fal_api_key_command, get_provider_order_command, get_task_queue_command, load_without_cors_command, @@ -201,7 +176,6 @@ pub fn run() { midjourney_open_login_command, open_sora_login_command, platform_info_command, - set_fal_api_key_command, set_provider_order_command, sora_get_credential_info_command, sora_logout_command, diff --git a/crates/desktop/artcraft/src/services/fal/commands/fal_background_removal_command.rs b/crates/desktop/artcraft/src/services/fal/commands/fal_background_removal_command.rs deleted file mode 100644 index 4e4e22b906..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/fal_background_removal_command.rs +++ /dev/null @@ -1,279 +0,0 @@ -use crate::core::artcraft_error::ArtcraftError; -use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; -use crate::core::commands::response::shorthand::Response; -use crate::core::commands::response::success_response_wrapper::SerializeMarker; -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::common::{GenerationAction, GenerationServiceProvider}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; -use crate::core::events::sendable_event_trait::SendableEvent; -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::data_dir::trait_data_subdir::DataSubdir; -use crate::core::utils::download_media_file_to_temp_dir::download_media_file_to_temp_dir; -use crate::core::utils::get_url_file_extension::get_url_file_extension; -use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::core::utils::simple_http_download_to_tempfile::simple_http_download_to_tempfile; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use anyhow::anyhow; -use base64::prelude::BASE64_STANDARD; -use base64::{DecodeError, Engine}; -use errors::AnyhowError; -use fal_client::error::fal_error_plus::FalErrorPlus; -use fal_client::requests::queue::remove_background_rembg::remove_background_rembg; -use filesys::file_read_bytes::file_read_bytes; -use image::{EncodableLayout, ImageReader}; -use log::{error, info, warn}; -use reqwest::Url; -use serde_derive::{Deserialize, Serialize}; -use storyteller_client::error::storyteller_error::StorytellerError; -use storyteller_client::endpoints::media_files::get_media_file::{get_media_file, GetMediaFileSuccessResponse}; -use storyteller_client::endpoints::media_files::upload_image_media_file_from_file::{upload_image_media_file_from_file, UploadImageFromFileArgs}; -use storyteller_client::utils::api_host::ApiHost; -use tauri::{AppHandle, Manager, State}; -use tokens::tokens::media_files::MediaFileToken; - -#[derive(Deserialize)] -pub struct FalBackgroundRemovalRequest { - /// Image media file; the image to remove the background from. - pub image_media_token: Option, - - /// Base64-encoded image - pub base64_image: Option, -} - -#[derive(Serialize)] -pub struct FalBackgroundRemovalSuccessResponse { - /// Result media token - pub media_token: MediaFileToken, - /// Result URL - pub cdn_url: Url, - /// Base64 bytes - pub base64_bytes: String, -} - -impl SerializeMarker for FalBackgroundRemovalSuccessResponse {} - -#[derive(Serialize, Debug)] -#[serde(rename_all = "snake_case")] -pub enum BackgroundRemovalErrorType { - /// Generic server error - ServerError, - /// No Fal API key available - NeedsFalApiKey, -} - - -#[tauri::command] -pub async fn fal_background_removal_command( - app: AppHandle, - request: FalBackgroundRemovalRequest, - app_env_configs: State<'_, AppEnvConfigs>, - app_data_root: State<'_, AppDataRoot>, - fal_creds_manager: State<'_, FalCredentialManager>, - storyteller_creds_manager: State<'_, StorytellerCredentialManager>, -) -> Response { - - info!("fal_background_removal_command called; image media token: {:?}", request.image_media_token); - - let has_credentials = fal_creds_manager - .has_apparent_api_token() - .unwrap_or(true); // NB: Failures would be lock issues - - if !has_credentials { - warn!("No API key found"); - let event = - GenerationEnqueueFailureEvent::no_fal_api_key(GenerationAction::RemoveBackground); - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - return Err(CommandErrorResponseWrapper { - status: CommandErrorStatus::Unauthorized, - error_message: Some("You need to set a FAL api key".to_string()), - error_type: Some(BackgroundRemovalErrorType::NeedsFalApiKey), - error_details: None, - }); - } - - let event = GenerationEnqueueSuccessEvent { - action: GenerationAction::RemoveBackground, - service: GenerationServiceProvider::Fal, - model: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - let result = remove_background( - request, - &app_env_configs, - &app_data_root, - &fal_creds_manager, - &storyteller_creds_manager - ).await; - - match result { - Err(err) => { - error!("error: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::RemoveBackground, - service: GenerationServiceProvider::Fal, - model: None, - reason: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - let mut status = CommandErrorStatus::ServerError; - let mut error_type = BackgroundRemovalErrorType::ServerError; - let mut error_message = "A server error occurred. Please try again. If it continues, please tell our staff about the problem."; - - Err(CommandErrorResponseWrapper { - status, - error_message: Some(error_message.to_string()), - error_type: Some(error_type), - error_details: None, - }) - } - Ok(result) => { - Ok(FalBackgroundRemovalSuccessResponse { - media_token: result.0.media_file.token, - cdn_url: result.0.media_file.media_links.cdn_url, - base64_bytes: result.1, - }.into()) - } - } -} - -#[derive(Debug)] -enum InnerError { - FalError(FalErrorPlus), - AnyhowError(AnyhowError), - StorytellerError(StorytellerError), - DecodeError(DecodeError), - IoError(std::io::Error), - ArtcraftError(ArtcraftError), -} - -impl From for InnerError { - fn from(value: AnyhowError) -> Self { - Self::AnyhowError(value) - } -} - -impl From for InnerError { - fn from(value: FalErrorPlus) -> Self { - Self::FalError(value) - } -} - -impl From for InnerError { - fn from(value: StorytellerError) -> Self { - Self::StorytellerError(value) - } -} - -impl From for InnerError { - fn from(value: DecodeError) -> Self { - Self::DecodeError(value) - } -} - -impl From for InnerError { - fn from(value: std::io::Error) -> Self { - Self::IoError(value) - } -} - -impl From for InnerError { - fn from(value: ArtcraftError) -> Self { - match value { - ArtcraftError::AnyhowError(e) => Self::AnyhowError(e), - ArtcraftError::DecodeError(e) => Self::DecodeError(e), - ArtcraftError::IoError(e) => Self::IoError(e), - _ => Self::ArtcraftError(value), - } - } -} - -pub async fn remove_background( - request: FalBackgroundRemovalRequest, - app_env_configs: &AppEnvConfigs, - app_data_root: &AppDataRoot, - fal_creds_manager: &FalCredentialManager, - storyteller_creds_manager: &StorytellerCredentialManager, -) -> Result<(GetMediaFileSuccessResponse, String), InnerError> { - - let api_key = fal_creds_manager.get_key_required()?; - let creds = storyteller_creds_manager.get_credentials_required()?; - - let mut temp_download; - - if let Some(media_token) = request.image_media_token { - info!("From media token: {:?}", &media_token); - temp_download = download_media_file_to_temp_dir( - app_env_configs, - app_data_root, - &media_token - ).await?; - } else if let Some(base64_bytes) = request.base64_image { - info!("From base64 bytes..."); - temp_download = save_base64_image_to_temp_dir(&app_data_root, &base64_bytes).await?; - } else { - return Err(InnerError::AnyhowError(anyhow!("No image media token or base64 image provided"))); - } - - info!("Calling FAL image background removal..."); - - let filename = temp_download.path().to_path_buf(); - - let result = remove_background_rembg(filename, &api_key).await?; - - info!("Unpacking FAL result..."); - - let extension_with_dot = get_url_file_extension(&result.image_url) - .map(|ext| format!(".{}", ext)) - .unwrap_or_else(|| ".png".to_string()); - - let mut result_file = app_data_root.temp_dir().new_named_temp_file_with_extension(&extension_with_dot)?; - - info!("Downloading file result file..."); - - simple_http_download_to_tempfile(&result.image_url, &mut result_file).await?; - - let result_filename = result_file.path().to_path_buf(); - - // NB: We couldn't pass the existing file handle as I think the file handle pointer is already at the EOF - let bytes = file_read_bytes(&result_filename)?; - let base64_bytes = BASE64_STANDARD.encode(bytes.as_bytes()); - - info!("Uploading image media file..."); - - let upload_result = upload_image_media_file_from_file(UploadImageFromFileArgs { - api_host: &app_env_configs.storyteller_host, - maybe_creds: Some(&creds), - path: result_filename, - is_intermediate_system_file: true, // NB: Probably not essential to keep this. - maybe_prompt_token: None, // NB: Not used for bg removal. - maybe_batch_token: None, // NB: Not used for bg removal. - }).await?; - - // TODO: Don't re-request to simply build MediaLinks (or CDN URL). Get those from the upload API in one turn. - info!("Re-requesting media file..."); - - let response = get_media_file( - &app_env_configs.storyteller_host, - &upload_result.media_file_token, - ).await?; - - info!("Uploaded media file: {:?}", response.media_file.token); - - Ok((response, base64_bytes)) -} diff --git a/crates/desktop/artcraft/src/services/fal/commands/fal_hunyuan_image_to_3d_command.rs b/crates/desktop/artcraft/src/services/fal/commands/fal_hunyuan_image_to_3d_command.rs deleted file mode 100644 index 4b41b3caf4..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/fal_hunyuan_image_to_3d_command.rs +++ /dev/null @@ -1,215 +0,0 @@ -use crate::core::artcraft_error::ArtcraftError; -use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; -use crate::core::commands::response::shorthand::Response; -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::common::{GenerationAction, GenerationServiceProvider}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; -use crate::core::events::sendable_event_trait::SendableEvent; -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::data_dir::trait_data_subdir::DataSubdir; -use crate::core::utils::download_media_file_to_temp_dir::download_media_file_to_temp_dir; -use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use anyhow::anyhow; -use base64::DecodeError; -use errors::AnyhowError; -use fal_client::error::fal_error_plus::FalErrorPlus; -use fal_client::requests::queue::enqueue_hunyuan2_image_to_3d::{enqueue_hunyuan2_image_to_3d, Hunyuan2Args}; -use log::{error, info, warn}; -use serde_derive::{Deserialize, Serialize}; -use storyteller_client::error::storyteller_error::StorytellerError; -use tauri::{AppHandle, Manager, State}; -use tokens::tokens::media_files::MediaFileToken; - -#[derive(Deserialize)] -pub struct FalHunyuanImageTo3dRequest { - /// Image media file; the image to remove the background from. - pub image_media_token: Option, - - /// Base64-encoded image - pub base64_image: Option, -} - -#[derive(Serialize, Debug)] -#[serde(rename_all = "snake_case")] -pub enum HunyuanErrorType { - /// Generic server error - ServerError, - /// No Fal API key available - NeedsFalApiKey, -} - - -#[tauri::command] -pub async fn fal_hunyuan_image_to_3d_command( - app: AppHandle, - request: FalHunyuanImageTo3dRequest, - app_env_configs: State<'_, AppEnvConfigs>, - app_data_root: State<'_, AppDataRoot>, - fal_creds_manager: State<'_, FalCredentialManager>, - storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, -) -> Response<(), HunyuanErrorType, ()> { - - info!("fal_hunyuan_image_to_3d_command called; image media token: {:?}", request.image_media_token); - - let has_credentials = fal_creds_manager - .has_apparent_api_token() - .unwrap_or(true); // NB: Failures would be lock issues - - if !has_credentials { - warn!("No API key found"); - return Err(CommandErrorResponseWrapper { - status: CommandErrorStatus::Unauthorized, - error_message: Some("You need to set a FAL api key".to_string()), - error_type: Some(HunyuanErrorType::NeedsFalApiKey), - error_details: None, - }); - } - - let result = image_to_3d( - request, - &app_env_configs, - &app_data_root, - &fal_creds_manager, - &storyteller_creds_manager, - &fal_task_queue, - ).await; - - if let Err(err) = result { - error!("error: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::ImageTo3d, - service: GenerationServiceProvider::Fal, - model: None, - reason: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - let mut status = CommandErrorStatus::ServerError; - let mut error_type = HunyuanErrorType::ServerError; - let mut error_message = "A server error occurred. Please try again. If it continues, please tell our staff about the problem."; - - return Err(CommandErrorResponseWrapper { - status, - error_message: Some(error_message.to_string()), - error_type: Some(error_type), - error_details: None, - }) - } - - let event = GenerationEnqueueSuccessEvent { - action: GenerationAction::ImageTo3d, - service: GenerationServiceProvider::Fal, - model: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - Ok(().into()) -} - -#[derive(Debug)] -enum InnerError { - FalError(FalErrorPlus), - AnyhowError(AnyhowError), - StorytellerError(StorytellerError), - DecodeError(DecodeError), - IoError(std::io::Error), - ArtcraftError(ArtcraftError), -} - -impl From for InnerError { - fn from(value: AnyhowError) -> Self { - Self::AnyhowError(value) - } -} - -impl From for InnerError { - fn from(value: FalErrorPlus) -> Self { - Self::FalError(value) - } -} - -impl From for InnerError { - fn from(value: StorytellerError) -> Self { - Self::StorytellerError(value) - } -} - -impl From for InnerError { - fn from(value: DecodeError) -> Self { - Self::DecodeError(value) - } -} - -impl From for InnerError { - fn from(value: std::io::Error) -> Self { - Self::IoError(value) - } -} - -impl From for InnerError { - fn from(value: ArtcraftError) -> Self { - match value { - ArtcraftError::AnyhowError(e) => Self::AnyhowError(e), - ArtcraftError::DecodeError(e) => Self::DecodeError(e), - ArtcraftError::IoError(e) => Self::IoError(e), - ArtcraftError::StorytellerError(e) => Self::StorytellerError(e), - _ => Self::ArtcraftError(value), - } - } -} - - -pub async fn image_to_3d( - request: FalHunyuanImageTo3dRequest, - app_env_configs: &AppEnvConfigs, - app_data_root: &AppDataRoot, - fal_creds_manager: &FalCredentialManager, - storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, -) -> Result<(), InnerError> { - - let api_key = fal_creds_manager.get_key_required()?; - - let mut temp_download; - - if let Some(media_token) = request.image_media_token { - temp_download = download_media_file_to_temp_dir( - app_env_configs, - app_data_root, - &media_token - ).await?; - } else if let Some(base64_bytes) = request.base64_image { - temp_download = save_base64_image_to_temp_dir(&app_data_root, &base64_bytes).await?; - } else { - return Err(InnerError::AnyhowError(anyhow!("No image media token or base64 image provided"))); - } - - info!("Calling FAL image to 3d ..."); - - let filename = temp_download.path().to_path_buf(); - - let enqueued = enqueue_hunyuan2_image_to_3d(Hunyuan2Args { - image_path: filename, - api_key: &api_key, - }).await?; - - if let Err(err) = fal_task_queue.insert(&enqueued) { - error!("Failed to enqueue task: {:?}", err); - return Err(InnerError::AnyhowError(anyhow!("Failed to enqueue task: {:?}", err))); - } - - Ok(()) -} diff --git a/crates/desktop/artcraft/src/services/fal/commands/fal_kling_image_to_video_command.rs b/crates/desktop/artcraft/src/services/fal/commands/fal_kling_image_to_video_command.rs deleted file mode 100644 index 26eb22e32a..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/fal_kling_image_to_video_command.rs +++ /dev/null @@ -1,224 +0,0 @@ -use crate::core::artcraft_error::ArtcraftError; -use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; -use crate::core::commands::response::shorthand::Response; -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::common::{GenerationAction, GenerationServiceProvider}; -use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; -use crate::core::events::sendable_event_trait::SendableEvent; -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::data_dir::trait_data_subdir::DataSubdir; -use crate::core::utils::download_media_file_to_temp_dir::download_media_file_to_temp_dir; -use crate::core::utils::save_base64_image_to_temp_dir::save_base64_image_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use anyhow::anyhow; -use base64::DecodeError; -use errors::AnyhowError; -use fal_client::error::fal_error_plus::FalErrorPlus; -use fal_client::requests::queue::video_gen::enqueue_kling_16_pro_image_to_video::{enqueue_kling_16_pro_image_to_video, Kling16ProArgs, Kling16ProAspectRatio, Kling16ProDuration}; -use log::{error, info, warn}; -use serde_derive::{Deserialize, Serialize}; -use storyteller_client::error::storyteller_error::StorytellerError; -use tauri::{AppHandle, Manager, State}; -use tokens::tokens::media_files::MediaFileToken; - -#[derive(Deserialize)] -pub struct FalKlingImageToVideoRequest { - /// Image media file; the image to remove the background from. - /// This must be supplied **OR** the `base64_image`. - pub image_media_token: Option, - - /// Base64-encoded image - /// This must be supplied **OR** the `image_media_token`. - pub base64_image: Option, - - /// Optional: Text prompt. - pub prompt: Option, -} - -#[derive(Serialize, Debug)] -#[serde(rename_all = "snake_case")] -pub enum KlingImageToVideoErrorType { - /// Generic server error - ServerError, - /// No Fal API key available - NeedsFalApiKey, -} - - -#[tauri::command] -pub async fn fal_kling_image_to_video_command( - app: AppHandle, - request: FalKlingImageToVideoRequest, - app_env_configs: State<'_, AppEnvConfigs>, - app_data_root: State<'_, AppDataRoot>, - fal_creds_manager: State<'_, FalCredentialManager>, - storyteller_creds_manager: State<'_, StorytellerCredentialManager>, - fal_task_queue: State<'_, FalTaskQueue>, -) -> Response<(), KlingImageToVideoErrorType, ()> { - - info!("fal_kling_image_to_video_command called; image media token: {:?}", request.image_media_token); - - let has_credentials = fal_creds_manager - .has_apparent_api_token() - .unwrap_or(true); // NB: Failures would be lock issues - - if !has_credentials { - warn!("No API key found"); - return Err(CommandErrorResponseWrapper { - status: CommandErrorStatus::Unauthorized, - error_message: Some("You need to set a FAL api key".to_string()), - error_type: Some(KlingImageToVideoErrorType::NeedsFalApiKey), - error_details: None, - }); - } - - let result = image_to_video( - request, - &app_env_configs, - &app_data_root, - &fal_creds_manager, - &storyteller_creds_manager, - &fal_task_queue, - ).await; - - if let Err(err) = result { - error!("error: {:?}", err); - - let event = GenerationEnqueueFailureEvent { - action: GenerationAction::GenerateVideo, - service: GenerationServiceProvider::Fal, - model: None, - reason: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - let mut status = CommandErrorStatus::ServerError; - let mut error_type = KlingImageToVideoErrorType::ServerError; - let mut error_message = "A server error occurred. Please try again. If it continues, please tell our staff about the problem."; - - return Err(CommandErrorResponseWrapper { - status, - error_message: Some(error_message.to_string()), - error_type: Some(error_type), - error_details: None, - }) - } - - let event = GenerationEnqueueSuccessEvent { - action: GenerationAction::GenerateVideo, - service: GenerationServiceProvider::Fal, - model: None, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to emit event: {:?}", err); // Fail open. - } - - Ok(().into()) -} - -#[derive(Debug)] -enum InnerError { - FalError(FalErrorPlus), - AnyhowError(AnyhowError), - StorytellerError(StorytellerError), - DecodeError(DecodeError), - IoError(std::io::Error), - ArtcraftError(ArtcraftError), -} - -impl From for InnerError { - fn from(value: AnyhowError) -> Self { - Self::AnyhowError(value) - } -} - -impl From for InnerError { - fn from(value: FalErrorPlus) -> Self { - Self::FalError(value) - } -} - -impl From for InnerError { - fn from(value: StorytellerError) -> Self { - Self::StorytellerError(value) - } -} - -impl From for InnerError { - fn from(value: DecodeError) -> Self { - Self::DecodeError(value) - } -} - -impl From for InnerError { - fn from(value: std::io::Error) -> Self { - Self::IoError(value) - } -} - -impl From for InnerError { - fn from(value: ArtcraftError) -> Self { - match value { - ArtcraftError::AnyhowError(e) => Self::AnyhowError(e), - ArtcraftError::DecodeError(e) => Self::DecodeError(e), - ArtcraftError::IoError(e) => Self::IoError(e), - ArtcraftError::StorytellerError(e) => Self::StorytellerError(e), - _ => Self::ArtcraftError(value), - } - } -} - -pub async fn image_to_video( - request: FalKlingImageToVideoRequest, - app_env_configs: &AppEnvConfigs, - app_data_root: &AppDataRoot, - fal_creds_manager: &FalCredentialManager, - storyteller_creds_manager: &StorytellerCredentialManager, - fal_task_queue: &FalTaskQueue, -) -> Result<(), InnerError> { - - let api_key = fal_creds_manager.get_key_required()?; - let creds = storyteller_creds_manager.get_credentials_required()?; - - let mut temp_download; - - if let Some(media_token) = request.image_media_token { - temp_download = download_media_file_to_temp_dir( - app_env_configs, - app_data_root, - &media_token - ).await?; - - } else if let Some(base64_bytes) = request.base64_image { - temp_download = save_base64_image_to_temp_dir(&app_data_root, &base64_bytes).await?; - } else { - return Err(InnerError::AnyhowError(anyhow!("No image media token or base64 image provided"))); - } - - info!("Calling FAL image to video ..."); - - let filename = temp_download.path().to_path_buf(); - - let enqueued = enqueue_kling_16_pro_image_to_video(Kling16ProArgs { - image_path: filename, - api_key: &api_key, - duration: Kling16ProDuration::Default, - aspect_ratio: Kling16ProAspectRatio::WideSixteenNine, - prompt: request.prompt.as_deref().unwrap_or(""), - }).await?; - - if let Err(err) = fal_task_queue.insert(&enqueued) { - error!("Failed to enqueue task: {:?}", err); - return Err(InnerError::AnyhowError(anyhow!("Failed to enqueue task: {:?}", err))); - } - - Ok(()) -} diff --git a/crates/desktop/artcraft/src/services/fal/commands/get_fal_api_key_command.rs b/crates/desktop/artcraft/src/services/fal/commands/get_fal_api_key_command.rs deleted file mode 100644 index 939ec396be..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/get_fal_api_key_command.rs +++ /dev/null @@ -1,40 +0,0 @@ -use crate::core::commands::response::shorthand::Response; -use crate::core::commands::response::success_response_wrapper::SerializeMarker; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use errors::AnyhowResult; -use log::error; -use serde_derive::Serialize; -use tauri::State; - -#[derive(Serialize)] -pub struct GetFalApiKeyResponse { - pub key: Option, -} - -impl SerializeMarker for GetFalApiKeyResponse {} - -#[tauri::command] -pub async fn get_fal_api_key_command( - creds_manager: State<'_, FalCredentialManager>, -) -> Response { - - let key = get_key(&creds_manager) - .await - .map_err(|err| { - error!("Error getting API key: {:?}", err); - "error getting key" - })?; - - Ok(key.into()) -} - -async fn get_key( - creds_manager: &FalCredentialManager, -) -> AnyhowResult { - let maybe_key = creds_manager.get_key()? - .map(|key| key.0) - .map(|key| key.trim().to_string()) - .filter(|key| !key.is_empty()); - - Ok(GetFalApiKeyResponse { key: maybe_key }) -} diff --git a/crates/desktop/artcraft/src/services/fal/commands/mod.rs b/crates/desktop/artcraft/src/services/fal/commands/mod.rs deleted file mode 100644 index a846946ac4..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod fal_background_removal_command; -pub mod fal_hunyuan_image_to_3d_command; -pub mod fal_kling_image_to_video_command; -pub mod get_fal_api_key_command; -pub mod set_fal_api_key_command; -// pub mod get_open_ai_api_key_command; -// pub mod set_open_ai_api_key_command; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/fal/commands/set_fal_api_key_command.rs b/crates/desktop/artcraft/src/services/fal/commands/set_fal_api_key_command.rs deleted file mode 100644 index 6b4fc211a7..0000000000 --- a/crates/desktop/artcraft/src/services/fal/commands/set_fal_api_key_command.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::core::commands::response::shorthand::Response; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use errors::AnyhowResult; -use fal_client::creds::fal_api_key::FalApiKey; -use log::{error, info}; -use serde_derive::Deserialize; -use tauri::State; - -/// For now, we'll only update a single preference at a time. -#[derive(Deserialize)] -pub struct SetFalApiKeyRequest{ - pub key: Option, -} - -#[tauri::command] -pub async fn set_fal_api_key_command( - request: SetFalApiKeyRequest, - creds_manager: State<'_, FalCredentialManager>, -) -> Response<(), (), ()> { - info!("update_app_preferences_command called"); - - set_key(request, &creds_manager) - .await - .map_err(|err| { - error!("Error getting app preferences: {:?}", err); - "error setting key" - })?; - - Ok(().into()) -} - -async fn set_key( - request: SetFalApiKeyRequest, - creds_manager: &FalCredentialManager, -) -> AnyhowResult<()> { - - let key = request.key - .map(|key| key.trim().to_string()) - .filter(|key| !key.is_empty()) - .map(|key| FalApiKey::from_str(&key)); - - match key { - None => { - creds_manager.clear_key()?; - creds_manager.purge_api_key_from_disk()?; - } - Some(key) => { - creds_manager.set_key(&key)?; - creds_manager.persist_to_disk()?; - } - } - - Ok(()) -} diff --git a/crates/desktop/artcraft/src/services/fal/mod.rs b/crates/desktop/artcraft/src/services/fal/mod.rs deleted file mode 100644 index 2e33656fb0..0000000000 --- a/crates/desktop/artcraft/src/services/fal/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod commands; -pub mod state; -pub mod threads; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/fal/state/fal_credential_manager.rs b/crates/desktop/artcraft/src/services/fal/state/fal_credential_manager.rs deleted file mode 100644 index 405e6322b1..0000000000 --- a/crates/desktop/artcraft/src/services/fal/state/fal_credential_manager.rs +++ /dev/null @@ -1,100 +0,0 @@ -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::services::fal::state::read_fal_api_key_from_disk::read_fal_api_key_from_disk; -use anyhow::anyhow; -use errors::AnyhowResult; -use fal_client::creds::fal_api_key::FalApiKey; -use memory_store::clone_slot::CloneSlot; -use std::fs::OpenOptions; -use std::io::Write; -use std::{fs, io}; - -#[derive(Clone)] -pub struct FalCredentialManager { - key: CloneSlot, - app_data_root: AppDataRoot, -} - -impl FalCredentialManager { - pub fn new(app_data_root: &AppDataRoot) -> Self { - Self { - key: CloneSlot::empty(), - app_data_root: app_data_root.clone(), - } - } - - pub fn initialize_from_disk_infallible(app_data_root: &AppDataRoot) -> Self { - let mut holder = CloneSlot::empty(); - - match read_fal_api_key_from_disk(app_data_root) { - Err(err) => { - log::warn!("Failed to read FAL API key from disk: {:?}", err); - } - Ok(api_key) => { - holder.set_clone(&api_key).expect("Failed to set FAL API key"); - } - } - - Self { - key: holder, - app_data_root: app_data_root.clone(), - } - } - - pub fn set_key(&self, key: &FalApiKey) -> AnyhowResult<()> { - if key.0.trim().is_empty() { - return Err(anyhow!("FAL API key cannot be empty")); // TODO: Also handle upstream. - } - self.key.set_clone(key) - } - - pub fn get_key(&self) -> AnyhowResult> { - self.key.get_clone() - } - - pub fn get_key_required(&self) -> AnyhowResult { - self.key.get_clone_required() - } - - pub fn clear_key(&self) -> AnyhowResult<()> { - self.key.clear() - } - - /// Does not check the token for validity - pub fn has_apparent_api_token(&self) -> AnyhowResult { - self.key.is_some() - } - - pub fn purge_api_key_from_disk(&self) -> Result<(), io::Error> { - let filename = self.app_data_root.credentials_dir().get_fal_api_key_file_path(); - if filename.exists() && filename.is_file() { - fs::remove_file(filename)?; - } - Ok(()) - } - - pub fn persist_to_disk(&self) -> AnyhowResult<()> { - let key = match self.get_key() { - Ok(Some(key)) => key, - Ok(None) => { - self.purge_api_key_from_disk()?; - return Ok(()); - }, - Err(err) => { - return Err(anyhow!("Failed to get FAL key: {:?}", err)); - } - }; - - let filename = self.app_data_root.credentials_dir().get_fal_api_key_file_path(); - - let mut file = OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(filename)?; - - file.write_all(key.0.as_bytes())?; - file.flush()?; - - Ok(()) - } -} diff --git a/crates/desktop/artcraft/src/services/fal/state/fal_generation_type.rs b/crates/desktop/artcraft/src/services/fal/state/fal_generation_type.rs deleted file mode 100644 index 4dd1117b2c..0000000000 --- a/crates/desktop/artcraft/src/services/fal/state/fal_generation_type.rs +++ /dev/null @@ -1,37 +0,0 @@ -use crate::core::events::generation_events::common::GenerationAction; -use fal_client::model::fal_endpoint::FalEndpoint; - -/// Adapter of generation types/categories for FAL -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum FalGenerationType { - TextToImage, - ImageToImage, - TextToVideo, - ImageToVideo, - ImageTo3d, - ImageBackgroundRemoval, -} - -impl FalGenerationType { - pub fn from_fal_endpoint(endpoint: &FalEndpoint) -> Option { - match endpoint { - FalEndpoint::FluxProUltraTextToImage => Some(Self::TextToImage), - FalEndpoint::Hunyuan3d2Base => Some(Self::ImageTo3d), - FalEndpoint::Kling16ImageToVideo => Some(Self::ImageToVideo), - FalEndpoint::Minimax01ImageToVideo => Some(Self::ImageToVideo), - FalEndpoint::RecraftV3TextToImage => Some(Self::TextToImage), - FalEndpoint::Other(_) => None, - } - } - - pub fn to_event_generation_action(&self) -> GenerationAction { - match self { - Self::TextToImage => GenerationAction::GenerateImage, - Self::ImageToImage => GenerationAction::GenerateImage, - Self::TextToVideo => GenerationAction::GenerateVideo, - Self::ImageToVideo => GenerationAction::GenerateVideo, - Self::ImageTo3d => GenerationAction::ImageTo3d, - Self::ImageBackgroundRemoval => GenerationAction::RemoveBackground, - } - } -} \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/fal/state/fal_task_queue.rs b/crates/desktop/artcraft/src/services/fal/state/fal_task_queue.rs deleted file mode 100644 index 1416191d30..0000000000 --- a/crates/desktop/artcraft/src/services/fal/state/fal_task_queue.rs +++ /dev/null @@ -1,167 +0,0 @@ -use crate::services::fal::state::fal_generation_type::FalGenerationType; -use chrono::{DateTime, Utc}; -use errors::AnyhowResult; -use fal_client::model::enqueued_request::EnqueuedRequest; -use fal_client::model::fal_request_id::FalRequestId; -use indexmap::IndexMap; -use std::collections::HashSet; -use std::sync::{Arc, RwLock}; - -#[derive(Clone)] -pub struct FalTaskDetails { - pub enqueue_time: DateTime, - pub enqueued_request: EnqueuedRequest, - pub generation_type: Option, -} - -impl FalTaskDetails { - pub fn for_request(request: EnqueuedRequest) -> Self { - Self { - enqueue_time: Utc::now(), - generation_type: FalGenerationType::from_fal_endpoint(&request.fal_endpoint), - enqueued_request: request, - } - } -} - -#[derive(Clone)] -pub struct FalTaskQueue { - // Insertion-order map of task IDs to task details - queue: Arc>> -} - -impl FalTaskQueue { - pub fn new() -> Self { - Self { - queue: Arc::new(RwLock::new(IndexMap::new())) - } - } - - /// Determine if queue is empty - /// This is an O(1) operation. - pub fn is_empty(&self) -> AnyhowResult { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => Ok(lock.is_empty()) - } - } - - /// Get length of set - /// This is an O(1) operation. - pub fn len(&self) -> AnyhowResult { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => Ok(lock.len()) - } - } - - /// Get the task at an index. - /// This is an O(1) operation. - pub fn get_index(&self, i: usize) -> AnyhowResult> { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => { - if i >= lock.len() { - Ok(None) - } else { - match lock.get_index(i) { - None => Ok(None), - Some((_key, value)) => { - Ok(Some(value.clone())) - } - } - } - } - } - } - - /// Determine if the key is in the queue - /// This is an O(1) operation. - pub fn contains_key(&self, request_id: &FalRequestId) -> AnyhowResult { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => Ok(lock.contains_key(request_id)) - } - } - - /// Get the first enqueued task - /// This is an O(1) operation. - pub fn first(&self) -> AnyhowResult> { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => match lock.first() { - None => Ok(None), - Some((request_id, task_details)) => Ok(Some(task_details.clone())) - } - } - } - - /// Get the last enqueued task - /// This is an O(1) operation. - pub fn last(&self) -> AnyhowResult> { - match self.queue.read() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire read lock: {:?}", err)) - } - Ok(lock) => match lock.last() { - None => Ok(None), - Some((request_id, task_details)) => Ok(Some(task_details.clone())) - } - } - } - - /// Insert a new task. If a task already exists, we update its value. - /// This is an O(1) operation. - pub fn insert(&self, request: &EnqueuedRequest) -> AnyhowResult> { - match self.queue.write() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire write lock: {:?}", err)) - } - Ok(mut lock) => { - // NB: Probably fine to compute TaskDetails here for now. We may eventually expose this if we include additional info. - let task_details = FalTaskDetails::for_request(request.clone()); - Ok(lock.insert(request.request_id.clone(), task_details)) - } - } - } - - /// Remove a task by ID. - /// This is an O(n) operation. - pub fn remove(&self, request_id: &FalRequestId) -> AnyhowResult> { - match self.queue.write() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire write lock: {:?}", err)) - } - Ok(mut lock) => { - Ok(lock.shift_remove(request_id)) - } - } - } - - /// Remove a list of tasks by ID. - /// This is an O(n) operation. - pub fn remove_list(&self, request_ids: &[&FalRequestId]) -> AnyhowResult<()> { - match self.queue.write() { - Err(err) => { - Err(anyhow::anyhow!("Failed to acquire write lock: {:?}", err)) - } - Ok(mut lock) => { - // TODO: Cleaner way to do this? - let mut set : HashSet<&FalRequestId, _> = HashSet::with_capacity(request_ids.len()); - set.extend(request_ids); - lock.retain(|k, v| !set.contains(k)); - Ok(()) - } - } - } -} diff --git a/crates/desktop/artcraft/src/services/fal/state/mod.rs b/crates/desktop/artcraft/src/services/fal/state/mod.rs deleted file mode 100644 index 545ac3679c..0000000000 --- a/crates/desktop/artcraft/src/services/fal/state/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod fal_credential_manager; -pub mod fal_task_queue; -pub mod read_fal_api_key_from_disk; -mod fal_generation_type; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/fal/state/read_fal_api_key_from_disk.rs b/crates/desktop/artcraft/src/services/fal/state/read_fal_api_key_from_disk.rs deleted file mode 100644 index 57be2cfbfa..0000000000 --- a/crates/desktop/artcraft/src/services/fal/state/read_fal_api_key_from_disk.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use anyhow::anyhow; -use errors::AnyhowResult; -use fal_client::creds::fal_api_key::FalApiKey; -use std::fs::read_to_string; - -pub fn read_fal_api_key_from_disk(app_data_root: &AppDataRoot) -> AnyhowResult { - let api_key_file = app_data_root.credentials_dir().get_fal_api_key_file_path(); - - if !api_key_file.exists() { - return Err(anyhow!("API key file does not exist: {:?}", api_key_file)); - } - - let value = read_to_string(api_key_file)? - .trim() - .to_string(); - - Ok(FalApiKey::new(value)) -} diff --git a/crates/desktop/artcraft/src/services/fal/threads/fal_task_polling_thread.rs b/crates/desktop/artcraft/src/services/fal/threads/fal_task_polling_thread.rs deleted file mode 100644 index a76f9ba551..0000000000 --- a/crates/desktop/artcraft/src/services/fal/threads/fal_task_polling_thread.rs +++ /dev/null @@ -1,227 +0,0 @@ -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::common::GenerationServiceProvider; -use crate::core::events::generation_events::generation_complete_event::GenerationCompleteEvent; -use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; -use crate::core::state::data_dir::app_data_root::AppDataRoot; -use crate::core::utils::download_url_to_temp_dir::download_url_to_temp_dir; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; -use crate::services::fal::state::fal_task_queue::FalTaskQueue; -use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; -use errors::AnyhowResult; -use fal_client::export::queue::Status; -use fal_client::model::fal_request_id::FalRequestId; -use fal_client::utils::queue_status_checker::QueueStatusChecker; -use log::{error, info, warn}; -use storyteller_client::recipes::upload_media_file_from_file::upload_media_file_from_file; -use storyteller_client::utils::api_host::ApiHost; -use tauri::AppHandle; -use tokens::tokens::media_files::MediaFileToken; - -pub async fn fal_task_polling_thread( - app_handle: AppHandle, - app_env_configs: AppEnvConfigs, - app_data_root: AppDataRoot, - fal_creds_manager: FalCredentialManager, - fal_task_queue: FalTaskQueue, - storyteller_creds_manager: StorytellerCredentialManager, -) -> ! { - loop { - let res = polling_loop( - &app_handle, - &app_env_configs, - &fal_creds_manager, - &fal_task_queue, - &storyteller_creds_manager, - &app_data_root, - ).await; - if let Err(err) = res { - error!("An error occurred: {:?}", err); - } - tokio::time::sleep(std::time::Duration::from_millis(30_000)).await; - } -} - -async fn polling_loop( - app_handle: &AppHandle, - app_env_configs: &AppEnvConfigs, - fal_creds_manager: &FalCredentialManager, - fal_task_queue: &FalTaskQueue, - storyteller_creds_manager: &StorytellerCredentialManager, - app_data_root: &AppDataRoot, -) -> AnyhowResult<()> { - loop { - if fal_task_queue.is_empty()? { - // No need to poll if we don't have pending tasks. - tokio::time::sleep(std::time::Duration::from_millis(1_000)).await; - continue; - } - - info!("Task queue has {} pending tasks.", fal_task_queue.len()?); - - let key = fal_creds_manager.get_key_required()?; - let storyteller_creds = storyteller_creds_manager.get_credentials_required()?; - - let queue_status_checker = QueueStatusChecker::new(key); - - let mut succeeded_tasks = Vec::new(); - //let mut failed_tasks = Vec::new(); // TODO - - let len = fal_task_queue.len()?; - - for i in 0..len { - let task = match fal_task_queue.get_index(i)? { - Some(task) => task, - None => { - warn!("Failed to get task ID at index {}", i); - break; - } - }; - - let task_id = task.enqueued_request.request_id.clone(); - - info!("Checking task status for task ID: {:?}", &task_id); - - let result = queue_status_checker.check_status(&task.enqueued_request).await; - - let url = match result { - Err(err) => { - warn!("Error checking job status: {:?}", err); - tokio::time::sleep(std::time::Duration::from_millis(2_000)).await; - - // TODO: Some failures will be permanent job failures and the jobs will need to be removed. - - continue; - } - Ok(status) => { - info!("Status: {:?}", status); - match status.status { - Status::Completed => { - let result = queue_status_checker.get_download_url(&task.enqueued_request).await; - - let url = match result { - Ok(url) => url, - Err(err) => { - warn!("Failed to get download url: {:?}", err); - - // TODO: Some failures will be permanent job failures. - - continue; - } - }; - - url - } - _ => { - continue; - }, - } - } - }; - - // TODO: Clean up - - let download_file = download_url_to_temp_dir(&url, &app_data_root).await?; - - let result = upload_media_file_from_file( - &app_env_configs.storyteller_host, - Some(&storyteller_creds), - download_file, - None, // TODO: Should probably save prompts. - ).await; - - match result { - Ok(success) => { - info!("Uploaded to API backend: {:?}", success.media_file_token); - - let event = GenerationCompleteEvent { - //media_file_token: result.media_file_token, - action: task.generation_type - .map(|typ| typ.to_event_generation_action()), - service: GenerationServiceProvider::Fal, - model: None, - }; - - if let Err(err) = event.send(&app_handle) { - error!("Failed to send GenerationCompleteEvent: {:?}", err); // Fail open - } - - succeeded_tasks.push(task_id); - } - Err(err) => { - warn!("Failed to upload media file: {:?}", err); - continue; - } - } - } - - -// // TODO: The cursoring logic likely needs to improve. -// for task in response.task_responses { -// let status = TaskStatus::from_str(&task.status); -// -// match status { -// TaskStatus::Succeeded => { -// succeeded_tasks.push(task); -// } -// TaskStatus::Failed => { -// failed_tasks.push(task); -// } -// TaskStatus::Queued => {} -// TaskStatus::Running => {} -// TaskStatus::Unknown(_) => {} -// } -// } -// -// for task in failed_tasks.iter() { -// if fal_task_queue.contains_key(&task.id)? { -// let event = SoraImageGenerationFailedEvent { -// prompt: task.prompt.clone(), -// }; -// event.send(&app_handle)?; -// } -// } -// -// let failed_task_ids: Vec<&TaskId> = failed_tasks -// .iter() -// .map(|task| &task.id) -// .collect(); -// -// fal_task_queue.remove_list(&failed_task_ids)?; -// -// let creds = storyteller_creds_manager.get_credentials_required()?; -// let api_host = ApiHost::Storyteller; -// -// for task in succeeded_tasks.iter() { -// if !fal_task_queue.contains_key(&task.id)? { -// continue; -// } -// info!("Task succeeded: {:?}", task.id); -// -// for (i, generation) in task.generations.iter().enumerate() { -// info!("Downloading generated file..."); -// let download_path = download_generation(generation, &app_data_root).await?; -// -// info!("Uploading to backend..."); -// let result = upload_image_media_file_from_file(&api_host, Some(&creds), download_path).await?; -// -// info!("Uploaded to API backend: {:?}", result.media_file_token); -// -// let event = SoraImageGenerationCompleteEvent { -// media_file_token: result.media_file_token, -// }; -// -// event.send(&app_handle)?; -// } -// } -// - let succeeded_task_ids : Vec<&FalRequestId> = succeeded_tasks - .iter() - .map(|task| task) - .collect::>(); - - fal_task_queue.remove_list(&succeeded_task_ids)?; - - tokio::time::sleep(std::time::Duration::from_millis(1_000)).await; - } -} - diff --git a/crates/desktop/artcraft/src/services/fal/threads/mod.rs b/crates/desktop/artcraft/src/services/fal/threads/mod.rs deleted file mode 100644 index 725a68337f..0000000000 --- a/crates/desktop/artcraft/src/services/fal/threads/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod fal_task_polling_thread; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_clear_credentials_command.rs b/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_clear_credentials_command.rs index 84749af8b9..da44996e06 100644 --- a/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_clear_credentials_command.rs +++ b/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_clear_credentials_command.rs @@ -1,12 +1,10 @@ use crate::core::commands::response::shorthand::{Response, SimpleResponse}; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; +use crate::core::state::data_dir::app_data_root::AppDataRoot; use crate::services::midjourney::state::midjourney_credential_manager::MidjourneyCredentialManager; use errors::AnyhowResult; -use fal_client::creds::fal_api_key::FalApiKey; use log::{error, info}; use serde_derive::Deserialize; use tauri::State; -use crate::core::state::data_dir::app_data_root::AppDataRoot; #[tauri::command] pub async fn midjourney_clear_credentials_command( diff --git a/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_get_credential_info_command.rs b/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_get_credential_info_command.rs index fb41cc3289..bfe4286bb8 100644 --- a/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_get_credential_info_command.rs +++ b/crates/desktop/artcraft/src/services/midjourney/commands/midjourney_get_credential_info_command.rs @@ -1,6 +1,5 @@ use crate::core::commands::response::shorthand::{Response, ResponseOrErrorMessage}; use crate::core::commands::response::success_response_wrapper::SerializeMarker; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; use crate::services::midjourney::state::midjourney_credential_manager::MidjourneyCredentialManager; use errors::AnyhowResult; use log::{error, info}; diff --git a/crates/desktop/artcraft/src/services/mod.rs b/crates/desktop/artcraft/src/services/mod.rs index 45a23bf25b..97183d0ba7 100644 --- a/crates/desktop/artcraft/src/services/mod.rs +++ b/crates/desktop/artcraft/src/services/mod.rs @@ -1,4 +1,3 @@ -pub mod fal; pub mod midjourney; pub mod sora; pub mod storyteller; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/sora/commands/sora_get_credential_info_command.rs b/crates/desktop/artcraft/src/services/sora/commands/sora_get_credential_info_command.rs index 39436d7bf5..3675f58ec0 100644 --- a/crates/desktop/artcraft/src/services/sora/commands/sora_get_credential_info_command.rs +++ b/crates/desktop/artcraft/src/services/sora/commands/sora_get_credential_info_command.rs @@ -1,6 +1,5 @@ use crate::core::commands::response::shorthand::{Response, ResponseOrErrorMessage}; use crate::core::commands::response::success_response_wrapper::SerializeMarker; -use crate::services::fal::state::fal_credential_manager::FalCredentialManager; use crate::services::midjourney::state::midjourney_credential_manager::MidjourneyCredentialManager; use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; use errors::AnyhowResult;