From dd2dfb45c6a413c87a4a05ea1d40b45e5e85e39b Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 12 May 2026 18:16:35 -0400 Subject: [PATCH] create prompts --- ...router_image_request_to_artcraft_prompt.rs | 30 +++++++- ...router_video_request_to_artcraft_prompt.rs | 72 ++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs b/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs index b008dfe44a..127234c40d 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs @@ -5,6 +5,7 @@ use artcraft_router::api::common_resolution::CommonResolution as RouterResolutio use artcraft_router::api::provider::Provider; use artcraft_router::generate::generate_image::generate_image_request_builder::GenerateImageRequestBuilder; use enums::common::generation::common_aspect_ratio::CommonAspectRatio as EnumsAspectRatio; +use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation::common_resolution::CommonResolution as EnumsResolution; use enums::common::generation_provider::GenerationProvider; @@ -19,7 +20,7 @@ pub fn router_image_request_to_artcraft_prompt( negative_prompt: None, model_type: image_model_to_common_model_type(request.model), generation_provider: Some(provider_to_generation_provider(request.provider)), - maybe_generation_mode: None, + maybe_generation_mode: Some(determine_image_generation_mode(request)), maybe_aspect_ratio: request.aspect_ratio.map(router_aspect_ratio_to_enums), maybe_resolution: request.resolution.map(router_resolution_to_enums), maybe_batch_count: request.image_batch_count.map(|n| n.min(255) as u8), @@ -30,6 +31,14 @@ pub fn router_image_request_to_artcraft_prompt( // ── Converters ── +fn determine_image_generation_mode(request: &GenerateImageRequestBuilder) -> CommonGenerationMode { + if request.image_inputs.is_some() { + CommonGenerationMode::Edit + } else { + CommonGenerationMode::Text + } +} + fn image_model_to_common_model_type(model: CommonImageModel) -> Option { match model { CommonImageModel::Flux1Dev => Some(CommonModelType::Flux1Dev), @@ -127,6 +136,7 @@ mod tests { assert_eq!(prompt.positive_prompt.as_deref(), Some("a cat in space")); assert_eq!(prompt.model_type, Some(CommonModelType::NanoBananaPro)); assert_eq!(prompt.generation_provider, Some(GenerationProvider::Fal)); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Text)); assert!(prompt.negative_prompt.is_none()); assert!(prompt.maybe_aspect_ratio.is_none()); assert!(prompt.maybe_resolution.is_none()); @@ -134,6 +144,24 @@ mod tests { assert!(!prompt.uuid_idempotency_token.is_empty()); } + #[test] + fn text_mode_when_no_images() { + let builder = base_builder(); + let prompt = router_image_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Text)); + } + + #[test] + fn edit_mode_when_images_present() { + use artcraft_router::api::image_list_ref::ImageListRef; + let builder = GenerateImageRequestBuilder { + image_inputs: Some(ImageListRef::Urls(vec!["https://example.com/img.jpg".to_string()])), + ..base_builder() + }; + let prompt = router_image_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Edit)); + } + #[test] fn with_aspect_ratio_and_resolution() { let builder = GenerateImageRequestBuilder { diff --git a/crates/desktop/artcraft/src/core/commands/generate/common/router_video_request_to_artcraft_prompt.rs b/crates/desktop/artcraft/src/core/commands/generate/common/router_video_request_to_artcraft_prompt.rs index d679a39170..fa1610e333 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/common/router_video_request_to_artcraft_prompt.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/common/router_video_request_to_artcraft_prompt.rs @@ -5,6 +5,7 @@ use artcraft_router::api::common_video_model::CommonVideoModel; use artcraft_router::api::provider::Provider; use artcraft_router::generate::generate_video::generate_video_request_builder::GenerateVideoRequestBuilder; use enums::common::generation::common_aspect_ratio::CommonAspectRatio as EnumsAspectRatio; +use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation::common_resolution::CommonResolution as EnumsResolution; use enums::common::generation_provider::GenerationProvider; @@ -19,7 +20,7 @@ pub fn router_video_request_to_artcraft_prompt( negative_prompt: request.negative_prompt.clone(), model_type: video_model_to_common_model_type(request.model), generation_provider: Some(provider_to_generation_provider(request.provider)), - maybe_generation_mode: None, + maybe_generation_mode: Some(determine_video_generation_mode(request)), maybe_aspect_ratio: request.aspect_ratio.map(router_aspect_ratio_to_enums), maybe_resolution: request.resolution.map(router_resolution_to_enums), maybe_batch_count: request.video_batch_count.map(|n| n.min(255) as u8), @@ -30,6 +31,21 @@ pub fn router_video_request_to_artcraft_prompt( // ── Converters ── +fn determine_video_generation_mode(request: &GenerateVideoRequestBuilder) -> CommonGenerationMode { + let has_keyframes = request.start_frame.is_some() || request.end_frame.is_some(); + let has_references = request.reference_images.is_some() + || request.reference_videos.is_some() + || request.reference_audio.is_some(); + + if has_keyframes { + CommonGenerationMode::Keyframe + } else if has_references { + CommonGenerationMode::Reference + } else { + CommonGenerationMode::Text + } +} + fn video_model_to_common_model_type(model: CommonVideoModel) -> Option { match model { CommonVideoModel::GrokVideo => Some(CommonModelType::GrokVideo), @@ -135,6 +151,7 @@ mod tests { assert_eq!(prompt.positive_prompt.as_deref(), Some("a dog running on the beach")); assert_eq!(prompt.model_type, Some(CommonModelType::Kling3p0Standard)); assert_eq!(prompt.generation_provider, Some(GenerationProvider::Fal)); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Text)); assert!(prompt.negative_prompt.is_none()); assert!(prompt.maybe_aspect_ratio.is_none()); assert!(prompt.maybe_resolution.is_none()); @@ -163,6 +180,59 @@ mod tests { assert_eq!(prompt.maybe_generate_audio, Some(true)); } + #[test] + fn text_mode_when_no_references() { + let builder = base_builder(); + let prompt = router_video_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Text)); + } + + #[test] + fn keyframe_mode_with_start_frame() { + use artcraft_router::api::image_ref::ImageRef; + let builder = GenerateVideoRequestBuilder { + start_frame: Some(ImageRef::Url("https://example.com/frame.jpg".to_string())), + ..base_builder() + }; + let prompt = router_video_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Keyframe)); + } + + #[test] + fn keyframe_mode_with_end_frame() { + use artcraft_router::api::image_ref::ImageRef; + let builder = GenerateVideoRequestBuilder { + end_frame: Some(ImageRef::Url("https://example.com/frame.jpg".to_string())), + ..base_builder() + }; + let prompt = router_video_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Keyframe)); + } + + #[test] + fn reference_mode_with_reference_images() { + use artcraft_router::api::image_list_ref::ImageListRef; + let builder = GenerateVideoRequestBuilder { + reference_images: Some(ImageListRef::Urls(vec!["https://example.com/ref.jpg".to_string()])), + ..base_builder() + }; + let prompt = router_video_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Reference)); + } + + #[test] + fn keyframe_takes_priority_over_reference() { + use artcraft_router::api::image_ref::ImageRef; + use artcraft_router::api::image_list_ref::ImageListRef; + let builder = GenerateVideoRequestBuilder { + start_frame: Some(ImageRef::Url("https://example.com/frame.jpg".to_string())), + reference_images: Some(ImageListRef::Urls(vec!["https://example.com/ref.jpg".to_string()])), + ..base_builder() + }; + let prompt = router_video_request_to_artcraft_prompt(&builder); + assert_eq!(prompt.maybe_generation_mode, Some(CommonGenerationMode::Keyframe)); + } + #[test] fn video_model_mapping() { let models = [