From 706bdb8d833b359ac47d26ff28368d501061bb7a Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 31 Oct 2025 03:36:07 -0400 Subject: [PATCH] grok video enums --- .../enqueue_image_to_video_command.rs | 6 ++--- .../generic/handle_video_artcraft.rs | 10 ++++---- .../grok_video_task_polling_thread.rs | 6 ++--- .../public/enums/src/common/model_type.rs | 23 ++++++++++++++++++- .../model-list/src/lib/lists/VideoModels.ts | 6 ++--- 5 files changed, 35 insertions(+), 16 deletions(-) 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 c3565a7f5b..7af7969d52 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 @@ -28,8 +28,8 @@ use crate::services::grok::state::grok_credential_manager::GrokCredentialManager #[derive(Deserialize, Debug, Copy, Clone)] #[serde(rename_all = "snake_case")] pub enum VideoModel { - #[serde(rename = "grok")] - Grok, + #[serde(rename = "grok_video")] + GrokVideo, #[serde(rename = "kling_1.6_pro")] Kling16Pro, @@ -213,7 +213,7 @@ pub async fn handle_request( ) -> Result { let result = match request.model { - Some(VideoModel::Grok) => { + Some(VideoModel::GrokVideo) => { handle_grok_video( &request, app, 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 b8c6a9aaa4..a98156cc66 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 @@ -71,16 +71,14 @@ pub async fn handle_video_artcraft( None => { return Err(GenerateError::no_model_specified()); } - Some(VideoModel::Grok) => { + Some( + VideoModel::GrokVideo | + VideoModel::Sora2 + ) => { return Err(GenerateError::AnyhowError( anyhow!("wrong logic: another branch should handle this: {:?}", request.model))); } - Some(VideoModel::Sora2) => { - return Err(GenerateError::AnyhowError( - anyhow!("wrong logic: another branch should handle this: {:?}", - request.model))); - } Some(VideoModel::Kling16Pro) => { info!("enqueue Kling 1.6 Pro with Artcraft API"); selected_model = Some(GenerationModel::Kling1_6); diff --git a/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs b/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs index 503c63764f..278424f636 100644 --- a/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs +++ b/crates/desktop/artcraft/src/services/grok/threads/grok_video_task_polling/grok_video_task_polling_thread.rs @@ -221,8 +221,8 @@ async fn upload_grok_video( uuid_idempotency_token: generate_random_uuid(), positive_prompt: grok_video_post.prompt.clone(), negative_prompt: None, - model_type: Some(ModelType::Midjourney), // TODO: TEMP - generation_provider: Some(GenerationProvider::Midjourney), // TODO: TEMP + model_type: Some(ModelType::GrokVideo), + generation_provider: Some(GenerationProvider::Grok), }; let prompt_response = create_prompt( @@ -339,7 +339,7 @@ async fn upload_grok_video( let event = GenerationCompleteEvent { //media_file_token: result.media_file_token, action: Some(GenerationAction::GenerateVideo), - service: GenerationServiceProvider::Midjourney, // TODO + service: GenerationServiceProvider::Grok, model: None, }; diff --git a/crates/schema/public/enums/src/common/model_type.rs b/crates/schema/public/enums/src/common/model_type.rs index dac97ef5d1..84e1842875 100644 --- a/crates/schema/public/enums/src/common/model_type.rs +++ b/crates/schema/public/enums/src/common/model_type.rs @@ -29,6 +29,9 @@ pub enum ModelType { FluxProKontextMax, #[serde(rename = "gpt_image_1")] GptImage1, + // Generic grok image model without a version + #[serde(rename = "grok_image")] + GrokImage, #[serde(rename = "recraft_3")] Recraft3, #[serde(rename = "seededit_3")] @@ -61,6 +64,10 @@ pub enum ModelType { //FluxPro1Infill, // Video models + + // Generic grok video model without a version + #[serde(rename = "grok_video")] + GrokVideo, #[serde(rename = "kling_1p6_pro")] Kling16Pro, #[serde(rename = "kling_2p1_pro")] @@ -105,6 +112,7 @@ impl ModelType { Self::FluxPro11Ultra => "flux_pro_1p1_ultra", Self::FluxProKontextMax => "flux_pro_kontext_max", Self::GptImage1 => "gpt_image_1", + Self::GrokImage => "grok_image", Self::Recraft3 => "recraft_3", Self::SeedEdit3 => "seededit_3", Self::Qwen => "qwen", @@ -119,6 +127,7 @@ impl ModelType { Self::MidjourneyV7Raw => "midjourney_v7_raw", // Video models + Self::GrokVideo => "grok_video", Self::Kling16Pro => "kling_1p6_pro", Self::Kling21Pro => "kling_2p1_pro", Self::Kling21Master => "kling_2p1_master", @@ -146,6 +155,7 @@ impl ModelType { "flux_pro_1p1_ultra" => Ok(Self::FluxPro11Ultra), "flux_pro_kontext_max" => Ok(Self::FluxProKontextMax), "gpt_image_1" => Ok(Self::GptImage1), + "grok_image" => Ok(Self::GrokImage), "recraft_3" => Ok(Self::Recraft3), "seededit_3" => Ok(Self::SeedEdit3), "qwen" => Ok(Self::Qwen), @@ -160,6 +170,7 @@ impl ModelType { "midjourney_v7_raw" => Ok(Self::MidjourneyV7Raw), // Video models + "grok_video" => Ok(Self::GrokVideo), "kling_1p6_pro" => Ok(Self::Kling16Pro), "kling_2p1_pro" => Ok(Self::Kling21Pro), "kling_2p1_master" => Ok(Self::Kling21Master), @@ -191,6 +202,7 @@ impl ModelType { Self::FluxPro11Ultra, Self::FluxProKontextMax, Self::GptImage1, + Self::GrokImage, Self::Recraft3, Self::SeedEdit3, Self::Qwen, @@ -205,6 +217,7 @@ impl ModelType { Self::MidjourneyV7Raw, // Video models + Self::GrokVideo, Self::Kling16Pro, Self::Kling21Pro, Self::Kling21Master, @@ -241,6 +254,7 @@ mod tests { assert_serialization(ModelType::FluxPro11Ultra, "flux_pro_1p1_ultra"); assert_serialization(ModelType::FluxProKontextMax, "flux_pro_kontext_max"); assert_serialization(ModelType::GptImage1, "gpt_image_1"); + assert_serialization(ModelType::GrokImage, "grok_image"); assert_serialization(ModelType::Recraft3, "recraft_3"); assert_serialization(ModelType::SeedEdit3, "seededit_3"); assert_serialization(ModelType::Qwen, "qwen"); @@ -254,6 +268,7 @@ mod tests { assert_serialization(ModelType::MidjourneyV7DraftRaw, "midjourney_v7_draft_raw"); assert_serialization(ModelType::MidjourneyV7Raw, "midjourney_v7_raw"); // Video models + assert_serialization(ModelType::GrokVideo, "grok_video"); assert_serialization(ModelType::Kling16Pro, "kling_1p6_pro"); assert_serialization(ModelType::Kling21Pro, "kling_2p1_pro"); assert_serialization(ModelType::Kling21Master, "kling_2p1_master"); @@ -279,6 +294,7 @@ mod tests { assert_eq!(ModelType::FluxPro11Ultra.to_str(), "flux_pro_1p1_ultra"); assert_eq!(ModelType::FluxProKontextMax.to_str(), "flux_pro_kontext_max"); assert_eq!(ModelType::GptImage1.to_str(), "gpt_image_1"); + assert_eq!(ModelType::GrokImage.to_str(), "grok_image"); assert_eq!(ModelType::Recraft3.to_str(), "recraft_3"); assert_eq!(ModelType::SeedEdit3.to_str(), "seededit_3"); assert_eq!(ModelType::Qwen.to_str(), "qwen"); @@ -293,6 +309,7 @@ mod tests { assert_eq!(ModelType::MidjourneyV7Raw.to_str(), "midjourney_v7_raw"); // Video models + assert_eq!(ModelType::GrokVideo.to_str(), "grok_video"); assert_eq!(ModelType::Kling16Pro.to_str(), "kling_1p6_pro"); assert_eq!(ModelType::Kling21Pro.to_str(), "kling_2p1_pro"); assert_eq!(ModelType::Kling21Master.to_str(), "kling_2p1_master"); @@ -319,6 +336,7 @@ mod tests { assert_eq!(ModelType::from_str("flux_pro_1p1_ultra").unwrap(), ModelType::FluxPro11Ultra); assert_eq!(ModelType::from_str("flux_pro_kontext_max").unwrap(), ModelType::FluxProKontextMax); assert_eq!(ModelType::from_str("gpt_image_1").unwrap(), ModelType::GptImage1); + assert_eq!(ModelType::from_str("grok_image").unwrap(), ModelType::GrokImage); assert_eq!(ModelType::from_str("recraft_3").unwrap(), ModelType::Recraft3); assert_eq!(ModelType::from_str("seededit_3").unwrap(), ModelType::SeedEdit3); assert_eq!(ModelType::from_str("qwen").unwrap(), ModelType::Qwen); @@ -332,6 +350,7 @@ mod tests { assert_eq!(ModelType::from_str("midjourney_v7_draft_raw").unwrap(), ModelType::MidjourneyV7DraftRaw); assert_eq!(ModelType::from_str("midjourney_v7_raw").unwrap(), ModelType::MidjourneyV7Raw); // Video models + assert_eq!(ModelType::from_str("grok_video").unwrap(), ModelType::GrokVideo); assert_eq!(ModelType::from_str("kling_1p6_pro").unwrap(), ModelType::Kling16Pro); assert_eq!(ModelType::from_str("kling_2p1_pro").unwrap(), ModelType::Kling21Pro); assert_eq!(ModelType::from_str("kling_2p1_master").unwrap(), ModelType::Kling21Master); @@ -349,7 +368,7 @@ mod tests { #[test] fn all_variants() { let mut variants = ModelType::all_variants(); - assert_eq!(variants.len(), 31); + assert_eq!(variants.len(), 33); // Image models assert_eq!(variants.pop_first(), Some(ModelType::Flux1Dev)); assert_eq!(variants.pop_first(), Some(ModelType::Flux1Schnell)); @@ -359,6 +378,7 @@ mod tests { assert_eq!(variants.pop_first(), Some(ModelType::FluxPro11Ultra)); assert_eq!(variants.pop_first(), Some(ModelType::FluxProKontextMax)); assert_eq!(variants.pop_first(), Some(ModelType::GptImage1)); + assert_eq!(variants.pop_first(), Some(ModelType::GrokImage)); assert_eq!(variants.pop_first(), Some(ModelType::Recraft3)); assert_eq!(variants.pop_first(), Some(ModelType::SeedEdit3)); assert_eq!(variants.pop_first(), Some(ModelType::Qwen)); @@ -372,6 +392,7 @@ mod tests { assert_eq!(variants.pop_first(), Some(ModelType::MidjourneyV7DraftRaw)); assert_eq!(variants.pop_first(), Some(ModelType::MidjourneyV7Raw)); // Video models + assert_eq!(variants.pop_first(), Some(ModelType::GrokVideo)); assert_eq!(variants.pop_first(), Some(ModelType::Kling16Pro)); assert_eq!(variants.pop_first(), Some(ModelType::Kling21Pro)); assert_eq!(variants.pop_first(), Some(ModelType::Kling21Master)); diff --git a/frontend/libs/model-list/src/lib/lists/VideoModels.ts b/frontend/libs/model-list/src/lib/lists/VideoModels.ts index ed409c0f67..7335d27dda 100644 --- a/frontend/libs/model-list/src/lib/lists/VideoModels.ts +++ b/frontend/libs/model-list/src/lib/lists/VideoModels.ts @@ -4,11 +4,11 @@ import { SizeIconOption } from "../classes/metadata/SizeOption.js"; export const VIDEO_MODELS: VideoModel[] = [ new VideoModel({ - id: "grok", - tauriId: "grok", + id: "grok_video", + tauriId: "grok_video", fullName: "Grok Video", category: "video", - creator: ModelCreator.Kling, + creator: ModelCreator.Grok, selectorName: "Grok Video", selectorDescription: "Fastest video model", selectorBadges: ["20 sec."],