create prompts

This commit is contained in:
Brandon Thomas committed 2026-05-12 18:16:35 -04:00
1 parent 84858cf0b7
commit dd2dfb45c6
2 files changed
+100 -2

No files matched your search

@@ -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<CommonModelType> {
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 {
@@ -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<CommonModelType> {
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 = [