diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/audio_list_ref.rs b/crates/api_clients/artcraft/artcraft_router/src/api/audio_list_ref.rs index 32e08eeb16..6f409dca10 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/audio_list_ref.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/audio_list_ref.rs @@ -1,7 +1,7 @@ use tokens::tokens::media_files::MediaFileToken; -#[derive(Copy, Clone, Debug)] -pub enum AudioListRef<'a> { - MediaFileTokens(&'a Vec), - Urls(&'a Vec), +#[derive(Clone, Debug)] +pub enum AudioListRef { + MediaFileTokens(Vec), + Urls(Vec), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/character_list_ref.rs b/crates/api_clients/artcraft/artcraft_router/src/api/character_list_ref.rs index d7cf8c4d0c..bb24191ae1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/character_list_ref.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/character_list_ref.rs @@ -1,9 +1,9 @@ use tokens::tokens::characters::CharacterToken; /// Forward-compatible character reference list. -#[derive(Copy, Clone, Debug)] -pub enum CharacterListRef<'a> { - CharacterTokens(&'a Vec), - +#[derive(Clone, Debug)] +pub enum CharacterListRef { + CharacterTokens(Vec), + // In the future, we may have other identifiers for characters. } diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/image_list_ref.rs b/crates/api_clients/artcraft/artcraft_router/src/api/image_list_ref.rs index f6a8f8baec..e3df9423e5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/image_list_ref.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/image_list_ref.rs @@ -1,7 +1,7 @@ use tokens::tokens::media_files::MediaFileToken; -#[derive(Copy, Clone, Debug)] -pub enum ImageListRef<'a> { - MediaFileTokens(&'a Vec), - Urls(&'a Vec), +#[derive(Clone, Debug)] +pub enum ImageListRef { + MediaFileTokens(Vec), + Urls(Vec), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/image_ref.rs b/crates/api_clients/artcraft/artcraft_router/src/api/image_ref.rs index ce6aa5cc47..fa6a80d702 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/image_ref.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/image_ref.rs @@ -1,7 +1,7 @@ use tokens::tokens::media_files::MediaFileToken; -#[derive(Copy, Clone, Debug)] -pub enum ImageRef<'a> { - MediaFileToken(&'a MediaFileToken), - Url(&'a str), +#[derive(Clone, Debug)] +pub enum ImageRef { + MediaFileToken(MediaFileToken), + Url(String), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/video_list_ref.rs b/crates/api_clients/artcraft/artcraft_router/src/api/video_list_ref.rs index bb431fee70..d48f3ce292 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/video_list_ref.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/video_list_ref.rs @@ -1,7 +1,7 @@ use tokens::tokens::media_files::MediaFileToken; -#[derive(Copy, Clone, Debug)] -pub enum VideoListRef<'a> { - MediaFileTokens(&'a Vec), - Urls(&'a Vec), +#[derive(Clone, Debug)] +pub enum VideoListRef { + MediaFileTokens(Vec), + Urls(Vec), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_dev.rs index 24679272d6..4448971685 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_dev.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_flux_1_dev::PlanArtcraftFlux1Dev; pub(crate) fn estimate_image_cost_artcraft_flux_1_dev( - plan: &PlanArtcraftFlux1Dev<'_>, + plan: &PlanArtcraftFlux1Dev, ) -> ImageGenerationCostEstimate { // Pricing: $0.02/image (2 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 2; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_schnell.rs index af897ff131..ab0c790fde 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_1_schnell.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_flux_1_schnell::PlanArtcraftFlux1Schnell; pub(crate) fn estimate_image_cost_artcraft_flux_1_schnell( - _plan: &PlanArtcraftFlux1Schnell<'_>, + _plan: &PlanArtcraftFlux1Schnell, ) -> ImageGenerationCostEstimate { // Pricing: not available ImageGenerationCostEstimate { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_2_lora_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_2_lora_angles.rs index e21f2cc70f..b74978906a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_2_lora_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_2_lora_angles.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_flux_2_lora_angles::PlanArtcraftFlux2LoraAngles; pub(crate) fn estimate_image_cost_artcraft_flux_2_lora_angles( - plan: &PlanArtcraftFlux2LoraAngles<'_>, + plan: &PlanArtcraftFlux2LoraAngles, ) -> ImageGenerationCostEstimate { // Pricing: $0.04/image (4 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 4; @@ -43,7 +43,7 @@ mod tests { model: CommonImageModel::Flux2LoraAngles, provider: Provider::Artcraft, prompt: None, - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), resolution: None, aspect_ratio: None, quality: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1.rs index 6580b346d2..f5661d1661 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_flux_pro_1p1::PlanArtcraftFluxPro11; pub(crate) fn estimate_image_cost_artcraft_flux_pro_1p1( - plan: &PlanArtcraftFluxPro11<'_>, + plan: &PlanArtcraftFluxPro11, ) -> ImageGenerationCostEstimate { // Fal pricing: $0.04 per megapixel, billed by rounding up to the nearest // megapixel. The default image_size values are ~1MP, so 4 cents per image. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1_ultra.rs index 45045f625b..dc31ffebaf 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_flux_pro_1p1_ultra.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_flux_pro_1p1_ultra::PlanArtcraftFluxPro11Ultra; pub(crate) fn estimate_image_cost_artcraft_flux_pro_1p1_ultra( - plan: &PlanArtcraftFluxPro11Ultra<'_>, + plan: &PlanArtcraftFluxPro11Ultra, ) -> ImageGenerationCostEstimate { // Pricing: $0.06/image (6 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 6; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1.rs index 88f92ea03a..3891ee07b0 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraf }; pub(crate) fn estimate_image_cost_artcraft_gpt_image_1( - plan: &PlanArtcraftGptImage1<'_>, + plan: &PlanArtcraftGptImage1, ) -> ImageGenerationCostEstimate { // Pricing per the fal-ai GPT Image 1 docs, adapted for our artcraft billing: // @@ -62,7 +62,7 @@ mod tests { use crate::generate::generate_image::generate_image_request::GenerateImageRequest; use tokens::tokens::media_files::MediaFileToken; - fn base() -> GenerateImageRequest<'static> { + fn base() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::GptImage1, provider: Provider::Artcraft, @@ -109,7 +109,7 @@ mod tests { quality, aspect_ratio, image_batch_count: Some(batch), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base() }; request.build().unwrap().estimate_costs() diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1p5.rs index 54e60a0588..e4865d5064 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_gpt_image_1p5.rs @@ -7,7 +7,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_gpt_image_1p5::PlanArtcraftGptImage1p5; pub(crate) fn estimate_image_cost_artcraft_gpt_image_1p5( - plan: &PlanArtcraftGptImage1p5<'_>, + plan: &PlanArtcraftGptImage1p5, ) -> ImageGenerationCostEstimate { // Per fal docs (fal-ai/gpt-image-1.5 and fal-ai/gpt-image-1.5/edit): // diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana.rs index db8af3e385..3b18b4a3a9 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_nano_banana::PlanArtcraftNanaBanana; pub(crate) fn estimate_image_cost_artcraft_nano_banana( - plan: &PlanArtcraftNanaBanana<'_>, + plan: &PlanArtcraftNanaBanana, ) -> ImageGenerationCostEstimate { // Pricing: $0.04/image (4 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 4; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_2.rs index 4ba226b159..badceb81a1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_2.rs @@ -6,7 +6,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_nano_banana_2::PlanArtcraftNanaBanana2; pub(crate) fn estimate_image_cost_artcraft_nano_banana_2( - plan: &PlanArtcraftNanaBanana2<'_>, + plan: &PlanArtcraftNanaBanana2, ) -> ImageGenerationCostEstimate { // Pricing (USD cents per image), scaled off the 1K base cost of $0.08: // 0.5K → $0.06 (0.75×) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_pro.rs index 3647630600..af93c5c7cf 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_nano_banana_pro.rs @@ -6,7 +6,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_nano_banana_pro::PlanArtcraftNanaBananaPro; pub(crate) fn estimate_image_cost_artcraft_nano_banana_pro( - plan: &PlanArtcraftNanaBananaPro<'_>, + plan: &PlanArtcraftNanaBananaPro, ) -> ImageGenerationCostEstimate { // Pricing: $0.15/image at 1K or 2K resolution, $0.30/image at 4K. // (Stored as USD cents.) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_qwen_edit_2511_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_qwen_edit_2511_angles.rs index 5015d6c577..59b7789691 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_qwen_edit_2511_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_qwen_edit_2511_angles.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_qwen_edit_2511_angles::PlanArtcraftQwenEdit2511Angles; pub(crate) fn estimate_image_cost_artcraft_qwen_edit_2511_angles( - plan: &PlanArtcraftQwenEdit2511Angles<'_>, + plan: &PlanArtcraftQwenEdit2511Angles, ) -> ImageGenerationCostEstimate { // Pricing: $0.04/image (4 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 4; @@ -43,7 +43,7 @@ mod tests { model: CommonImageModel::QwenEdit2511Angles, provider: Provider::Artcraft, prompt: None, - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), resolution: None, aspect_ratio: None, quality: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4.rs index 34031ac7a6..047001a0ec 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_seedream_4::PlanArtcraftSeedream4; pub(crate) fn estimate_image_cost_artcraft_seedream_4( - plan: &PlanArtcraftSeedream4<'_>, + plan: &PlanArtcraftSeedream4, ) -> ImageGenerationCostEstimate { // Pricing: $0.03/image (3 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 3; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4p5.rs index 535f0327ca..375ceeecb2 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_4p5.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_seedream_4p5::PlanArtcraftSeedream4p5; pub(crate) fn estimate_image_cost_artcraft_seedream_4p5( - plan: &PlanArtcraftSeedream4p5<'_>, + plan: &PlanArtcraftSeedream4p5, ) -> ImageGenerationCostEstimate { // Pricing: $0.04/image (4 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 4; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_5_lite.rs index 9647024166..b9587ce91a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/artcraft/estimate_image_cost_artcraft_seedream_5_lite.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::artcraft::plan_generate_image_artcraft_seedream_5_lite::PlanArtcraftSeedream5Lite; pub(crate) fn estimate_image_cost_artcraft_seedream_5_lite( - plan: &PlanArtcraftSeedream5Lite<'_>, + plan: &PlanArtcraftSeedream5Lite, ) -> ImageGenerationCostEstimate { // Pricing: $0.04/image (4 cents). 1 credit = 1 USD cent. let cost_per_image: u64 = 4; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_dev.rs index 77cb2a100a..f561ad8af4 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_dev.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_flux_1_dev::PlanFalFlux1Dev; pub(crate) fn estimate_image_cost_fal_flux_1_dev( - plan: &PlanFalFlux1Dev<'_>, + plan: &PlanFalFlux1Dev, ) -> ImageGenerationCostEstimate { // Pricing: $0.025 per megapixel, billed by rounding up to nearest megapixel. // Default image sizes are ~1MP (1024x1024), so ~$0.025/image = 3 cents rounded up. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_schnell.rs index d86e51f36f..ce0c0420f5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_1_schnell.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_flux_1_schnell::PlanFalFlux1Schnell; pub(crate) fn estimate_image_cost_fal_flux_1_schnell( - plan: &PlanFalFlux1Schnell<'_>, + plan: &PlanFalFlux1Schnell, ) -> ImageGenerationCostEstimate { // Pricing: $0.003 per megapixel, billed by rounding up to nearest megapixel. // Default image sizes are ~1MP (1024x1024), so ~$0.003/image = 1 cent rounded up. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1.rs index 6d2687c634..3e5c58659a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_flux_pro_1p1::PlanFalFluxPro11; pub(crate) fn estimate_image_cost_fal_flux_pro_1p1( - plan: &PlanFalFluxPro11<'_>, + plan: &PlanFalFluxPro11, ) -> ImageGenerationCostEstimate { // Pricing: $0.04 per megapixel, billed by rounding up to nearest megapixel. // Default image sizes are ~1MP (1024x1024), so ~$0.04/image = 4 cents. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1_ultra.rs index b9ea7f84a3..0cdc322008 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_flux_pro_1p1_ultra.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_flux_pro_1p1_ultra::PlanFalFluxPro11Ultra; pub(crate) fn estimate_image_cost_fal_flux_pro_1p1_ultra( - plan: &PlanFalFluxPro11Ultra<'_>, + plan: &PlanFalFluxPro11Ultra, ) -> ImageGenerationCostEstimate { // Pricing: $0.06 per image. let cost_per_image: u64 = 6; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1.rs index 0fdc0cd1c8..d137fbb405 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_gpt_imag }; pub(crate) fn estimate_image_cost_fal_gpt_image_1( - plan: &PlanFalGptImage1<'_>, + plan: &PlanFalGptImage1, ) -> ImageGenerationCostEstimate { // Per fal docs (fal-ai/gpt-image-1/{text-to-image,edit-image}): // @@ -59,9 +59,9 @@ mod tests { quality: FalGptImage1Quality, image_size: Option, num_images: FalGptImage1NumImages, - ) -> PlanFalGptImage1<'static> { + ) -> PlanFalGptImage1 { PlanFalGptImage1 { - prompt: Some("p"), + prompt: Some("p".to_string()), image_urls: vec![], image_size, quality, @@ -74,12 +74,12 @@ mod tests { image_size: Option, num_images: FalGptImage1NumImages, num_input_images: usize, - ) -> PlanFalGptImage1<'static> { + ) -> PlanFalGptImage1 { let image_urls = (0..num_input_images) .map(|i| format!("https://fake.example.com/img{}.png", i)) .collect(); PlanFalGptImage1 { - prompt: Some("p"), + prompt: Some("p".to_string()), image_urls, image_size, quality, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1p5.rs index e6d2df1b79..c735d38eff 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_gpt_image_1p5.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_gpt_imag }; pub(crate) fn estimate_image_cost_fal_gpt_image_1p5( - plan: &PlanFalGptImage1p5<'_>, + plan: &PlanFalGptImage1p5, ) -> ImageGenerationCostEstimate { // Per fal docs (fal-ai/gpt-image-1.5 and fal-ai/gpt-image-1.5/edit): // @@ -50,9 +50,9 @@ mod tests { quality: FalGptImage1p5Quality, image_size: Option, num_images: FalGptImage1p5NumImages, - ) -> PlanFalGptImage1p5<'static> { + ) -> PlanFalGptImage1p5 { PlanFalGptImage1p5 { - prompt: Some("p"), + prompt: Some("p".to_string()), image_urls: vec![], image_size, quality, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana.rs index f2dcbc09af..99153fcf12 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_ban }; pub(crate) fn estimate_image_cost_fal_nano_banana( - plan: &PlanFalNanoBanana<'_>, + plan: &PlanFalNanoBanana, ) -> ImageGenerationCostEstimate { // Pricing: $0.039/image (no resolution multiplier — Gemini 25 Flash has no resolution option). // Rounded to 4 cents per image. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_2.rs index 6f9a40f37a..a7d432d391 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_2.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_ban }; pub(crate) fn estimate_image_cost_fal_nano_banana_2( - plan: &PlanFalNanaBanana2<'_>, + plan: &PlanFalNanaBanana2, ) -> ImageGenerationCostEstimate { // Pricing: $0.08/image base (1K). Multipliers: 0.5K = 0.75x, 2K = 1.5x, 4K = 2x. // (Stored as USD cents.) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_pro.rs index 17643594b5..2886cac8a9 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_nano_banana_pro.rs @@ -4,7 +4,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_ban }; pub(crate) fn estimate_image_cost_fal_nano_banana_pro( - plan: &PlanFalNanaBananaPro<'_>, + plan: &PlanFalNanaBananaPro, ) -> ImageGenerationCostEstimate { // Pricing: $0.15/image at 1K or 2K resolution, $0.30/image at 4K. // (Stored as USD cents.) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4.rs index 4af2687f14..fb09128e16 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_seedream_4::PlanFalSeedream4; pub(crate) fn estimate_image_cost_fal_seedream_4( - plan: &PlanFalSeedream4<'_>, + plan: &PlanFalSeedream4, ) -> ImageGenerationCostEstimate { // Pricing: $0.03 per image. let cost_per_image: u64 = 3; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4p5.rs index 129ca8e783..2b64e1119f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_4p5.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_seedream_4p5::PlanFalSeedream4p5; pub(crate) fn estimate_image_cost_fal_seedream_4p5( - plan: &PlanFalSeedream4p5<'_>, + plan: &PlanFalSeedream4p5, ) -> ImageGenerationCostEstimate { // Pricing: $0.04 per image. let cost_per_image: u64 = 4; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_5_lite.rs index efa8af58fd..6138b3eaa3 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/cost/fal/estimate_image_cost_fal_seedream_5_lite.rs @@ -2,7 +2,7 @@ use crate::generate::generate_image::image_generation_cost_estimate::ImageGenera use crate::generate::generate_image::plan::fal::plan_generate_image_fal_seedream_5_lite::PlanFalSeedream5Lite; pub(crate) fn estimate_image_cost_fal_seedream_5_lite( - plan: &PlanFalSeedream5Lite<'_>, + plan: &PlanFalSeedream5Lite, ) -> ImageGenerationCostEstimate { // Pricing: $0.035 per image — round up to 4 cents. let cost_per_image: u64 = 4; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_dev.rs index 044563fcd9..17468b11b1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_dev.rs @@ -9,12 +9,12 @@ use artcraft_api_defs::generate::image::text::generate_flux_1_dev_text_to_image: use artcraft_client::endpoints::generate::image::text::generate_flux_1_dev_text_to_image::generate_flux_1_dev_text_to_image; pub async fn execute_artcraft_flux_1_dev( - plan: &PlanArtcraftFlux1Dev<'_>, + plan: &PlanArtcraftFlux1Dev, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateFlux1DevTextToImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, num_images: Some(plan.num_images), }; @@ -49,7 +49,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_flux_1_dev_image_request() }; @@ -72,7 +72,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::Square), quality: None, image_batch_count: Some(4), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_flux_1_dev_image_request() }; @@ -98,7 +98,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a bear walking through an abandoned desert city at night"), + prompt: Some("a bear walking through an abandoned desert city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_flux_1_dev_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_schnell.rs index ec6c95b7f1..a504741600 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_1_schnell.rs @@ -9,12 +9,12 @@ use artcraft_api_defs::generate::image::text::generate_flux_1_schnell_text_to_im use artcraft_client::endpoints::generate::image::text::generate_flux_1_schnell_text_to_image::generate_flux_1_schnell_text_to_image; pub async fn execute_artcraft_flux_1_schnell( - plan: &PlanArtcraftFlux1Schnell<'_>, + plan: &PlanArtcraftFlux1Schnell, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateFlux1SchnellTextToImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, num_images: Some(plan.num_images), }; @@ -48,7 +48,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a man and woman walking through a cyberpunk city at night"), + prompt: Some("a man and woman walking through a cyberpunk city at night".to_string()), ..base_flux_1_schnell_image_request() }; @@ -71,7 +71,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::Square), quality: None, image_batch_count: Some(4), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_flux_1_schnell_image_request() }; @@ -97,7 +97,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a man and woman walking through a futuristic city at evening"), + prompt: Some("a man and woman walking through a futuristic city at evening".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_flux_1_schnell_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_2_lora_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_2_lora_angles.rs index 33deac71ed..8a4ae7eddc 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_2_lora_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_2_lora_angles.rs @@ -9,7 +9,7 @@ use artcraft_api_defs::generate::image::angle::flux_2_lora_edit_image_angle::Flu use artcraft_client::endpoints::generate::image::angle::flux_2_lora_edit_image_angle::flux_2_lora_edit_image_angle; pub async fn execute_artcraft_flux_2_lora_angles( - plan: &PlanArtcraftFlux2LoraAngles<'_>, + plan: &PlanArtcraftFlux2LoraAngles, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Flux2LoraEditImageAngleRequest { @@ -53,7 +53,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::SquareHd), quality: None, image_batch_count: Some(1), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), horizontal_angle: Some(30.0), vertical_angle: Some(0.0), zoom: Some(1.0), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1.rs index cb2d7a09e4..1404775c4c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1.rs @@ -9,12 +9,12 @@ use artcraft_api_defs::generate::image::text::generate_flux_pro_11_text_to_image use artcraft_client::endpoints::generate::image::text::generate_flux_pro_11_text_to_image::generate_flux_pro_11_text_to_image; pub async fn execute_artcraft_flux_pro_1p1( - plan: &PlanArtcraftFluxPro11<'_>, + plan: &PlanArtcraftFluxPro11, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateFluxPro11TextToImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, num_images: Some(plan.num_images), }; @@ -49,7 +49,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_flux_pro_1p1_image_request() }; @@ -72,7 +72,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::Square), quality: None, image_batch_count: Some(4), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_flux_pro_1p1_image_request() }; @@ -98,7 +98,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a bear walking through an abandoned desert city at night"), + prompt: Some("a bear walking through an abandoned desert city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_flux_pro_1p1_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1_ultra.rs index 46a5cb7d7b..fdd6f15e74 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_flux_pro_1p1_ultra.rs @@ -9,12 +9,12 @@ use artcraft_api_defs::generate::image::text::generate_flux_pro_11_ultra_text_to use artcraft_client::endpoints::generate::image::text::generate_flux_pro_11_ultra_text_to_image::generate_flux_pro_11_ultra_text_to_image; pub async fn execute_artcraft_flux_pro_1p1_ultra( - plan: &PlanArtcraftFluxPro11Ultra<'_>, + plan: &PlanArtcraftFluxPro11Ultra, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateFluxPro11UltraTextToImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, num_images: Some(plan.num_images), }; @@ -49,7 +49,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_flux_pro_1p1_ultra_image_request() }; @@ -72,7 +72,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::Square), quality: None, image_batch_count: Some(4), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_flux_pro_1p1_ultra_image_request() }; @@ -98,7 +98,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a t-rex walking through an abandoned desert city at night"), + prompt: Some("a t-rex walking through an abandoned desert city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_flux_pro_1p1_ultra_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1.rs index e11cdf68d8..a9344e1a84 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1.rs @@ -14,14 +14,14 @@ use artcraft_client::endpoints::generate::image::text::generate_gpt_image_1_text /// text-to-image, one for image-edit), so we dispatch on whether image refs /// are present rather than calling a single multi-function endpoint. pub async fn execute_artcraft_gpt_image_1( - plan: &PlanArtcraftGptImage1<'_>, + plan: &PlanArtcraftGptImage1, artcraft_client: &RouterArtcraftClient, ) -> Result { - let inference_job_token = match plan.image_inputs { + let inference_job_token = match plan.image_inputs.clone() { Some(image_inputs) => { let request = GptImage1EditImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), image_media_tokens: Some(image_inputs.to_owned()), image_size: plan.image_size.map(|s| s.to_edit()), num_images: Some(plan.num_images.to_edit()), @@ -39,7 +39,7 @@ pub async fn execute_artcraft_gpt_image_1( None => { let request = GenerateGptImage1TextToImageRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), image_size: plan.image_size.map(|s| s.to_t2i()), num_images: Some(plan.num_images.to_t2i()), image_quality: Some(plan.quality.to_t2i()), @@ -89,7 +89,7 @@ mod tests { fn build_edit_image_plan_smoke() { let tokens = vec![MediaFileToken::new_from_str("mf_test00000000000000000000000000")]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_gpt_image_1_image_request() }; let plan = request.build().expect("plan should build"); @@ -106,7 +106,7 @@ mod tests { let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), image_batch_count: Some(1), - prompt: Some("a horse walking through a cyberpunk city at night"), + prompt: Some("a horse walking through a cyberpunk city at night".to_string()), ..base_gpt_image_1_image_request() }; @@ -129,8 +129,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Change the background to a desert with cacti"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a desert with cacti".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Square), image_batch_count: Some(1), ..base_gpt_image_1_image_request() diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1p5.rs index 3dc2ba18c5..66465f30f9 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_gpt_image_1p5.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::gpt_image_1p5_multi_func use artcraft_client::endpoints::generate::image::multi_function::gpt_image_1p5_multi_function_image_gen_image::gpt_image_1p5_multi_function_image_gen; pub async fn execute_artcraft_gpt_image_1p5( - plan: &PlanArtcraftGptImage1p5<'_>, + plan: &PlanArtcraftGptImage1p5, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GptImage1p5MultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), mask_image_token: None, num_images: Some(plan.num_images), image_size: plan.image_size, @@ -56,7 +56,7 @@ mod tests { let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), image_batch_count: Some(1), - prompt: Some("a horse walking through a cyberpunk city at night"), + prompt: Some("a horse walking through a cyberpunk city at night".to_string()), ..base_gpt_image_1p5_image_request() }; @@ -81,8 +81,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Change the background to a desert with cacti"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a desert with cacti".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Auto), image_batch_count: Some(1), ..base_gpt_image_1p5_image_request() @@ -109,7 +109,7 @@ mod tests { let request = GenerateImageRequest { aspect_ratio: Some(ar), image_batch_count: Some(1), - prompt: Some("a bear walking through a abandoned desert city at night"), + prompt: Some("a bear walking through a abandoned desert city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_gpt_image_1p5_image_request() }; @@ -140,8 +140,8 @@ mod tests { for ar in CommonAspectRatio::iter() { println!("--- image-edit aspect ratio: {:?} ---", ar); let request = GenerateImageRequest { - prompt: Some("Change the background to an alien world"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to an alien world".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(ar), image_batch_count: Some(1), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana.rs index 35c7ec4426..d0af77d810 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_multi_functi use artcraft_client::endpoints::generate::image::multi_function::nano_banana_multi_function_image_gen_image::nano_banana_multi_function_image_gen; pub async fn execute_artcraft_nano_banana( - plan: &PlanArtcraftNanaBanana<'_>, + plan: &PlanArtcraftNanaBanana, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = NanoBananaMultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), aspect_ratio: plan.aspect_ratio, }; @@ -52,7 +52,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_nano_banana_image_request() }; @@ -77,8 +77,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Change the background to a sunny beach"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a sunny beach".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Auto), quality: None, image_batch_count: Some(1), @@ -107,7 +107,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a shiba walking through a cyberpunk city at night"), + prompt: Some("a shiba walking through a cyberpunk city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_nano_banana_image_request() }; @@ -138,8 +138,8 @@ mod tests { for ar in CommonAspectRatio::iter() { println!("--- image-edit aspect ratio: {:?} ---", ar); let request = GenerateImageRequest { - prompt: Some("Change the background to a sunny beach"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a sunny beach".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_2.rs index ea810157ef..6ada230c1f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_2.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_2_multi_func use artcraft_client::endpoints::generate::image::multi_function::nano_banana_2_multi_function_image_gen_image::nano_banana_2_multi_function_image_gen; pub async fn execute_artcraft_nano_banana_2( - plan: &PlanArtcraftNanaBanana2<'_>, + plan: &PlanArtcraftNanaBanana2, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = NanaBanana2MultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), resolution: plan.resolution, aspect_ratio: plan.aspect_ratio, @@ -51,7 +51,7 @@ mod tests { resolution: Some(CommonResolution::OneK), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_nano_banana_2_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_pro.rs index f4ecb83c44..fb2021eed5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_nano_banana_pro.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_pro_multi_fu use artcraft_client::endpoints::generate::image::multi_function::nano_banana_pro_multi_function_image_gen_image::nano_banana_pro_multi_function_image_gen; pub async fn execute_artcraft_nano_banana_pro( - plan: &PlanArtcraftNanaBananaPro<'_>, + plan: &PlanArtcraftNanaBananaPro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = NanoBananaProMultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), resolution: plan.resolution, aspect_ratio: plan.aspect_ratio, @@ -53,7 +53,7 @@ mod tests { resolution: Some(CommonResolution::OneK), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_image_request() }; @@ -77,7 +77,7 @@ mod tests { resolution: Some(CommonResolution::OneK), quality: None, image_batch_count: Some(4), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_image_request() }; @@ -104,8 +104,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Add the man in the first image into the fantasy scene in the second image. Keep his hoodie and attire, but match the vibe of the fantasy scene."), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Add the man in the first image into the fantasy scene in the second image. Keep his hoodie and attire, but match the vibe of the fantasy scene.".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Auto), // edit mode: preserve source dimensions resolution: Some(CommonResolution::OneK), quality: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_qwen_edit_2511_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_qwen_edit_2511_angles.rs index 4845b1c416..e9eb2f9b22 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_qwen_edit_2511_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_qwen_edit_2511_angles.rs @@ -9,7 +9,7 @@ use artcraft_api_defs::generate::image::angle::qwen_edit_2511_edit_image_angle:: use artcraft_client::endpoints::generate::image::angle::qwen_edit_2511_edit_image_angle::qwen_edit_2511_edit_image_angle; pub async fn execute_artcraft_qwen_edit_2511_angles( - plan: &PlanArtcraftQwenEdit2511Angles<'_>, + plan: &PlanArtcraftQwenEdit2511Angles, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = QwenEdit2511EditImageAngleRequest { @@ -18,7 +18,7 @@ pub async fn execute_artcraft_qwen_edit_2511_angles( horizontal_angle: plan.horizontal_angle, vertical_angle: plan.vertical_angle, zoom: plan.zoom, - additional_prompt: plan.prompt.map(|p| p.to_string()), + additional_prompt: plan.prompt.clone(), num_images: Some(plan.num_images), image_size: plan.image_size, }; @@ -55,7 +55,7 @@ mod tests { quality: None, image_batch_count: Some(1), prompt: None, - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), horizontal_angle: Some(30.0), vertical_angle: Some(0.0), zoom: Some(1.0), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4.rs index 28109507c5..f375a7f198 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4_mu use artcraft_client::endpoints::generate::image::multi_function::bytedance_seedream_v4_multi_function_image_gen_image::bytedance_seedream_v4_multi_function_image_gen; pub async fn execute_artcraft_seedream_4( - plan: &PlanArtcraftSeedream4<'_>, + plan: &PlanArtcraftSeedream4, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = BytedanceSeedreamV4MultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), image_size: plan.image_size, max_images: None, @@ -53,7 +53,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_seedream_4_image_request() }; @@ -78,8 +78,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Change the background to a sunny beach"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a sunny beach".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Auto), quality: None, image_batch_count: Some(1), @@ -108,7 +108,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a shiba walking through a cyberpunk city at night"), + prompt: Some("a shiba walking through a cyberpunk city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_seedream_4_image_request() }; @@ -139,8 +139,8 @@ mod tests { for ar in CommonAspectRatio::iter() { println!("--- image-edit aspect ratio: {:?} ---", ar); let request = GenerateImageRequest { - prompt: Some("Change the background to a sunny beach"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a sunny beach".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4p5.rs index 0f87c2c906..6d18e1fd23 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_4p5.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4p5_ use artcraft_client::endpoints::generate::image::multi_function::bytedance_seedream_v4p5_multi_function_image_gen_image::bytedance_seedream_v4p5_multi_function_image_gen; pub async fn execute_artcraft_seedream_4p5( - plan: &PlanArtcraftSeedream4p5<'_>, + plan: &PlanArtcraftSeedream4p5, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = BytedanceSeedreamV4p5MultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), image_size: plan.image_size, max_images: None, @@ -53,7 +53,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a corgi walking through a cyberpunk city at night"), + prompt: Some("a corgi walking through a cyberpunk city at night".to_string()), ..base_seedream_4p5_image_request() }; @@ -78,8 +78,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Change the background to a spooky haunted house"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a spooky haunted house".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(CommonAspectRatio::Auto2k), quality: None, image_batch_count: Some(1), @@ -108,7 +108,7 @@ mod tests { aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), - prompt: Some("a corgi walking through a cyberpunk city at night"), + prompt: Some("a corgi walking through a cyberpunk city at night".to_string()), request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::PayMoreUpgrade, ..base_seedream_4p5_image_request() }; @@ -139,8 +139,8 @@ mod tests { for ar in CommonAspectRatio::iter() { println!("--- image-edit aspect ratio: {:?} ---", ar); let request = GenerateImageRequest { - prompt: Some("Change the background to a spooky haunted house"), - image_inputs: Some(ImageListRef::MediaFileTokens(&image_tokens)), + prompt: Some("Change the background to a spooky haunted house".to_string()), + image_inputs: Some(ImageListRef::MediaFileTokens(image_tokens.clone())), aspect_ratio: Some(ar), quality: None, image_batch_count: Some(1), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_5_lite.rs index 2297d50216..3688985c63 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/artcraft/generate_image_artcraft_seedream_5_lite.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_5_lit use artcraft_client::endpoints::generate::image::multi_function::bytedance_seedream_5_lite_multi_function_image_gen_image::bytedance_seedream_5_lite_multi_function_image_gen; pub async fn execute_artcraft_seedream_5_lite( - plan: &PlanArtcraftSeedream5Lite<'_>, + plan: &PlanArtcraftSeedream5Lite, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = BytedanceSeedream5LiteMultiFunctionImageGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_tokens: plan.image_inputs.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + image_media_tokens: plan.image_inputs.clone(), num_images: Some(plan.num_images), image_size: plan.image_size, max_images: None, @@ -49,7 +49,7 @@ mod tests { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), quality: None, image_batch_count: Some(1), - prompt: Some("a corgi walking through a cyberpunk city at night"), + prompt: Some("a corgi walking through a cyberpunk city at night".to_string()), ..base_seedream_5_lite_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_dev.rs index 33754bf563..f8dbcac5b5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_dev.rs @@ -13,13 +13,13 @@ use fal_client::requests::webhook::image::text::enqueue_flux_1_dev_text_to_image }; pub async fn execute_fal_flux_1_dev( - plan: &PlanFalFlux1Dev<'_>, + plan: &PlanFalFlux1Dev, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if let Some(image_url) = &plan.maybe_image_url { // Image-to-image mode let args = Flux1DevEditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_url: image_url.clone(), num_images: plan.num_images.to_edit(), webhook_url: fal_client.webhook_url.as_str(), @@ -31,7 +31,7 @@ pub async fn execute_fal_flux_1_dev( } else { // Text-to-image mode let args = Flux1DevArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), aspect_ratio: plan.aspect_ratio, num_images: plan.num_images.to_t2i(), webhook_url: fal_client.webhook_url.as_str(), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_schnell.rs index 843c21634a..1e901a57f5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_1_schnell.rs @@ -13,7 +13,7 @@ use fal_client::requests::webhook::image::text::enqueue_flux_1_schnell_text_to_i }; pub async fn execute_fal_flux_1_schnell( - plan: &PlanFalFlux1Schnell<'_>, + plan: &PlanFalFlux1Schnell, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if let Some(image_url) = &plan.maybe_image_url { @@ -31,7 +31,7 @@ pub async fn execute_fal_flux_1_schnell( } else { // Text-to-image mode let args = Flux1SchnellArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), aspect_ratio: plan.t2i_aspect_ratio, num_images: plan.num_images.to_t2i(), webhook_url: fal_client.webhook_url.as_str(), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1.rs index 9aaa5342ce..c4edcffda9 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1.rs @@ -10,11 +10,11 @@ use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_text_to_imag }; pub async fn execute_fal_flux_pro_1p1( - plan: &PlanFalFluxPro11<'_>, + plan: &PlanFalFluxPro11, fal_client: &RouterFalClient, ) -> Result { let args = FluxPro11Args { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), aspect_ratio: plan.aspect_ratio, num_images: plan.num_images.to_fal(), webhook_url: fal_client.webhook_url.as_str(), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1_ultra.rs index 6cdc7ec97c..93f1ae889f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_flux_pro_1p1_ultra.rs @@ -10,11 +10,11 @@ use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_ultra_text_t }; pub async fn execute_fal_flux_pro_1p1_ultra( - plan: &PlanFalFluxPro11Ultra<'_>, + plan: &PlanFalFluxPro11Ultra, fal_client: &RouterFalClient, ) -> Result { let args = FluxPro11UltraArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), aspect_ratio: plan.aspect_ratio, num_images: plan.num_images.to_fal(), webhook_url: fal_client.webhook_url.as_str(), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1.rs index af95c806d5..42d27cb6fd 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1.rs @@ -13,12 +13,12 @@ use fal_client::requests::webhook::image::text::enqueue_gpt_image_1_text_to_imag }; pub async fn execute_fal_gpt_image_1( - plan: &PlanFalGptImage1<'_>, + plan: &PlanFalGptImage1, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { let args = EnqueueGptImage1TextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: plan.num_images.to_t2i(), image_size: plan.image_size.map(|s| s.to_t2i()), quality: Some(plan.quality.to_t2i()), @@ -32,7 +32,7 @@ pub async fn execute_fal_gpt_image_1( .map_err(|e| ArtcraftRouterError::Provider(ProviderError::Fal(e)))? } else { let args = EnqueueGptImage1EditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: plan.num_images.to_edit(), mask_image_url: None, @@ -67,11 +67,11 @@ mod tests { use crate::generate::generate_image::image_generation_plan::ImageGenerationPlan; use crate::test_helpers::get_fal_client; - fn base_fal_request() -> GenerateImageRequest<'static> { + fn base_fal_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::GptImage1, provider: Provider::Fal, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -106,7 +106,7 @@ mod tests { fn build_edit_image_plan_smoke() { let urls = vec!["https://example.com/img.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_fal_request() }; let plan = request.build().expect("plan should build"); @@ -123,7 +123,7 @@ mod tests { let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), image_batch_count: Some(1), - prompt: Some("a horse walking through a cyberpunk city at night"), + prompt: Some("a horse walking through a cyberpunk city at night".to_string()), ..base_fal_request() }; @@ -143,10 +143,10 @@ mod tests { TREX_SKELETON_IMAGE_URL.to_string(), ]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), aspect_ratio: Some(CommonAspectRatio::Square), image_batch_count: Some(1), - prompt: Some("change the background to a desert"), + prompt: Some("change the background to a desert".to_string()), ..base_fal_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1p5.rs index e519918623..6a2b8bc9a1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_gpt_image_1p5.rs @@ -13,12 +13,12 @@ use fal_client::requests::webhook::image::text::enqueue_gpt_image_1p5_text_to_im }; pub async fn execute_fal_gpt_image_1p5( - plan: &PlanFalGptImage1p5<'_>, + plan: &PlanFalGptImage1p5, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { let args = EnqueueGptImage1p5TextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: plan.num_images.to_t2i(), image_size: plan.image_size.map(|s| s.to_t2i()), background: None, @@ -32,7 +32,7 @@ pub async fn execute_fal_gpt_image_1p5( .map_err(|e| ArtcraftRouterError::Provider(ProviderError::Fal(e)))? } else { let args = EnqueueGptImage1p5EditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: plan.num_images.to_edit(), mask_image_url: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana.rs index 58b721628b..03dcaf0eab 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana.rs @@ -17,13 +17,13 @@ use fal_client::requests::webhook::image::text::enqueue_gemini_25_flash_text_to_ }; pub async fn execute_fal_nano_banana( - plan: &PlanFalNanoBanana<'_>, + plan: &PlanFalNanoBanana, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { // Text-to-image mode let args = Gemini25FlashTextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: to_t2i_num_images(plan.num_images), aspect_ratio: plan.t2i_aspect_ratio, webhook_url: fal_client.webhook_url.as_str(), @@ -35,7 +35,7 @@ pub async fn execute_fal_nano_banana( } else { // Image-edit mode let args = Gemini25FlashEditArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: to_edit_num_images(plan.num_images), aspect_ratio: plan.edit_aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_2.rs index e9891b9eb0..7f1ba3b91c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_2.rs @@ -17,13 +17,13 @@ use fal_client::requests::webhook::image::text::enqueue_nano_banana_2_text_to_im }; pub async fn execute_fal_nano_banana_2( - plan: &PlanFalNanaBanana2<'_>, + plan: &PlanFalNanaBanana2, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { // Text-to-image mode let args = EnqueueNanoBanana2TextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: to_t2i_num_images(plan.num_images), resolution: plan.resolution.map(to_t2i_resolution), aspect_ratio: plan.t2i_aspect_ratio, @@ -36,7 +36,7 @@ pub async fn execute_fal_nano_banana_2( } else { // Image-edit mode let args = EnqueueNanoBanana2EditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: to_edit_num_images(plan.num_images), resolution: plan.resolution.map(to_edit_resolution), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_pro.rs index e59d80c615..df7f80d45d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_nano_banana_pro.rs @@ -16,13 +16,13 @@ use fal_client::requests::webhook::image::text::enqueue_nano_banana_pro_text_to_ EnqueueNanoBananaProTextToImageNumImages, EnqueueNanoBananaProTextToImageResolution, }; pub async fn execute_fal_nano_banana_pro( - plan: &PlanFalNanaBananaPro<'_>, + plan: &PlanFalNanaBananaPro, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { // Text-to-image mode let args = EnqueueNanoBananaProTextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: to_t2i_num_images(plan.num_images), resolution: plan.resolution.map(to_t2i_resolution), aspect_ratio: plan.t2i_aspect_ratio, @@ -35,7 +35,7 @@ pub async fn execute_fal_nano_banana_pro( } else { // Image-edit mode let args = EnqueueNanoBananaProEditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: to_edit_num_images(plan.num_images), resolution: plan.resolution.map(to_edit_resolution), @@ -107,7 +107,7 @@ mod tests { resolution: Some(CommonResolution::TwoK), quality: None, image_batch_count: Some(1), - prompt: Some("a cyberpunk city skyline at dusk, neon lights reflecting on rain-soaked streets"), + prompt: Some("a cyberpunk city skyline at dusk, neon lights reflecting on rain-soaked streets".to_string()), ..base_fal_image_request() }; @@ -132,7 +132,7 @@ mod tests { resolution: Some(CommonResolution::OneK), quality: None, image_batch_count: Some(4), - prompt: Some("a golden retriever surfing a wave, cinematic, 4K"), + prompt: Some("a golden retriever surfing a wave, cinematic, 4K".to_string()), ..base_fal_image_request() }; @@ -159,8 +159,8 @@ mod tests { ]; let request = GenerateImageRequest { - prompt: Some("Add the ghost from the first image hovering above the T-Rex skeleton in the second image, make it look spooky but friendly"), - image_inputs: Some(ImageListRef::Urls(&image_urls)), + prompt: Some("Add the ghost from the first image hovering above the T-Rex skeleton in the second image, make it look spooky but friendly".to_string()), + image_inputs: Some(ImageListRef::Urls(image_urls.clone())), aspect_ratio: Some(CommonAspectRatio::Auto), // edit mode: preserve source dimensions resolution: Some(CommonResolution::TwoK), quality: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4.rs index 954f5dc900..9f9595cec6 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4.rs @@ -13,12 +13,12 @@ use fal_client::requests::webhook::image::text::enqueue_bytedance_seedream_v4_te }; pub async fn execute_fal_seedream_4( - plan: &PlanFalSeedream4<'_>, + plan: &PlanFalSeedream4, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { let args = EnqueueBytedanceSeedreamV4TextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: Some(plan.num_images.to_t2i()), max_images: None, image_size: plan.image_size.map(|s| s.to_t2i()), @@ -30,7 +30,7 @@ pub async fn execute_fal_seedream_4( .map_err(|e| ArtcraftRouterError::Provider(ProviderError::Fal(e)))? } else { let args = EnqueueBytedanceSeedreamV4EditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: Some(plan.num_images.to_edit()), max_images: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4p5.rs index 20b1cdea58..3cb767f99d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_4p5.rs @@ -13,12 +13,12 @@ use fal_client::requests::webhook::image::text::enqueue_bytedance_seedream_v4p5_ }; pub async fn execute_fal_seedream_4p5( - plan: &PlanFalSeedream4p5<'_>, + plan: &PlanFalSeedream4p5, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { let args = EnqueueBytedanceSeedreamV4p5TextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: Some(plan.num_images.to_t2i()), max_images: None, image_size: plan.image_size.map(|s| s.to_t2i()), @@ -30,7 +30,7 @@ pub async fn execute_fal_seedream_4p5( .map_err(|e| ArtcraftRouterError::Provider(ProviderError::Fal(e)))? } else { let args = EnqueueBytedanceSeedreamV4p5EditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: Some(plan.num_images.to_edit()), max_images: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_5_lite.rs index 062df008dc..faf1eb1da3 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/execute/fal/generate_image_fal_seedream_5_lite.rs @@ -13,12 +13,12 @@ use fal_client::requests::webhook::image::text::enqueue_bytedance_seedream_v5_li }; pub async fn execute_fal_seedream_5_lite( - plan: &PlanFalSeedream5Lite<'_>, + plan: &PlanFalSeedream5Lite, fal_client: &RouterFalClient, ) -> Result { let webhook_response = if plan.image_urls.is_empty() { let args = EnqueueBytedanceSeedreamV5LiteTextToImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), num_images: Some(plan.num_images.to_t2i()), max_images: None, image_size: plan.image_size.map(|s| s.to_t2i()), @@ -30,7 +30,7 @@ pub async fn execute_fal_seedream_5_lite( .map_err(|e| ArtcraftRouterError::Provider(ProviderError::Fal(e)))? } else { let args = EnqueueBytedanceSeedreamV5LiteEditImageArgs { - prompt: plan.prompt.unwrap_or(""), + prompt: plan.prompt.as_deref().unwrap_or(""), image_urls: plan.image_urls.clone(), num_images: Some(plan.num_images.to_edit()), max_images: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request.rs index 96dc075a64..58f5f361db 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request.rs @@ -37,7 +37,7 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_ban use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_banana_pro::plan_generate_image_fal_nano_banana_pro; #[derive(Clone, Debug)] -pub struct GenerateImageRequest<'a> { +pub struct GenerateImageRequest { /// Which model to use. pub model: CommonImageModel, @@ -45,12 +45,12 @@ pub struct GenerateImageRequest<'a> { pub provider: Provider, /// The prompt for the image generation. - pub prompt: Option<&'a str>, + pub prompt: Option, /// Input images for image editing. /// If present, we're doing image editing (image-to-image). /// If absent, we're doing text-to-image. - pub image_inputs: Option>, + pub image_inputs: Option, /// The resolution to use. pub resolution: Option, @@ -83,12 +83,12 @@ pub struct GenerateImageRequest<'a> { /// Some providers support idempotency. /// If not supplied, we'll generate one for the required providers. - pub idempotency_token: Option<&'a str>, + pub idempotency_token: Option, } -impl<'a> GenerateImageRequest<'a> { +impl GenerateImageRequest { /// Read the image generation request, construct a plan, then yield a means to execute it. - pub fn build(&self) -> Result, ArtcraftRouterError> { + pub fn build(&self) -> Result { match self.provider { Provider::Artcraft => self.build_artcraft(), Provider::Fal => self.build_fal(), @@ -96,7 +96,7 @@ impl<'a> GenerateImageRequest<'a> { } } - fn build_artcraft(&self) -> Result, ArtcraftRouterError> { + fn build_artcraft(&self) -> Result { match self.model { CommonImageModel::Flux1Dev => plan_generate_image_artcraft_flux_1_dev(self), CommonImageModel::Flux1Schnell => plan_generate_image_artcraft_flux_1_schnell(self), @@ -115,7 +115,7 @@ impl<'a> GenerateImageRequest<'a> { } } - fn build_fal(&self) -> Result, ArtcraftRouterError> { + fn build_fal(&self) -> Result { match self.model { CommonImageModel::Flux1Dev => plan_generate_image_fal_flux_1_dev(self), CommonImageModel::Flux1Schnell => plan_generate_image_fal_flux_1_schnell(self), @@ -138,14 +138,14 @@ impl<'a> GenerateImageRequest<'a> { } } - fn unsupported_provider(&self) -> Result, ArtcraftRouterError> { + fn unsupported_provider(&self) -> Result { Err(ArtcraftRouterError::UnsupportedModel( format!("Image generation for model `{:?}` is not supported for provider {:?}", self.model, self.provider) )) } pub fn get_or_generate_idempotency_token(&self) -> String { - self.idempotency_token.map(|t| t.to_string()) + self.idempotency_token.clone() .unwrap_or_else(|| uuid::Uuid::new_v4().to_string()) } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_plan.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_plan.rs index 1cbfd61a9c..580591e2ad 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_plan.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_plan.rs @@ -82,36 +82,36 @@ use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_ban use crate::generate::generate_image::plan::fal::plan_generate_image_fal_nano_banana_pro::PlanFalNanaBananaPro; #[derive(Debug)] -pub enum ImageGenerationPlan<'a> { - ArtcraftFlux1Dev(PlanArtcraftFlux1Dev<'a>), - ArtcraftFlux1Schnell(PlanArtcraftFlux1Schnell<'a>), - ArtcraftFluxPro11(PlanArtcraftFluxPro11<'a>), - ArtcraftFluxPro11Ultra(PlanArtcraftFluxPro11Ultra<'a>), - ArtcraftGptImage1(PlanArtcraftGptImage1<'a>), - ArtcraftGptImage1p5(PlanArtcraftGptImage1p5<'a>), - ArtcraftNanaBanana(PlanArtcraftNanaBanana<'a>), - ArtcraftNanaBanana2(PlanArtcraftNanaBanana2<'a>), - ArtcraftNanaBananaPro(PlanArtcraftNanaBananaPro<'a>), - ArtcraftSeedream4(PlanArtcraftSeedream4<'a>), - ArtcraftSeedream4p5(PlanArtcraftSeedream4p5<'a>), - ArtcraftSeedream5Lite(PlanArtcraftSeedream5Lite<'a>), - ArtcraftQwenEdit2511Angles(PlanArtcraftQwenEdit2511Angles<'a>), - ArtcraftFlux2LoraAngles(PlanArtcraftFlux2LoraAngles<'a>), - FalFlux1Dev(PlanFalFlux1Dev<'a>), - FalFlux1Schnell(PlanFalFlux1Schnell<'a>), - FalFluxPro11(PlanFalFluxPro11<'a>), - FalFluxPro11Ultra(PlanFalFluxPro11Ultra<'a>), - FalGptImage1(PlanFalGptImage1<'a>), - FalGptImage1p5(PlanFalGptImage1p5<'a>), - FalSeedream4(PlanFalSeedream4<'a>), - FalSeedream4p5(PlanFalSeedream4p5<'a>), - FalSeedream5Lite(PlanFalSeedream5Lite<'a>), - FalNanoBanana(PlanFalNanoBanana<'a>), - FalNanaBanana2(PlanFalNanaBanana2<'a>), - FalNanaBananaPro(PlanFalNanaBananaPro<'a>), +pub enum ImageGenerationPlan { + ArtcraftFlux1Dev(PlanArtcraftFlux1Dev), + ArtcraftFlux1Schnell(PlanArtcraftFlux1Schnell), + ArtcraftFluxPro11(PlanArtcraftFluxPro11), + ArtcraftFluxPro11Ultra(PlanArtcraftFluxPro11Ultra), + ArtcraftGptImage1(PlanArtcraftGptImage1), + ArtcraftGptImage1p5(PlanArtcraftGptImage1p5), + ArtcraftNanaBanana(PlanArtcraftNanaBanana), + ArtcraftNanaBanana2(PlanArtcraftNanaBanana2), + ArtcraftNanaBananaPro(PlanArtcraftNanaBananaPro), + ArtcraftSeedream4(PlanArtcraftSeedream4), + ArtcraftSeedream4p5(PlanArtcraftSeedream4p5), + ArtcraftSeedream5Lite(PlanArtcraftSeedream5Lite), + ArtcraftQwenEdit2511Angles(PlanArtcraftQwenEdit2511Angles), + ArtcraftFlux2LoraAngles(PlanArtcraftFlux2LoraAngles), + FalFlux1Dev(PlanFalFlux1Dev), + FalFlux1Schnell(PlanFalFlux1Schnell), + FalFluxPro11(PlanFalFluxPro11), + FalFluxPro11Ultra(PlanFalFluxPro11Ultra), + FalGptImage1(PlanFalGptImage1), + FalGptImage1p5(PlanFalGptImage1p5), + FalSeedream4(PlanFalSeedream4), + FalSeedream4p5(PlanFalSeedream4p5), + FalSeedream5Lite(PlanFalSeedream5Lite), + FalNanoBanana(PlanFalNanoBanana), + FalNanaBanana2(PlanFalNanaBanana2), + FalNanaBananaPro(PlanFalNanaBananaPro), } -impl<'a> ImageGenerationPlan<'a> { +impl ImageGenerationPlan { pub async fn generate_image( &self, client: &RouterClient, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_dev.rs index 6bb0f438b6..b8786beede 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_dev.rs @@ -10,16 +10,16 @@ use artcraft_api_defs::generate::image::text::generate_flux_1_dev_text_to_image: }; #[derive(Debug, Clone)] -pub struct PlanArtcraftFlux1Dev<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftFlux1Dev { + pub prompt: Option, pub aspect_ratio: Option, pub num_images: GenerateFlux1DevTextToImageNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_flux_1_dev<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_flux_1_dev( + request: &GenerateImageRequest, +) -> Result { // Flux 1 Dev is text-to-image only. Abort if image inputs are provided and // the caller has opted into strict mode. if request.image_inputs.is_some() { @@ -37,7 +37,7 @@ pub fn plan_generate_image_artcraft_flux_1_dev<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftFlux1Dev(PlanArtcraftFlux1Dev { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, idempotency_token: request.get_or_generate_idempotency_token(), @@ -147,7 +147,7 @@ mod tests { fn image_inputs_with_abort_returns_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::AbortGeneration), ..base_flux_1_dev_image_request() }; @@ -162,7 +162,7 @@ mod tests { fn image_inputs_with_generate_anyway_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::GenerateAnyway), ..base_flux_1_dev_image_request() }; @@ -173,7 +173,7 @@ mod tests { fn image_inputs_with_none_strategy_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: None, ..base_flux_1_dev_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_schnell.rs index c0a2bf4451..f6cc71cd98 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_1_schnell.rs @@ -10,16 +10,16 @@ use artcraft_api_defs::generate::image::text::generate_flux_1_schnell_text_to_im }; #[derive(Debug, Clone)] -pub struct PlanArtcraftFlux1Schnell<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftFlux1Schnell { + pub prompt: Option, pub aspect_ratio: Option, pub num_images: GenerateFlux1SchnellTextToImageNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_flux_1_schnell<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_flux_1_schnell( + request: &GenerateImageRequest, +) -> Result { // Flux 1 Schnell is text-to-image only. Abort if image inputs are provided and // the caller has opted into strict mode. if request.image_inputs.is_some() { @@ -37,7 +37,7 @@ pub fn plan_generate_image_artcraft_flux_1_schnell<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftFlux1Schnell(PlanArtcraftFlux1Schnell { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, idempotency_token: request.get_or_generate_idempotency_token(), @@ -147,7 +147,7 @@ mod tests { fn image_inputs_with_abort_returns_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::AbortGeneration), ..base_flux_1_schnell_image_request() }; @@ -162,7 +162,7 @@ mod tests { fn image_inputs_with_generate_anyway_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::GenerateAnyway), ..base_flux_1_schnell_image_request() }; @@ -173,7 +173,7 @@ mod tests { fn image_inputs_with_none_strategy_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: None, ..base_flux_1_schnell_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_2_lora_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_2_lora_angles.rs index ed3eebc605..599645574f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_2_lora_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_2_lora_angles.rs @@ -12,8 +12,8 @@ use artcraft_api_defs::generate::image::angle::flux_2_lora_edit_image_angle::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftFlux2LoraAngles<'a> { - pub image_input: &'a MediaFileToken, +pub struct PlanArtcraftFlux2LoraAngles { + pub image_input: MediaFileToken, pub horizontal_angle: Option, pub vertical_angle: Option, pub zoom: Option, @@ -22,13 +22,13 @@ pub struct PlanArtcraftFlux2LoraAngles<'a> { pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_flux_2_lora_angles<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_flux_2_lora_angles( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; // Angle models require exactly one input image. - let image_input = resolve_single_image_input(request.image_inputs)?; + let image_input = resolve_single_image_input(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; @@ -43,9 +43,9 @@ pub fn plan_generate_image_artcraft_flux_2_lora_angles<'a>( })) } -fn resolve_single_image_input<'a>( - image_list_ref: Option>, -) -> Result<&'a MediaFileToken, ArtcraftRouterError> { +fn resolve_single_image_input( + image_list_ref: Option, +) -> Result { match image_list_ref { None => { Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { @@ -60,7 +60,7 @@ fn resolve_single_image_input<'a>( value: format!("Angle models require exactly one input image, got {}", tokens.len()), })); } - Ok(&tokens[0]) + Ok(tokens.into_iter().next().unwrap()) } Some(ImageListRef::Urls(_)) => { Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -165,7 +165,7 @@ mod tests { fn rejects_urls() { let urls = vec!["https://example.com/img.png".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_flux_2_lora_angles_image_request() }; let result = request.build(); @@ -176,7 +176,7 @@ mod tests { fn accepts_single_media_token() { let tokens = vec![make_token()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let result = request.build(); @@ -187,7 +187,7 @@ mod tests { fn rejects_multiple_media_tokens() { let tokens = vec![make_token(), make_token()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let result = request.build(); @@ -199,7 +199,7 @@ mod tests { let tokens = vec![make_token()]; let request = GenerateImageRequest { aspect_ratio: None, - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let ImageGenerationPlan::ArtcraftFlux2LoraAngles(plan) = request.build().unwrap() else { panic!("expected ArtcraftFlux2LoraAngles") }; @@ -211,7 +211,7 @@ mod tests { let tokens = vec![make_token()]; let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::Square), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let ImageGenerationPlan::ArtcraftFlux2LoraAngles(plan) = request.build().unwrap() else { panic!("expected ArtcraftFlux2LoraAngles") }; @@ -226,7 +226,7 @@ mod tests { let request = GenerateImageRequest { quality: None, image_batch_count: Some(count), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let ImageGenerationPlan::ArtcraftFlux2LoraAngles(plan) = request.build().unwrap() else { panic!("expected ArtcraftFlux2LoraAngles") }; @@ -244,7 +244,7 @@ mod tests { horizontal_angle: Some(45.0), vertical_angle: Some(-30.0), zoom: Some(1.5), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_flux_2_lora_angles_image_request() }; let ImageGenerationPlan::ArtcraftFlux2LoraAngles(plan) = request.build().unwrap() else { panic!("expected ArtcraftFlux2LoraAngles") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1.rs index a978a8ef0a..9db51291ed 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1.rs @@ -10,16 +10,16 @@ use artcraft_api_defs::generate::image::text::generate_flux_pro_11_text_to_image }; #[derive(Debug, Clone)] -pub struct PlanArtcraftFluxPro11<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftFluxPro11 { + pub prompt: Option, pub aspect_ratio: Option, pub num_images: GenerateFluxPro11TextToImageNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_flux_pro_1p1<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_flux_pro_1p1( + request: &GenerateImageRequest, +) -> Result { // Flux Pro 1.1 is text-to-image only. Abort if image inputs are provided and // the caller has opted into strict mode. if request.image_inputs.is_some() { @@ -37,7 +37,7 @@ pub fn plan_generate_image_artcraft_flux_pro_1p1<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftFluxPro11(PlanArtcraftFluxPro11 { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, idempotency_token: request.get_or_generate_idempotency_token(), @@ -147,7 +147,7 @@ mod tests { fn image_inputs_with_abort_returns_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::AbortGeneration), ..base_flux_pro_1p1_image_request() }; @@ -162,7 +162,7 @@ mod tests { fn image_inputs_with_generate_anyway_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::GenerateAnyway), ..base_flux_pro_1p1_image_request() }; @@ -173,7 +173,7 @@ mod tests { fn image_inputs_with_none_strategy_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: None, ..base_flux_pro_1p1_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1_ultra.rs index c42984bb63..4d410ecda5 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_flux_pro_1p1_ultra.rs @@ -10,16 +10,16 @@ use artcraft_api_defs::generate::image::text::generate_flux_pro_11_ultra_text_to }; #[derive(Debug, Clone)] -pub struct PlanArtcraftFluxPro11Ultra<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftFluxPro11Ultra { + pub prompt: Option, pub aspect_ratio: Option, pub num_images: GenerateFluxPro11UltraTextToImageNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_flux_pro_1p1_ultra<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_flux_pro_1p1_ultra( + request: &GenerateImageRequest, +) -> Result { // Flux Pro 1.1 Ultra is text-to-image only. Abort if image inputs are provided and // the caller has opted into strict mode. if request.image_inputs.is_some() { @@ -37,7 +37,7 @@ pub fn plan_generate_image_artcraft_flux_pro_1p1_ultra<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftFluxPro11Ultra(PlanArtcraftFluxPro11Ultra { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, idempotency_token: request.get_or_generate_idempotency_token(), @@ -150,7 +150,7 @@ mod tests { fn image_inputs_with_abort_returns_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::AbortGeneration), ..base_flux_pro_1p1_ultra_image_request() }; @@ -165,7 +165,7 @@ mod tests { fn image_inputs_with_generate_anyway_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: Some(GenerationModeMismatchStrategy::GenerateAnyway), ..base_flux_pro_1p1_ultra_image_request() }; @@ -176,7 +176,7 @@ mod tests { fn image_inputs_with_none_strategy_succeeds() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), generation_mode_mismatch_strategy: None, ..base_flux_pro_1p1_ultra_image_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1.rs index 75c18d0cb6..edf27a776c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1.rs @@ -43,10 +43,10 @@ pub enum ArtcraftGptImage1NumImages { } #[derive(Debug, Clone)] -pub struct PlanArtcraftGptImage1<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftGptImage1 { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, /// Number of input images (0 for text-to-image). This is counted from either /// media tokens or hydrated URLs, so the cost estimator can use it without /// needing to inspect image_inputs (which is None for URL-form inputs). @@ -59,19 +59,19 @@ pub struct PlanArtcraftGptImage1<'a> { pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_gpt_image_1<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_gpt_image_1( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_inputs = resolve_image_list_ref(request.image_inputs)?; - let num_input_images = count_input_images(request.image_inputs); + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; + let num_input_images = count_input_images(request.image_inputs.clone()); let image_size = plan_image_size(request.aspect_ratio); let quality = plan_quality(request.quality); let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftGptImage1(PlanArtcraftGptImage1 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, num_input_images, image_size, @@ -81,9 +81,9 @@ pub fn plan_generate_image_artcraft_gpt_image_1<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -95,7 +95,7 @@ fn resolve_image_list_ref<'a>( } } -fn count_input_images(image_inputs: Option>) -> u64 { +fn count_input_images(image_inputs: Option) -> u64 { match image_inputs { None => 0, Some(ImageListRef::MediaFileTokens(tokens)) => tokens.len() as u64, @@ -435,7 +435,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_gpt_image_1_image_request() }; let ImageGenerationPlan::ArtcraftGptImage1(plan) = request.build().unwrap() else { @@ -451,7 +451,7 @@ mod tests { // cost only depends on quality + size + num_images. let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_gpt_image_1_image_request() }; let ImageGenerationPlan::ArtcraftGptImage1(plan) = request.build().unwrap() else { @@ -474,7 +474,7 @@ mod tests { #[test] fn idempotency_token_passthrough() { let token = "11111111-1111-1111-1111-111111111111"; - let request = GenerateImageRequest { idempotency_token: Some(token), ..base_gpt_image_1_image_request() }; + let request = GenerateImageRequest { idempotency_token: Some(token.to_string()), ..base_gpt_image_1_image_request() }; let ImageGenerationPlan::ArtcraftGptImage1(plan) = request.build().unwrap() else { panic!("expected ArtcraftGptImage1") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1p5.rs index 9a0b69a946..7e1318ac4d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_gpt_image_1p5.rs @@ -13,10 +13,10 @@ use artcraft_api_defs::generate::image::multi_function::gpt_image_1p5_multi_func use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftGptImage1p5<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftGptImage1p5 { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub image_size: Option, /// Quality defaults to Medium when not specified in the request. pub quality: GptImage1p5MultiFunctionImageGenQuality, @@ -24,18 +24,18 @@ pub struct PlanArtcraftGptImage1p5<'a> { pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_gpt_image_1p5<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_gpt_image_1p5( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, strategy)?; let quality = plan_quality(request.quality); let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftGptImage1p5(PlanArtcraftGptImage1p5 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, image_size, quality, @@ -44,9 +44,9 @@ pub fn plan_generate_image_artcraft_gpt_image_1p5<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -293,7 +293,7 @@ mod tests { fn url_image_inputs_are_accepted_for_cost_path() { let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_gpt_image_1p5_image_request() }; let ImageGenerationPlan::ArtcraftGptImage1p5(plan) = request.build().unwrap() else { @@ -313,7 +313,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_gpt_image_1p5_image_request() }; let ImageGenerationPlan::ArtcraftGptImage1p5(plan) = request.build().unwrap() else { panic!("expected ArtcraftGptImage1p5") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana.rs index a14f409135..49089cef7e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana.rs @@ -11,27 +11,27 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_multi_functi use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftNanaBanana<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftNanaBanana { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub aspect_ratio: Option, pub num_images: NanoBananaMultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_nano_banana<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_nano_banana( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftNanaBanana(PlanArtcraftNanaBanana { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, aspect_ratio, num_images, @@ -39,9 +39,9 @@ pub fn plan_generate_image_artcraft_nano_banana<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -222,7 +222,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(auto_ar), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_nano_banana_image_request() }; let ImageGenerationPlan::ArtcraftNanaBanana(plan) = request.build().unwrap() else { panic!("expected ArtcraftNanaBanana") }; @@ -369,7 +369,7 @@ mod tests { // cost only depends on num_images + is_edit_mode. let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_nano_banana_image_request() }; let ImageGenerationPlan::ArtcraftNanaBanana(plan) = request.build().unwrap() else { @@ -391,7 +391,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_nano_banana_image_request() }; let ImageGenerationPlan::ArtcraftNanaBanana(plan) = request.build().unwrap() else { panic!("expected ArtcraftNanaBanana") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_2.rs index 5104405125..6db00dfa93 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_2.rs @@ -13,29 +13,29 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_2_multi_func use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftNanaBanana2<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftNanaBanana2 { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub aspect_ratio: Option, pub resolution: Option, pub num_images: NanaBanana2MultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_nano_banana_2<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_nano_banana_2( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftNanaBanana2(PlanArtcraftNanaBanana2 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, aspect_ratio, resolution, @@ -44,9 +44,9 @@ pub fn plan_generate_image_artcraft_nano_banana_2<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -211,7 +211,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(auto_ar), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_nano_banana_2_image_request() }; let ImageGenerationPlan::ArtcraftNanaBanana2(plan) = request.build().unwrap() else { panic!("expected ArtcraftNanaBanana2") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_pro.rs index 5acf1b229d..7452e849f8 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_nano_banana_pro.rs @@ -13,29 +13,29 @@ use artcraft_api_defs::generate::image::multi_function::nano_banana_pro_multi_fu use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftNanaBananaPro<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftNanaBananaPro { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub aspect_ratio: Option, pub resolution: Option, pub num_images: NanoBananaProMultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_nano_banana_pro<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_nano_banana_pro( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftNanaBananaPro(PlanArtcraftNanaBananaPro { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, aspect_ratio, resolution, @@ -44,9 +44,9 @@ pub fn plan_generate_image_artcraft_nano_banana_pro<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -249,7 +249,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(auto_ar), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_image_request() }; let ImageGenerationPlan::ArtcraftNanaBananaPro(plan) = request.build().unwrap() else { panic!("expected ArtcraftNanaBananaPro") }; @@ -432,7 +432,7 @@ mod tests { // cost only depends on num_images + resolution + is_edit_mode. let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_image_request() }; let ImageGenerationPlan::ArtcraftNanaBananaPro(plan) = request.build().unwrap() else { @@ -452,7 +452,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_image_request() }; let ImageGenerationPlan::ArtcraftNanaBananaPro(plan) = request.build().unwrap() else { panic!("expected ArtcraftNanaBananaPro") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_qwen_edit_2511_angles.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_qwen_edit_2511_angles.rs index 4f7933d2ed..d439652f3c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_qwen_edit_2511_angles.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_qwen_edit_2511_angles.rs @@ -12,9 +12,9 @@ use artcraft_api_defs::generate::image::angle::qwen_edit_2511_edit_image_angle:: use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftQwenEdit2511Angles<'a> { - pub prompt: Option<&'a str>, - pub image_input: &'a MediaFileToken, +pub struct PlanArtcraftQwenEdit2511Angles { + pub prompt: Option, + pub image_input: MediaFileToken, pub horizontal_angle: Option, pub vertical_angle: Option, pub zoom: Option, @@ -23,18 +23,18 @@ pub struct PlanArtcraftQwenEdit2511Angles<'a> { pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_qwen_edit_2511_angles<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_qwen_edit_2511_angles( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; // Angle models require exactly one input image. - let image_input = resolve_single_image_input(request.image_inputs)?; + let image_input = resolve_single_image_input(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftQwenEdit2511Angles(PlanArtcraftQwenEdit2511Angles { - prompt: request.prompt, + prompt: request.prompt.clone(), image_input, horizontal_angle: request.horizontal_angle, vertical_angle: request.vertical_angle, @@ -45,9 +45,9 @@ pub fn plan_generate_image_artcraft_qwen_edit_2511_angles<'a>( })) } -fn resolve_single_image_input<'a>( - image_list_ref: Option>, -) -> Result<&'a MediaFileToken, ArtcraftRouterError> { +fn resolve_single_image_input( + image_list_ref: Option, +) -> Result { match image_list_ref { None => { Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { @@ -62,7 +62,7 @@ fn resolve_single_image_input<'a>( value: format!("Angle models require exactly one input image, got {}", tokens.len()), })); } - Ok(&tokens[0]) + Ok(tokens.into_iter().next().unwrap()) } Some(ImageListRef::Urls(_)) => { Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -167,7 +167,7 @@ mod tests { fn rejects_urls() { let urls = vec!["https://example.com/img.png".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_qwen_edit_2511_angles_image_request() }; let result = request.build(); @@ -178,7 +178,7 @@ mod tests { fn accepts_single_media_token() { let tokens = vec![make_token()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let result = request.build(); @@ -189,7 +189,7 @@ mod tests { fn rejects_multiple_media_tokens() { let tokens = vec![make_token(), make_token()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let result = request.build(); @@ -201,7 +201,7 @@ mod tests { let tokens = vec![make_token()]; let request = GenerateImageRequest { aspect_ratio: None, - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let ImageGenerationPlan::ArtcraftQwenEdit2511Angles(plan) = request.build().unwrap() else { panic!("expected ArtcraftQwenEdit2511Angles") }; @@ -213,7 +213,7 @@ mod tests { let tokens = vec![make_token()]; let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::Square), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let ImageGenerationPlan::ArtcraftQwenEdit2511Angles(plan) = request.build().unwrap() else { panic!("expected ArtcraftQwenEdit2511Angles") }; @@ -228,7 +228,7 @@ mod tests { let request = GenerateImageRequest { quality: None, image_batch_count: Some(count), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let ImageGenerationPlan::ArtcraftQwenEdit2511Angles(plan) = request.build().unwrap() else { panic!("expected ArtcraftQwenEdit2511Angles") }; @@ -246,7 +246,7 @@ mod tests { horizontal_angle: Some(45.0), vertical_angle: Some(-30.0), zoom: Some(1.5), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_qwen_edit_2511_angles_image_request() }; let ImageGenerationPlan::ArtcraftQwenEdit2511Angles(plan) = request.build().unwrap() else { panic!("expected ArtcraftQwenEdit2511Angles") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4.rs index ce31274a56..5779a40d7c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4.rs @@ -12,27 +12,27 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4_mu use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedream4<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftSeedream4 { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub image_size: Option, pub num_images: BytedanceSeedreamV4MultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_seedream_4<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_seedream_4( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftSeedream4(PlanArtcraftSeedream4 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, image_size, num_images, @@ -40,9 +40,9 @@ pub fn plan_generate_image_artcraft_seedream_4<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -220,7 +220,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::Auto), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_seedream_4_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4(plan) = request.build().unwrap() else { panic!("expected ArtcraftSeedream4") }; @@ -355,7 +355,7 @@ mod tests { fn url_image_inputs_are_accepted_for_cost_path() { let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_seedream_4_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4(plan) = request.build().unwrap() else { @@ -375,7 +375,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_seedream_4_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4(plan) = request.build().unwrap() else { panic!("expected ArtcraftSeedream4") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4p5.rs index e6b964faa7..2f3873e3b2 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_4p5.rs @@ -12,27 +12,27 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4p5_ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedream4p5<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftSeedream4p5 { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub image_size: Option, pub num_images: BytedanceSeedreamV4p5MultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_seedream_4p5<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_seedream_4p5( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftSeedream4p5(PlanArtcraftSeedream4p5 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, image_size, num_images, @@ -40,9 +40,9 @@ pub fn plan_generate_image_artcraft_seedream_4p5<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -221,7 +221,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::Auto), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_seedream_4p5_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4p5(plan) = request.build().unwrap() else { panic!("expected ArtcraftSeedream4p5") }; @@ -356,7 +356,7 @@ mod tests { fn url_image_inputs_are_accepted_for_cost_path() { let urls = vec!["https://example.com/image.jpg".to_string()]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_seedream_4p5_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4p5(plan) = request.build().unwrap() else { @@ -376,7 +376,7 @@ mod tests { fn media_token_image_inputs_is_edit_mode() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_seedream_4p5_image_request() }; let ImageGenerationPlan::ArtcraftSeedream4p5(plan) = request.build().unwrap() else { panic!("expected ArtcraftSeedream4p5") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_5_lite.rs index ed77a9d4eb..628a21963d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/artcraft/plan_generate_image_artcraft_seedream_5_lite.rs @@ -12,27 +12,27 @@ use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_5_lit use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedream5Lite<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftSeedream5Lite { + pub prompt: Option, /// Input images for image editing. None means text-to-image mode. - pub image_inputs: Option<&'a Vec>, + pub image_inputs: Option>, pub image_size: Option, pub num_images: BytedanceSeedream5LiteMultiFunctionImageGenNumImages, pub idempotency_token: String, } -pub fn plan_generate_image_artcraft_seedream_5_lite<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_artcraft_seedream_5_lite( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_inputs = resolve_image_list_ref(request.image_inputs)?; + let image_inputs = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::ArtcraftSeedream5Lite(PlanArtcraftSeedream5Lite { - prompt: request.prompt, + prompt: request.prompt.clone(), image_inputs, image_size, num_images, @@ -40,9 +40,9 @@ pub fn plan_generate_image_artcraft_seedream_5_lite<'a>( })) } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -167,7 +167,7 @@ mod tests { let tokens = vec![]; let request = GenerateImageRequest { aspect_ratio: Some(CommonAspectRatio::Auto), - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_seedream_5_lite_image_request() }; let ImageGenerationPlan::ArtcraftSeedream5Lite(plan) = request.build().unwrap() else { panic!("expected ArtcraftSeedream5Lite") }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_dev.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_dev.rs index 7c3e0eb35e..4af96681e2 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_dev.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_dev.rs @@ -20,24 +20,24 @@ pub enum FalFlux1DevNumImages { } #[derive(Debug, Clone)] -pub struct PlanFalFlux1Dev<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalFlux1Dev { + pub prompt: Option, /// Image URL for editing. None = text-to-image mode. pub maybe_image_url: Option, pub aspect_ratio: Flux1DevAspectRatio, pub num_images: FalFlux1DevNumImages, } -pub fn plan_generate_image_fal_flux_1_dev<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_flux_1_dev( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let maybe_image_url = resolve_single_image_url(request.image_inputs)?; + let maybe_image_url = resolve_single_image_url(request.image_inputs.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalFlux1Dev(PlanFalFlux1Dev { - prompt: request.prompt, + prompt: request.prompt.clone(), maybe_image_url, aspect_ratio, num_images, @@ -45,7 +45,7 @@ pub fn plan_generate_image_fal_flux_1_dev<'a>( } fn resolve_single_image_url( - image_inputs: Option>, + image_inputs: Option, ) -> Result, ArtcraftRouterError> { match image_inputs { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_schnell.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_schnell.rs index 2ce42f0778..9109d6fc8e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_schnell.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_1_schnell.rs @@ -22,8 +22,8 @@ pub enum FalFlux1SchnellNumImages { } #[derive(Debug, Clone)] -pub struct PlanFalFlux1Schnell<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalFlux1Schnell { + pub prompt: Option, /// Image URL for editing. None = text-to-image mode. pub maybe_image_url: Option, pub t2i_aspect_ratio: Flux1SchnellAspectRatio, @@ -31,17 +31,17 @@ pub struct PlanFalFlux1Schnell<'a> { pub num_images: FalFlux1SchnellNumImages, } -pub fn plan_generate_image_fal_flux_1_schnell<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_flux_1_schnell( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let maybe_image_url = resolve_single_image_url(request.image_inputs)?; + let maybe_image_url = resolve_single_image_url(request.image_inputs.clone())?; let t2i_aspect_ratio = plan_t2i_aspect_ratio(request.aspect_ratio, strategy)?; let edit_image_size = plan_edit_image_size(request.aspect_ratio); let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalFlux1Schnell(PlanFalFlux1Schnell { - prompt: request.prompt, + prompt: request.prompt.clone(), maybe_image_url, t2i_aspect_ratio, edit_image_size, @@ -50,7 +50,7 @@ pub fn plan_generate_image_fal_flux_1_schnell<'a>( } fn resolve_single_image_url( - image_inputs: Option>, + image_inputs: Option, ) -> Result, ArtcraftRouterError> { match image_inputs { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1.rs index 13a5aedf7a..01425e0cb0 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1.rs @@ -17,15 +17,15 @@ pub enum FalFluxPro11NumImages { } #[derive(Debug, Clone)] -pub struct PlanFalFluxPro11<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalFluxPro11 { + pub prompt: Option, pub aspect_ratio: FluxPro11AspectRatio, pub num_images: FalFluxPro11NumImages, } -pub fn plan_generate_image_fal_flux_pro_1p1<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_flux_pro_1p1( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.image_inputs.is_some() { @@ -39,7 +39,7 @@ pub fn plan_generate_image_fal_flux_pro_1p1<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalFluxPro11(PlanFalFluxPro11 { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, })) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1_ultra.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1_ultra.rs index d8355de052..02122d8a77 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1_ultra.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_flux_pro_1p1_ultra.rs @@ -17,15 +17,15 @@ pub enum FalFluxPro11UltraNumImages { } #[derive(Debug, Clone)] -pub struct PlanFalFluxPro11Ultra<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalFluxPro11Ultra { + pub prompt: Option, pub aspect_ratio: FluxPro11UltraAspectRatio, pub num_images: FalFluxPro11UltraNumImages, } -pub fn plan_generate_image_fal_flux_pro_1p1_ultra<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_flux_pro_1p1_ultra( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.image_inputs.is_some() { @@ -39,7 +39,7 @@ pub fn plan_generate_image_fal_flux_pro_1p1_ultra<'a>( let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalFluxPro11Ultra(PlanFalFluxPro11Ultra { - prompt: request.prompt, + prompt: request.prompt.clone(), aspect_ratio, num_images, })) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1.rs index 923b07e119..adfd45fc3d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1.rs @@ -40,8 +40,8 @@ pub enum FalGptImage1ImageSize { } #[derive(Debug, Clone)] -pub struct PlanFalGptImage1<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalGptImage1 { + pub prompt: Option, /// Image URLs for editing. Empty vec = text-to-image mode. pub image_urls: Vec, pub image_size: Option, @@ -51,17 +51,17 @@ pub struct PlanFalGptImage1<'a> { pub num_images: FalGptImage1NumImages, } -pub fn plan_generate_image_fal_gpt_image_1<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_gpt_image_1( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio); let quality = plan_quality(request.quality); let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalGptImage1(PlanFalGptImage1 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, image_size, quality, @@ -70,7 +70,7 @@ pub fn plan_generate_image_fal_gpt_image_1<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), @@ -219,11 +219,11 @@ mod tests { use crate::api::common_image_model::CommonImageModel; use crate::api::provider::Provider; - fn base_fal_request() -> GenerateImageRequest<'static> { + fn base_fal_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::GptImage1, provider: Provider::Fal, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -238,7 +238,7 @@ mod tests { } } - fn build_plan<'a>(request: &'a GenerateImageRequest<'a>) -> PlanFalGptImage1<'a> { + fn build_plan(request: &GenerateImageRequest) -> PlanFalGptImage1 { let ImageGenerationPlan::FalGptImage1(plan) = plan_generate_image_fal_gpt_image_1(request).expect("plan should succeed") else { @@ -263,7 +263,7 @@ mod tests { "https://example.com/b.jpg".to_string(), ]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_fal_request() }; let plan = build_plan(&request); @@ -274,7 +274,7 @@ mod tests { fn media_token_inputs_return_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_fal_request() }; let result = plan_generate_image_fal_gpt_image_1(&request); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1p5.rs index dda015a098..912f35e7b8 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_gpt_image_1p5.rs @@ -40,25 +40,25 @@ pub enum FalGptImage1p5ImageSize { } #[derive(Debug, Clone)] -pub struct PlanFalGptImage1p5<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalGptImage1p5 { + pub prompt: Option, pub image_urls: Vec, pub image_size: Option, pub quality: FalGptImage1p5Quality, pub num_images: FalGptImage1p5NumImages, } -pub fn plan_generate_image_fal_gpt_image_1p5<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_gpt_image_1p5( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio); let quality = plan_quality(request.quality); let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalGptImage1p5(PlanFalGptImage1p5 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, image_size, quality, @@ -67,7 +67,7 @@ pub fn plan_generate_image_fal_gpt_image_1p5<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana.rs index e442556862..31c1f75fb6 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana.rs @@ -18,8 +18,8 @@ pub enum FalNbNumImages { } #[derive(Debug, Clone)] -pub struct PlanFalNanoBanana<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalNanoBanana { + pub prompt: Option, /// Image URLs for editing. Empty vec = text-to-image mode. pub image_urls: Vec, /// Pre-resolved aspect ratio for text-to-image mode. @@ -30,18 +30,18 @@ pub struct PlanFalNanoBanana<'a> { pub num_images: FalNbNumImages, } -pub fn plan_generate_image_fal_nano_banana<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_nano_banana( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let t2i_aspect_ratio = plan_t2i_aspect_ratio(request.aspect_ratio, strategy)?; let edit_aspect_ratio = plan_edit_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalNanoBanana(PlanFalNanoBanana { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, t2i_aspect_ratio, edit_aspect_ratio, @@ -50,7 +50,7 @@ pub fn plan_generate_image_fal_nano_banana<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_2.rs index 4f541661e4..940c6f132a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_2.rs @@ -28,8 +28,8 @@ pub enum FalNb2NumImages { } #[derive(Debug, Clone)] -pub struct PlanFalNanaBanana2<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalNanaBanana2 { + pub prompt: Option, /// Image URLs for editing. Empty vec = text-to-image mode. pub image_urls: Vec, /// Pre-resolved aspect ratio for text-to-image mode. @@ -42,19 +42,19 @@ pub struct PlanFalNanaBanana2<'a> { pub num_images: FalNb2NumImages, } -pub fn plan_generate_image_fal_nano_banana_2<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_nano_banana_2( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let t2i_aspect_ratio = plan_t2i_aspect_ratio(request.aspect_ratio, strategy)?; let edit_aspect_ratio = plan_edit_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let resolution = plan_resolution(request.resolution)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalNanaBanana2(PlanFalNanaBanana2 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, t2i_aspect_ratio, edit_aspect_ratio, @@ -64,7 +64,7 @@ pub fn plan_generate_image_fal_nano_banana_2<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_pro.rs index 989932314b..d133f0ed71 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_nano_banana_pro.rs @@ -29,8 +29,8 @@ pub enum FalNbpNumImages { } #[derive(Debug, Clone)] -pub struct PlanFalNanaBananaPro<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalNanaBananaPro { + pub prompt: Option, /// Image URLs for editing. Empty vec = text-to-image mode. pub image_urls: Vec, /// Pre-resolved aspect ratio for text-to-image mode. @@ -43,19 +43,19 @@ pub struct PlanFalNanaBananaPro<'a> { pub num_images: FalNbpNumImages, } -pub fn plan_generate_image_fal_nano_banana_pro<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_nano_banana_pro( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let t2i_aspect_ratio = plan_t2i_aspect_ratio(request.aspect_ratio, strategy)?; let edit_aspect_ratio = plan_edit_aspect_ratio(request.aspect_ratio, is_edit_mode, strategy)?; let resolution = plan_resolution(request.resolution)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalNanaBananaPro(PlanFalNanaBananaPro { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, t2i_aspect_ratio, edit_aspect_ratio, @@ -65,7 +65,7 @@ pub fn plan_generate_image_fal_nano_banana_pro<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), @@ -248,11 +248,11 @@ mod tests { use fal_client::requests::webhook::image::edit::enqueue_nano_banana_pro_edit_image_webhook::EnqueueNanoBananaProEditImageAspectRatio as EditAr; use fal_client::requests::webhook::image::text::enqueue_nano_banana_pro_text_to_image_webhook::EnqueueNanoBananaProTextToImageAspectRatio as T2iAr; - fn base_fal_request() -> GenerateImageRequest<'static> { + fn base_fal_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::NanoBananaPro, provider: Provider::Fal, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -267,9 +267,9 @@ mod tests { } } - fn build_plan<'a>( - request: &'a GenerateImageRequest<'a>, - ) -> PlanFalNanaBananaPro<'a> { + fn build_plan( + request: &GenerateImageRequest, + ) -> PlanFalNanaBananaPro { let ImageGenerationPlan::FalNanaBananaPro(plan) = plan_generate_image_fal_nano_banana_pro(request).expect("plan should succeed") else { panic!("expected FalNanaBananaPro variant") }; @@ -292,7 +292,7 @@ mod tests { "https://example.com/b.jpg".to_string(), ]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_fal_request() }; let plan = build_plan(&request); @@ -303,7 +303,7 @@ mod tests { fn media_token_inputs_return_error() { let tokens = vec![]; let request = GenerateImageRequest { - image_inputs: Some(ImageListRef::MediaFileTokens(&tokens)), + image_inputs: Some(ImageListRef::MediaFileTokens(tokens.clone())), ..base_fal_request() }; let result = plan_generate_image_fal_nano_banana_pro(&request); @@ -406,7 +406,7 @@ mod tests { for auto_ar in [CommonAspectRatio::Auto, CommonAspectRatio::Auto2k, CommonAspectRatio::Auto4k] { let request = GenerateImageRequest { aspect_ratio: Some(auto_ar), - image_inputs: Some(ImageListRef::Urls(&urls)), + image_inputs: Some(ImageListRef::Urls(urls.clone())), ..base_fal_request() }; let plan = build_plan(&request); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4.rs index b5bfc20b9a..1e5c916101 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4.rs @@ -35,25 +35,25 @@ pub enum FalSeedream4ImageSize { } #[derive(Debug, Clone)] -pub struct PlanFalSeedream4<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalSeedream4 { + pub prompt: Option, /// Image URLs for editing. Empty vec = text-to-image mode. pub image_urls: Vec, pub image_size: Option, pub num_images: FalSeedream4NumImages, } -pub fn plan_generate_image_fal_seedream_4<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_seedream_4( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let is_edit_mode = request.image_inputs.is_some(); - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, is_edit_mode, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalSeedream4(PlanFalSeedream4 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, image_size, num_images, @@ -61,7 +61,7 @@ pub fn plan_generate_image_fal_seedream_4<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4p5.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4p5.rs index 8f143956b8..56f3e41000 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4p5.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_4p5.rs @@ -34,23 +34,23 @@ pub enum FalSeedream4p5ImageSize { } #[derive(Debug, Clone)] -pub struct PlanFalSeedream4p5<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalSeedream4p5 { + pub prompt: Option, pub image_urls: Vec, pub image_size: Option, pub num_images: FalSeedream4p5NumImages, } -pub fn plan_generate_image_fal_seedream_4p5<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_seedream_4p5( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalSeedream4p5(PlanFalSeedream4p5 { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, image_size, num_images, @@ -58,7 +58,7 @@ pub fn plan_generate_image_fal_seedream_4p5<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_5_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_5_lite.rs index 897b27dc45..1cd648c3fb 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_5_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/plan/fal/plan_generate_image_fal_seedream_5_lite.rs @@ -35,23 +35,23 @@ pub enum FalSeedream5LiteImageSize { } #[derive(Debug, Clone)] -pub struct PlanFalSeedream5Lite<'a> { - pub prompt: Option<&'a str>, +pub struct PlanFalSeedream5Lite { + pub prompt: Option, pub image_urls: Vec, pub image_size: Option, pub num_images: FalSeedream5LiteNumImages, } -pub fn plan_generate_image_fal_seedream_5_lite<'a>( - request: &'a GenerateImageRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_image_fal_seedream_5_lite( + request: &GenerateImageRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_urls = resolve_image_list_ref(request.image_inputs)?; + let image_urls = resolve_image_list_ref(request.image_inputs.clone())?; let image_size = plan_image_size(request.aspect_ratio, request.resolution, strategy)?; let num_images = plan_num_images(request.image_batch_count, strategy)?; Ok(ImageGenerationPlan::FalSeedream5Lite(PlanFalSeedream5Lite { - prompt: request.prompt, + prompt: request.prompt.clone(), image_urls, image_size, num_images, @@ -59,7 +59,7 @@ pub fn plan_generate_image_fal_seedream_5_lite<'a>( } fn resolve_image_list_ref( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(vec![]), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_mini.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_mini.rs index 245c379d70..e218a790fd 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_mini.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_mini.rs @@ -4,7 +4,7 @@ use worldlabs_api_client::api::api_types::world_labs_model::WorldLabsModel; use worldlabs_api_client::pricing::check_pricing::{calculate_cost, InputType}; pub(crate) fn estimate_splat_cost_artcraft_marble_0p1_mini( - plan: &PlanArtcraftMarble0p1Mini<'_>, + plan: &PlanArtcraftMarble0p1Mini, ) -> SplatGenerationCostEstimate { let input_type = if plan.reference_image.is_some() { InputType::ImageNonPanorama @@ -33,11 +33,11 @@ mod tests { use tokens::tokens::media_files::MediaFileToken; - fn estimate_usd_cents(prompt: Option<&str>, image_tokens: Option<&Vec>) -> u64 { + fn estimate_usd_cents(prompt: Option<&str>, image_tokens: Option>) -> u64 { let request = GenerateSplatRequest { model: CommonSplatModel::Marble0p1Mini, provider: Provider::Artcraft, - prompt, + prompt: prompt.map(|s| s.to_string()), reference_images: image_tokens.map(crate::api::image_list_ref::ImageListRef::MediaFileTokens), idempotency_token: None, }; @@ -63,14 +63,14 @@ mod tests { #[test] fn test_estimate_cost_image() { let tokens = vec![MediaFileToken("test_token".to_string())]; - let cost = estimate_usd_cents(None, Some(&tokens)); + let cost = estimate_usd_cents(None, Some(tokens.clone())); assert_eq!(cost, 18); // 230 credits → 18 cents (same as text for mini) } #[test] fn test_estimate_cost_image_with_prompt() { let tokens = vec![MediaFileToken("test_token".to_string())]; - let cost = estimate_usd_cents(Some("a cozy room"), Some(&tokens)); + let cost = estimate_usd_cents(Some("a cozy room"), Some(tokens.clone())); assert_eq!(cost, 18); // 230 credits → 18 cents } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_plus.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_plus.rs index a33e8c932a..783a4115ee 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_plus.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/cost/artcraft/estimate_splat_cost_artcraft_marble_0p1_plus.rs @@ -4,7 +4,7 @@ use worldlabs_api_client::api::api_types::world_labs_model::WorldLabsModel; use worldlabs_api_client::pricing::check_pricing::{calculate_cost, InputType}; pub(crate) fn estimate_splat_cost_artcraft_marble_0p1_plus( - plan: &PlanArtcraftMarble0p1Plus<'_>, + plan: &PlanArtcraftMarble0p1Plus, ) -> SplatGenerationCostEstimate { let input_type = if plan.reference_image.is_some() { InputType::ImageNonPanorama @@ -33,11 +33,11 @@ mod tests { use tokens::tokens::media_files::MediaFileToken; - fn estimate_usd_cents(prompt: Option<&str>, image_tokens: Option<&Vec>) -> u64 { + fn estimate_usd_cents(prompt: Option<&str>, image_tokens: Option>) -> u64 { let request = GenerateSplatRequest { model: CommonSplatModel::Marble0p1Plus, provider: Provider::Artcraft, - prompt, + prompt: prompt.map(|s| s.to_string()), reference_images: image_tokens.map(crate::api::image_list_ref::ImageListRef::MediaFileTokens), idempotency_token: None, }; @@ -63,14 +63,14 @@ mod tests { #[test] fn test_estimate_cost_image() { let tokens = vec![MediaFileToken("test_token".to_string())]; - let cost = estimate_usd_cents(None, Some(&tokens)); + let cost = estimate_usd_cents(None, Some(tokens.clone())); assert_eq!(cost, 126); // 1580 credits → 126 cents (same as text for plus) } #[test] fn test_estimate_cost_image_with_prompt() { let tokens = vec![MediaFileToken("test_token".to_string())]; - let cost = estimate_usd_cents(Some("a cozy room"), Some(&tokens)); + let cost = estimate_usd_cents(Some("a cozy room"), Some(tokens.clone())); assert_eq!(cost, 126); // 1580 credits → 126 cents } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_mini.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_mini.rs index 5574c505c7..20b0660f24 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_mini.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_mini.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::splat::generate_worldlabs_marble_0p1_mini_splat use artcraft_client::endpoints::generate::splat::generate_worldlabs_marble_0p1_mini_splat::generate_worldlabs_marble_0p1_mini_splat; pub async fn execute_artcraft_marble_0p1_mini( - plan: &PlanArtcraftMarble0p1Mini<'_>, + plan: &PlanArtcraftMarble0p1Mini, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateWorldlabsMarble0p1MiniSplatRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - image_media_file_token: plan.reference_image.cloned(), - prompt: plan.prompt.map(|p| p.to_string()), + image_media_file_token: plan.reference_image.clone(), + prompt: plan.prompt.clone(), }; let response = generate_worldlabs_marble_0p1_mini_splat( diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_plus.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_plus.rs index fa325f7b76..136a180b37 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_plus.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/execute/artcraft/generate_splat_artcraft_marble_0p1_plus.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::splat::generate_worldlabs_marble_0p1_plus_splat use artcraft_client::endpoints::generate::splat::generate_worldlabs_marble_0p1_plus_splat::generate_worldlabs_marble_0p1_plus_splat; pub async fn execute_artcraft_marble_0p1_plus( - plan: &PlanArtcraftMarble0p1Plus<'_>, + plan: &PlanArtcraftMarble0p1Plus, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateWorldlabsMarble0p1PlusSplatRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - image_media_file_token: plan.reference_image.cloned(), - prompt: plan.prompt.map(|p| p.to_string()), + image_media_file_token: plan.reference_image.clone(), + prompt: plan.prompt.clone(), }; let response = generate_worldlabs_marble_0p1_plus_splat( diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/generate_splat_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/generate_splat_request.rs index 6f4af2eb07..017c1cbd8d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/generate_splat_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/generate_splat_request.rs @@ -6,7 +6,7 @@ use crate::generate::generate_splat::plan::artcraft::plan_generate_splat_artcraf use crate::generate::generate_splat::plan::artcraft::plan_generate_splat_artcraft_marble_0p1_plus::plan_generate_splat_artcraft_marble_0p1_plus; use crate::generate::generate_splat::splat_generation_plan::SplatGenerationPlan; -pub struct GenerateSplatRequest<'a> { +pub struct GenerateSplatRequest { /// Which model to use. pub model: CommonSplatModel, @@ -14,40 +14,40 @@ pub struct GenerateSplatRequest<'a> { pub provider: Provider, /// The prompt for splat generation (optional). - pub prompt: Option<&'a str>, + pub prompt: Option, /// Reference images (optional). - pub reference_images: Option>, + pub reference_images: Option, /// Some providers support idempotency. /// If not supplied, we'll generate one for the required providers. - pub idempotency_token: Option<&'a str>, + pub idempotency_token: Option, } -impl<'a> GenerateSplatRequest<'a> { +impl GenerateSplatRequest { /// Read the splat generation request, construct a plan, then yield a means to execute it. - pub fn build(&self) -> Result, ArtcraftRouterError> { + pub fn build(&self) -> Result { match self.provider { Provider::Artcraft => self.build_artcraft(), _ => self.unsupported_provider(), } } - fn build_artcraft(&self) -> Result, ArtcraftRouterError> { + fn build_artcraft(&self) -> Result { match self.model { CommonSplatModel::Marble0p1Mini => plan_generate_splat_artcraft_marble_0p1_mini(self), CommonSplatModel::Marble0p1Plus => plan_generate_splat_artcraft_marble_0p1_plus(self), } } - fn unsupported_provider(&self) -> Result, ArtcraftRouterError> { + fn unsupported_provider(&self) -> Result { Err(ArtcraftRouterError::UnsupportedModel( format!("Splat generation for model `{:?}` is not supported for provider {:?}", self.model, self.provider) )) } pub fn get_or_generate_idempotency_token(&self) -> String { - self.idempotency_token.map(|t| t.to_string()) + self.idempotency_token.clone() .unwrap_or_else(|| uuid::Uuid::new_v4().to_string()) } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_mini.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_mini.rs index 3dafdda67c..c51e580435 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_mini.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_mini.rs @@ -6,31 +6,31 @@ use crate::generate::generate_splat::splat_generation_plan::SplatGenerationPlan; use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftMarble0p1Mini<'a> { - pub prompt: Option<&'a str>, - pub reference_image: Option<&'a MediaFileToken>, +pub struct PlanArtcraftMarble0p1Mini { + pub prompt: Option, + pub reference_image: Option, pub idempotency_token: String, } -pub fn plan_generate_splat_artcraft_marble_0p1_mini<'a>( - request: &'a GenerateSplatRequest<'a>, -) -> Result, ArtcraftRouterError> { - let reference_image = resolve_single_image_ref(request.reference_images)?; +pub fn plan_generate_splat_artcraft_marble_0p1_mini( + request: &GenerateSplatRequest, +) -> Result { + let reference_image = resolve_single_image_ref(request.reference_images.clone())?; Ok(SplatGenerationPlan::ArtcraftMarble0p1Mini(PlanArtcraftMarble0p1Mini { - prompt: request.prompt, + prompt: request.prompt.clone(), reference_image, idempotency_token: request.get_or_generate_idempotency_token(), })) } -fn resolve_single_image_ref<'a>( - image_list_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_single_image_ref( + image_list_ref: Option, +) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => { - Ok(tokens.first()) + Ok(tokens.into_iter().next()) } Some(ImageListRef::Urls(_)) => { Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_plus.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_plus.rs index 1a0b227dfc..d2ed3c3cbc 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_plus.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/plan/artcraft/plan_generate_splat_artcraft_marble_0p1_plus.rs @@ -6,31 +6,31 @@ use crate::generate::generate_splat::splat_generation_plan::SplatGenerationPlan; use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftMarble0p1Plus<'a> { - pub prompt: Option<&'a str>, - pub reference_image: Option<&'a MediaFileToken>, +pub struct PlanArtcraftMarble0p1Plus { + pub prompt: Option, + pub reference_image: Option, pub idempotency_token: String, } -pub fn plan_generate_splat_artcraft_marble_0p1_plus<'a>( - request: &'a GenerateSplatRequest<'a>, -) -> Result, ArtcraftRouterError> { - let reference_image = resolve_single_image_ref(request.reference_images)?; +pub fn plan_generate_splat_artcraft_marble_0p1_plus( + request: &GenerateSplatRequest, +) -> Result { + let reference_image = resolve_single_image_ref(request.reference_images.clone())?; Ok(SplatGenerationPlan::ArtcraftMarble0p1Plus(PlanArtcraftMarble0p1Plus { - prompt: request.prompt, + prompt: request.prompt.clone(), reference_image, idempotency_token: request.get_or_generate_idempotency_token(), })) } -fn resolve_single_image_ref<'a>( - image_list_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_single_image_ref( + image_list_ref: Option, +) -> Result, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => { - Ok(tokens.first()) + Ok(tokens.into_iter().next()) } Some(ImageListRef::Urls(_)) => { Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/splat_generation_plan.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/splat_generation_plan.rs index c9f2507e74..42c100ae39 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/splat_generation_plan.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_splat/splat_generation_plan.rs @@ -10,12 +10,12 @@ use crate::generate::generate_splat::plan::artcraft::plan_generate_splat_artcraf use crate::generate::generate_splat::splat_generation_cost_estimate::SplatGenerationCostEstimate; #[derive(Debug)] -pub enum SplatGenerationPlan<'a> { - ArtcraftMarble0p1Mini(PlanArtcraftMarble0p1Mini<'a>), - ArtcraftMarble0p1Plus(PlanArtcraftMarble0p1Plus<'a>), +pub enum SplatGenerationPlan { + ArtcraftMarble0p1Mini(PlanArtcraftMarble0p1Mini), + ArtcraftMarble0p1Plus(PlanArtcraftMarble0p1Plus), } -impl<'a> SplatGenerationPlan<'a> { +impl SplatGenerationPlan { pub async fn generate_splat( &self, client: &RouterClient, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_pro.rs index 3fbc8c902d..e313c67e1a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_pro.rs @@ -9,7 +9,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling3p0_pro( - plan: &PlanArtcraftKling3p0Pro<'_>, + plan: &PlanArtcraftKling3p0Pro, ) -> VideoGenerationCostEstimate { let duration = plan.duration .map(|d| match d { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_standard.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_standard.rs index af970efd7b..c5fa6f029b 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_standard.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling3p0_standard.rs @@ -9,7 +9,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling3p0_standard( - plan: &PlanArtcraftKling3p0Standard<'_>, + plan: &PlanArtcraftKling3p0Standard, ) -> VideoGenerationCostEstimate { let duration = plan.duration .map(|d| match d { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_1_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_1_6_pro.rs index 288e42ab41..b572be79a2 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_1_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_1_6_pro.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling_1_6_pro( - plan: &PlanArtcraftKling16Pro<'_>, + plan: &PlanArtcraftKling16Pro, ) -> VideoGenerationCostEstimate { // Mirrors fal_client kling_v1p6_pro: 5s = $0.475 (rounded up to 48¢), 10s = $0.95 (95¢). let cost_in_usd_cents: u64 = if plan.is_ten_seconds() { 95 } else { 48 }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_master.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_master.rs index d2394a7195..2165ce895a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_master.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_master.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling_2_1_master( - plan: &PlanArtcraftKling21Master<'_>, + plan: &PlanArtcraftKling21Master, ) -> VideoGenerationCostEstimate { // Mirrors fal_client kling_v2p1_master: 5s = $1.40, 10s = $2.80. let cost_in_usd_cents: u64 = if plan.is_ten_seconds() { 280 } else { 140 }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_pro.rs index 207a30c985..8ec7f1df32 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_1_pro.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling_2_1_pro( - plan: &PlanArtcraftKling21Pro<'_>, + plan: &PlanArtcraftKling21Pro, ) -> VideoGenerationCostEstimate { // Mirrors fal_client kling_v2p1_pro: 5s = $0.45, 10s = $0.90. let cost_in_usd_cents: u64 = if plan.is_ten_seconds() { 90 } else { 45 }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_5_turbo_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_5_turbo_pro.rs index 459169ce58..f28f091282 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_5_turbo_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_5_turbo_pro.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling_2_5_turbo_pro( - plan: &PlanArtcraftKling2p5TurboPro<'_>, + plan: &PlanArtcraftKling2p5TurboPro, ) -> VideoGenerationCostEstimate { // Mirrors fal_client kling_v2p5_turbo_pro: 5s = $0.35, 10s = $0.70. let cost_in_usd_cents: u64 = if plan.is_ten_seconds() { 70 } else { 35 }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_6_pro.rs index 35575b11aa..4c4d220dbe 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_kling_2_6_pro.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_kling_2_6_pro( - plan: &PlanArtcraftKling2p6Pro<'_>, + plan: &PlanArtcraftKling2p6Pro, ) -> VideoGenerationCostEstimate { // Mirrors fal_client kling_v2p6_pro: // audio off: $0.07/sec → 5s=35¢, 10s=70¢ diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance1p5_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance1p5_pro.rs index fea12432b4..00d67d55e6 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance1p5_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance1p5_pro.rs @@ -10,7 +10,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_seedance1p5_pro( - plan: &PlanArtcraftSeedance1p5Pro<'_>, + plan: &PlanArtcraftSeedance1p5Pro, ) -> VideoGenerationCostEstimate { let duration = plan.duration .map(|d| match d { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs index bb6f64d2c8..a0cb54c236 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs @@ -6,7 +6,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub (crate) fn estimate_video_cost_artcraft_seedance2p0( - plan: &PlanArtcraftSeedance2p0<'_>, + plan: &PlanArtcraftSeedance2p0, ) -> VideoGenerationCostEstimate { let duration_seconds = plan.duration_seconds.unwrap_or(5).clamp(4, 15); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs index 2d7a0ac8f3..9a2df79bcf 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs @@ -6,7 +6,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_seedance2p0_fast( - plan: &PlanArtcraftSeedance2p0<'_>, + plan: &PlanArtcraftSeedance2p0, ) -> VideoGenerationCostEstimate { let duration_seconds = plan.duration_seconds.unwrap_or(5).clamp(4, 15); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance_1_0_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance_1_0_lite.rs index bd31e91d5b..1b23ec8d45 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance_1_0_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance_1_0_lite.rs @@ -9,7 +9,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_seedance_1_0_lite( - plan: &PlanArtcraftSeedance10Lite<'_>, + plan: &PlanArtcraftSeedance10Lite, ) -> VideoGenerationCostEstimate { // Legacy handler defaults: 5 seconds, 720p. Delegate to the Fal client's // cost calculator to guarantee parity with what we actually charge. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2.rs index cae4bf0836..a32bc9fd7c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_sora_2( - plan: &PlanArtcraftSora2<'_>, + plan: &PlanArtcraftSora2, ) -> VideoGenerationCostEstimate { // Sora 2: $0.10/second. Default duration (Fal client): 4 seconds. let cost_in_usd_cents = plan.duration_seconds_for_cost() * 10; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2_pro.rs index 286426d7a3..269ede5b37 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_sora_2_pro.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_sora_2_pro( - plan: &PlanArtcraftSora2Pro<'_>, + plan: &PlanArtcraftSora2Pro, ) -> VideoGenerationCostEstimate { // Sora 2 Pro: $0.30/second @ 720p, $0.50/second @ 1080p. // Default duration 4s. Default resolution: 1080p for text-to-video, 720p (Auto) for image-to-video. diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_2.rs index 3914d7a7d5..23539a6630 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_2.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_veo_2( - plan: &PlanArtcraftVeo2<'_>, + plan: &PlanArtcraftVeo2, ) -> VideoGenerationCostEstimate { // Mirrors fal_client veo_2 cost calculator: 5s = $2.50, +$0.50/s above 5s. let seconds = plan.duration_seconds_for_cost(); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3.rs index 2ccf5ddc0c..a0366b71eb 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_veo_3( - plan: &PlanArtcraftVeo3<'_>, + plan: &PlanArtcraftVeo3, ) -> VideoGenerationCostEstimate { // Mirrors fal_client veo_3 cost calculator (720p/1080p): // $0.20/sec audio off, $0.40/sec audio on. Default 8s, audio off (legacy handler). diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3_fast.rs index 8bff75504d..c1acdfc169 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3_fast.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_veo_3_fast( - plan: &PlanArtcraftVeo3Fast<'_>, + plan: &PlanArtcraftVeo3Fast, ) -> VideoGenerationCostEstimate { // Mirrors fal_client veo_3_fast cost calculator (720p/1080p): // $0.10/sec audio off, $0.15/sec audio on. Default 8s, audio off (legacy handler). diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1.rs index 3f6af12b4c..fa04c300c0 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_veo_3p1( - plan: &PlanArtcraftVeo3p1<'_>, + plan: &PlanArtcraftVeo3p1, ) -> VideoGenerationCostEstimate { // Mirrors fal_client veo_3p1 cost calculator (720p/1080p): // $0.20/sec audio off, $0.40/sec audio on. Default 6s, audio on (legacy handler). diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1_fast.rs index 078d027f6a..6acd3e1b43 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_veo_3p1_fast.rs @@ -2,7 +2,7 @@ use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraf use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; pub(crate) fn estimate_video_cost_artcraft_veo_3p1_fast( - plan: &PlanArtcraftVeo3p1Fast<'_>, + plan: &PlanArtcraftVeo3p1Fast, ) -> VideoGenerationCostEstimate { // Mirrors fal_client veo_3p1_fast cost calculator (720p/1080p): // $0.10/sec audio off, $0.15/sec audio on. Default 6s, audio on (legacy handler). diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_pro.rs index 60bbf906c5..66e3fe3a32 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_pro.rs @@ -9,15 +9,15 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_pro_multi_func use artcraft_client::endpoints::generate::video::multi_function::kling_3p0_pro_multi_function_video_gen::kling_3p0_pro_multi_function_video_gen; pub async fn execute_artcraft_kling3p0_pro( - plan: &PlanArtcraftKling3p0Pro<'_>, + plan: &PlanArtcraftKling3p0Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Kling3p0ProMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|s| s.to_string()), - image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + image_media_token: plan.start_frame.clone(), + end_image_media_token: plan.end_frame.clone(), duration: plan.duration, generate_audio: plan.generate_audio, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_standard.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_standard.rs index fcd5d894ad..28124ce782 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_standard.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling3p0_standard.rs @@ -9,15 +9,15 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_standard_multi use artcraft_client::endpoints::generate::video::multi_function::kling_3p0_standard_multi_function_video_gen::kling_3p0_standard_multi_function_video_gen; pub async fn execute_artcraft_kling3p0_standard( - plan: &PlanArtcraftKling3p0Standard<'_>, + plan: &PlanArtcraftKling3p0Standard, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Kling3p0StandardMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|s| s.to_string()), - image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + image_media_token: plan.start_frame.clone(), + end_image_media_token: plan.end_frame.clone(), duration: plan.duration, generate_audio: plan.generate_audio, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_1_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_1_6_pro.rs index 6b7db0815a..d0cf126250 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_1_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_1_6_pro.rs @@ -9,14 +9,14 @@ use artcraft_api_defs::generate::video::generate_kling_1_6_pro_image_to_video::G use artcraft_client::endpoints::generate::video::generate_kling_16_pro_image_to_video::generate_kling_16_pro_image_to_video; pub async fn execute_artcraft_kling_1_6_pro( - plan: &PlanArtcraftKling16Pro<'_>, + plan: &PlanArtcraftKling16Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateKling16ProImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - media_file_token: Some(plan.start_frame.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + media_file_token: Some(plan.start_frame.clone()), + end_frame_image_media_token: plan.end_frame.clone(), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, duration: plan.duration, }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_master.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_master.rs index f4ab4b03e8..fe055f012c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_master.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_master.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_master_image_to_video use artcraft_client::endpoints::generate::video::generate_kling_21_master_image_to_video::generate_kling_21_master_image_to_video; pub async fn execute_artcraft_kling_2_1_master( - plan: &PlanArtcraftKling21Master<'_>, + plan: &PlanArtcraftKling21Master, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateKling21MasterImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - media_file_token: Some(plan.start_frame.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + media_file_token: Some(plan.start_frame.clone()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, duration: plan.duration, }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_pro.rs index 88ebc1a3bc..9a5086b15a 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_1_pro.rs @@ -9,14 +9,14 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::G use artcraft_client::endpoints::generate::video::generate_kling_21_pro_image_to_video::generate_kling_21_pro_image_to_video; pub async fn execute_artcraft_kling_2_1_pro( - plan: &PlanArtcraftKling21Pro<'_>, + plan: &PlanArtcraftKling21Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateKling21ProImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - media_file_token: Some(plan.start_frame.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + media_file_token: Some(plan.start_frame.clone()), + end_frame_image_media_token: plan.end_frame.clone(), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, duration: plan.duration, }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_5_turbo_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_5_turbo_pro.rs index 5a08c81651..72ce9319fa 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_5_turbo_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_5_turbo_pro.rs @@ -9,15 +9,15 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_5_turbo_multi_fu use artcraft_client::endpoints::generate::video::multi_function::kling_2p5_turbo_pro_multi_function_video_gen::kling_2p5_turbo_pro_multi_function_video_gen; pub async fn execute_artcraft_kling_2_5_turbo_pro( - plan: &PlanArtcraftKling2p5TurboPro<'_>, + plan: &PlanArtcraftKling2p5TurboPro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Kling2p5TurboProMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|p| p.to_string()), - start_frame_image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + start_frame_image_media_token: plan.start_frame.clone(), + end_frame_image_media_token: plan.end_frame.clone(), duration: plan.duration, aspect_ratio: plan.aspect_ratio, }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_6_pro.rs index ac56a6d910..af8174270f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_kling_2_6_pro.rs @@ -9,14 +9,14 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_6_multi_function use artcraft_client::endpoints::generate::video::multi_function::kling_2p6_pro_multi_function_video_gen::kling_2p6_pro_multi_function_video_gen; pub async fn execute_artcraft_kling_2_6_pro( - plan: &PlanArtcraftKling2p6Pro<'_>, + plan: &PlanArtcraftKling2p6Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Kling2p6ProMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|p| p.to_string()), - start_frame_image_media_token: plan.start_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + start_frame_image_media_token: plan.start_frame.clone(), duration: plan.duration, generate_audio: plan.generate_audio, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance1p5_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance1p5_pro.rs index be67049d7c..a166bdf135 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance1p5_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance1p5_pro.rs @@ -9,14 +9,14 @@ use artcraft_api_defs::generate::video::multi_function::seedance_1p5_pro_multi_f use artcraft_client::endpoints::generate::video::multi_function::seedance_1p5_pro_multi_function_video_gen::seedance_1p5_pro_multi_function_video_gen; pub async fn execute_artcraft_seedance1p5_pro( - plan: &PlanArtcraftSeedance1p5Pro<'_>, + plan: &PlanArtcraftSeedance1p5Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Seedance1p5ProMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - start_frame_image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + start_frame_image_media_token: plan.start_frame.clone(), + end_frame_image_media_token: plan.end_frame.clone(), aspect_ratio: plan.aspect_ratio, duration: plan.duration, resolution: plan.resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs index 06d406f5f1..91d116aac7 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs @@ -9,18 +9,18 @@ use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_funct use artcraft_client::endpoints::generate::video::multi_function::seedance_2p0_multi_function_video_gen::seedance_2p0_multi_function_video_gen; pub async fn execute_artcraft_seedance2p0( - plan: &PlanArtcraftSeedance2p0<'_>, + plan: &PlanArtcraftSeedance2p0, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Seedance2p0MultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - start_frame_media_token: plan.start_frame.map(|t| t.to_owned()), - end_frame_media_token: plan.end_frame.map(|t| t.to_owned()), - reference_image_media_tokens: plan.reference_images.map(|tokens| tokens.to_owned()), - reference_video_media_tokens: plan.reference_videos.map(|tokens| tokens.to_owned()), - reference_audio_media_tokens: plan.reference_audio.map(|tokens| tokens.to_owned()), - reference_character_tokens: plan.reference_characters.map(|tokens| tokens.to_owned()), + prompt: plan.prompt.clone(), + start_frame_media_token: plan.start_frame.clone(), + end_frame_media_token: plan.end_frame.clone(), + reference_image_media_tokens: plan.reference_images.clone(), + reference_video_media_tokens: plan.reference_videos.clone(), + reference_audio_media_tokens: plan.reference_audio.clone(), + reference_character_tokens: plan.reference_characters.clone(), aspect_ratio: plan.aspect_ratio, duration_seconds: plan.duration_seconds, batch_count: Some(plan.batch_count), @@ -53,7 +53,7 @@ mod tests { let request = crate::generate::generate_video::generate_video_request::GenerateVideoRequest { aspect_ratio: Some(CommonAspectRatio::WideSixteenByNine), video_batch_count: Some(1), - prompt: Some("a cat walking through a cyberpunk city at night"), + prompt: Some("a cat walking through a cyberpunk city at night".to_string()), ..base_video_request() }; @@ -76,7 +76,7 @@ mod tests { let request = crate::generate::generate_video::generate_video_request::GenerateVideoRequest { aspect_ratio: Some(CommonAspectRatio::Square), video_batch_count: Some(2), - prompt: Some("a dog surfing a wave, cinematic"), + prompt: Some("a dog surfing a wave, cinematic".to_string()), ..base_video_request() }; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0_fast.rs index ccf2d0721e..d074ebf5e7 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0_fast.rs @@ -15,7 +15,7 @@ use enums::common::generation::common_video_model::CommonVideoModel; /// Unlike Seedance 2.0 Pro (which uses the legacy dedicated endpoint), /// Seedance 2.0 Fast routes through the omni-gen unified video endpoint. pub async fn execute_artcraft_seedance2p0_fast( - plan: &PlanArtcraftSeedance2p0<'_>, + plan: &PlanArtcraftSeedance2p0, artcraft_client: &RouterArtcraftClient, ) -> Result { let aspect_ratio = plan.aspect_ratio.map(|ar| match ar { @@ -29,13 +29,13 @@ pub async fn execute_artcraft_seedance2p0_fast( let request = OmniGenVideoCostAndGenerateRequest { idempotency_token: Some(plan.idempotency_token.clone()), model: Some(CommonVideoModel::Seedance2p0Fast), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), negative_prompt: None, - start_frame_image_media_token: plan.start_frame.cloned(), - end_frame_image_media_token: plan.end_frame.cloned(), - reference_image_media_tokens: plan.reference_images.cloned(), - reference_video_media_tokens: plan.reference_videos.cloned(), - reference_audio_media_tokens: plan.reference_audio.cloned(), + start_frame_image_media_token: plan.start_frame.clone(), + end_frame_image_media_token: plan.end_frame.clone(), + reference_image_media_tokens: plan.reference_images.clone(), + reference_video_media_tokens: plan.reference_videos.clone(), + reference_audio_media_tokens: plan.reference_audio.clone(), reference_character_tokens: None, resolution: None, aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance_1_0_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance_1_0_lite.rs index bec4928431..dcebb65b4c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance_1_0_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance_1_0_lite.rs @@ -9,14 +9,14 @@ use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_vide use artcraft_client::endpoints::generate::video::generate_seedance_1_0_lite_image_to_video::generate_seedance_1_0_lite_image_to_video; pub async fn execute_artcraft_seedance_1_0_lite( - plan: &PlanArtcraftSeedance10Lite<'_>, + plan: &PlanArtcraftSeedance10Lite, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateSeedance10LiteImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - media_file_token: Some(plan.start_frame.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + media_file_token: Some(plan.start_frame.clone()), + end_frame_image_media_token: plan.end_frame.clone(), + prompt: plan.prompt.clone(), resolution: plan.resolution, duration: plan.duration, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2.rs index e532e4b859..4eba65fb5d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::video::multi_function::sora_2_multi_function_vi use artcraft_client::endpoints::generate::video::multi_function::sora_2_multi_function_video_gen::sora_2_multi_function_video_gen; pub async fn execute_artcraft_sora_2( - plan: &PlanArtcraftSora2<'_>, + plan: &PlanArtcraftSora2, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Sora2MultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_token: plan.start_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + image_media_token: plan.start_frame.clone(), resolution: plan.resolution, duration: plan.duration, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2_pro.rs index 245953e294..573fc92c92 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_sora_2_pro.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::video::multi_function::sora_2_pro_multi_functio use artcraft_client::endpoints::generate::video::multi_function::sora_2_pro_multi_function_video_gen::sora_2_pro_multi_function_video_gen; pub async fn execute_artcraft_sora_2_pro( - plan: &PlanArtcraftSora2Pro<'_>, + plan: &PlanArtcraftSora2Pro, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Sora2ProMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - image_media_token: plan.start_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + image_media_token: plan.start_frame.clone(), resolution: plan.resolution, duration: plan.duration, aspect_ratio: plan.aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_2.rs index d1daa036a3..0ff5627e6c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_2.rs @@ -12,16 +12,16 @@ use artcraft_client::endpoints::omni_gen::generate::video::omni_gen_video::omni_ use enums::common::generation::common_video_model::CommonVideoModel; pub async fn execute_artcraft_veo_2( - plan: &PlanArtcraftVeo2<'_>, + plan: &PlanArtcraftVeo2, artcraft_client: &RouterArtcraftClient, ) -> Result { - let inference_job_token = match plan.start_frame { + let inference_job_token = match plan.start_frame.clone() { Some(media_file_token) => { // Image-to-video: use the legacy dedicated endpoint. let request = GenerateVeo2ImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), media_file_token: Some(media_file_token.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio.clone(), duration: plan.duration.clone(), }; @@ -41,7 +41,7 @@ pub async fn execute_artcraft_veo_2( let request = OmniGenVideoCostAndGenerateRequest { idempotency_token: Some(plan.idempotency_token.clone()), model: Some(CommonVideoModel::Veo2), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), negative_prompt: None, start_frame_image_media_token: None, end_frame_image_media_token: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3.rs index 062357e007..bd98cf47a9 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3.rs @@ -12,16 +12,16 @@ use artcraft_client::endpoints::omni_gen::generate::video::omni_gen_video::omni_ use enums::common::generation::common_video_model::CommonVideoModel; pub async fn execute_artcraft_veo_3( - plan: &PlanArtcraftVeo3<'_>, + plan: &PlanArtcraftVeo3, artcraft_client: &RouterArtcraftClient, ) -> Result { - let inference_job_token = match plan.start_frame { + let inference_job_token = match plan.start_frame.clone() { Some(media_file_token) => { // Image-to-video: use the legacy dedicated endpoint. let request = GenerateVeo3ImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), media_file_token: Some(media_file_token.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, resolution: plan.resolution, duration: plan.duration, @@ -43,7 +43,7 @@ pub async fn execute_artcraft_veo_3( let request = OmniGenVideoCostAndGenerateRequest { idempotency_token: Some(plan.idempotency_token.clone()), model: Some(CommonVideoModel::Veo3), - prompt: plan.prompt.map(|p| p.to_string()), + prompt: plan.prompt.clone(), negative_prompt: None, start_frame_image_media_token: None, end_frame_image_media_token: None, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3_fast.rs index f0209cdaea..72a9c01a39 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3_fast.rs @@ -9,13 +9,13 @@ use artcraft_api_defs::generate::video::generate_veo_3_fast_image_to_video::Gene use artcraft_client::endpoints::generate::video::generate_veo_3_fast_image_to_video::generate_veo_3_fast_image_to_video; pub async fn execute_artcraft_veo_3_fast( - plan: &PlanArtcraftVeo3Fast<'_>, + plan: &PlanArtcraftVeo3Fast, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = GenerateVeo3FastImageToVideoRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - media_file_token: plan.start_frame.map(|t| t.to_owned()), - prompt: plan.prompt.map(|p| p.to_string()), + media_file_token: plan.start_frame.clone(), + prompt: plan.prompt.clone(), aspect_ratio: plan.aspect_ratio, resolution: plan.resolution, duration: plan.duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1.rs index b5af690256..6e96a4f495 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1.rs @@ -9,15 +9,15 @@ use artcraft_api_defs::generate::video::multi_function::veo_3p1_multi_function_v use artcraft_client::endpoints::generate::video::multi_function::veo_3p1_multi_function_video_gen::veo_3p1_multi_function_video_gen; pub async fn execute_artcraft_veo_3p1( - plan: &PlanArtcraftVeo3p1<'_>, + plan: &PlanArtcraftVeo3p1, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Veo3p1MultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|p| p.to_string()), - start_frame_image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + start_frame_image_media_token: plan.start_frame.clone(), + end_frame_image_media_token: plan.end_frame.clone(), duration: plan.duration, aspect_ratio: plan.aspect_ratio, resolution: plan.resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1_fast.rs index 832ee7ac1b..c8916d6d49 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_veo_3p1_fast.rs @@ -9,15 +9,15 @@ use artcraft_api_defs::generate::video::multi_function::veo_3p1_fast_multi_funct use artcraft_client::endpoints::generate::video::multi_function::veo_3p1_fast_multi_function_video_gen::veo_3p1_fast_multi_function_video_gen; pub async fn execute_artcraft_veo_3p1_fast( - plan: &PlanArtcraftVeo3p1Fast<'_>, + plan: &PlanArtcraftVeo3p1Fast, artcraft_client: &RouterArtcraftClient, ) -> Result { let request = Veo3p1FastMultiFunctionVideoGenRequest { uuid_idempotency_token: plan.idempotency_token.clone(), - prompt: plan.prompt.map(|p| p.to_string()), - negative_prompt: plan.negative_prompt.map(|p| p.to_string()), - start_frame_image_media_token: plan.start_frame.map(|t| t.to_owned()), - end_frame_image_media_token: plan.end_frame.map(|t| t.to_owned()), + prompt: plan.prompt.clone(), + negative_prompt: plan.negative_prompt.clone(), + start_frame_image_media_token: plan.start_frame.clone(), + end_frame_image_media_token: plan.end_frame.clone(), duration: plan.duration, aspect_ratio: plan.aspect_ratio, resolution: plan.resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request.rs index 3acc5f90cb..92acf953f3 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request.rs @@ -52,7 +52,7 @@ use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; /// This works across multiple providers by shaping a generic "GenerateVideoRequest" into a provider-specific plan. /// That plan can then be used to return a cost estimate for that given provider or return a struct that can be used to send a real generation request. #[derive(Debug)] -pub struct GenerateVideoRequest<'a> { +pub struct GenerateVideoRequest { /// Which model to use. pub model: CommonVideoModel, @@ -60,28 +60,28 @@ pub struct GenerateVideoRequest<'a> { pub provider: Provider, /// The prompt for the video generation - pub prompt: Option<&'a str>, + pub prompt: Option, /// Some models support negative prompts - pub negative_prompt: Option<&'a str>, + pub negative_prompt: Option, /// Starting keyframe (optional). - pub start_frame: Option>, + pub start_frame: Option, /// Ending keyframe (optional). - pub end_frame: Option>, + pub end_frame: Option, /// Reference images (optional). - pub reference_images: Option>, + pub reference_images: Option, /// Reference videos (optional). - pub reference_videos: Option>, + pub reference_videos: Option, /// Reference audio (optional). - pub reference_audio: Option>, + pub reference_audio: Option, /// Reference characters (optional). - pub reference_character_tokens: Option>, + pub reference_character_tokens: Option, /// The resolution to use pub resolution: Option, @@ -106,12 +106,12 @@ pub struct GenerateVideoRequest<'a> { /// Some providers support idempotency. /// If not supplied, we'll generate one for the required providers. - pub idempotency_token: Option<&'a str>, + pub idempotency_token: Option, } -impl<'a> GenerateVideoRequest<'a> { +impl GenerateVideoRequest { /// Read the video generation request, construct a plan, then yield a means to execute it. - pub fn build(&self) -> Result, ArtcraftRouterError> { + pub fn build(&self) -> Result { match self.provider { Provider::Artcraft => self.build_artcraft(), Provider::Fal => self.build_fal(), @@ -121,7 +121,7 @@ impl<'a> GenerateVideoRequest<'a> { } } - fn build_artcraft(&self) -> Result, ArtcraftRouterError> { + fn build_artcraft(&self) -> Result { match self.model { CommonVideoModel::Kling16Pro => plan_generate_video_artcraft_kling_1_6_pro(self), CommonVideoModel::Kling21Master => plan_generate_video_artcraft_kling_2_1_master(self), @@ -145,7 +145,7 @@ impl<'a> GenerateVideoRequest<'a> { } } - fn build_fal(&self) -> Result, ArtcraftRouterError> { + fn build_fal(&self) -> Result { match self.model { CommonVideoModel::Veo2 => plan_generate_video_fal_veo_2(self), CommonVideoModel::Veo3 => plan_generate_video_fal_veo_3(self), @@ -167,14 +167,14 @@ impl<'a> GenerateVideoRequest<'a> { } } - fn build_muapi(&self) -> Result, ArtcraftRouterError> { + fn build_muapi(&self) -> Result { match self.model { CommonVideoModel::Seedance2p0 => plan_generate_video_muapi_seedance2p0(self), _ => Err(ArtcraftRouterError::UnsupportedModel(format!("{:?}", self.model))), } } - fn build_seedance2pro(&self) -> Result, ArtcraftRouterError> { + fn build_seedance2pro(&self) -> Result { match self.model { CommonVideoModel::Seedance2p0 => plan_generate_video_seedance2pro_seedance2p0(self), CommonVideoModel::Seedance2p0Fast => plan_generate_video_seedance2pro_seedance2p0_fast(self), @@ -182,14 +182,14 @@ impl<'a> GenerateVideoRequest<'a> { } } - fn unsupported_provider(&self) -> Result, ArtcraftRouterError> { + fn unsupported_provider(&self) -> Result { Err(ArtcraftRouterError::UnsupportedModel( format!("Video generation for model `{:?}` is not supported for provider {:?}", self.model, self.provider) )) } pub fn get_or_generate_idempotency_token(&self) -> String { - self.idempotency_token.map(|t| t.to_string()) + self.idempotency_token.clone() .unwrap_or_else(|| uuid::Uuid::new_v4().to_string()) } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_pro.rs index 51a32b8337..e50e813805 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_pro.rs @@ -12,31 +12,31 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_pro_multi_func use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling3p0Pro<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling3p0Pro { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub generate_audio: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling3p0_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling3p0_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling3p0Pro(PlanArtcraftKling3p0Pro { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -46,9 +46,9 @@ pub fn plan_generate_video_artcraft_kling3p0_pro<'a>( })) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -169,11 +169,11 @@ mod tests { use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; - fn base_request() -> GenerateVideoRequest<'static> { + fn base_request() -> GenerateVideoRequest { GenerateVideoRequest { model: CommonVideoModel::Kling3p0Pro, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), negative_prompt: None, start_frame: None, end_frame: None, @@ -264,7 +264,7 @@ mod tests { #[test] fn url_image_ref_returns_error() { let request = GenerateVideoRequest { - start_frame: Some(ImageRef::Url("https://example.com/image.jpg")), + start_frame: Some(ImageRef::Url("https://example.com/image.jpg".to_string())), ..base_request() }; let result = request.build(); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_standard.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_standard.rs index 677b36af46..e570fb952f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_standard.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling3p0_standard.rs @@ -12,31 +12,31 @@ use artcraft_api_defs::generate::video::multi_function::kling_3p0_standard_multi use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling3p0Standard<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling3p0Standard { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub generate_audio: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling3p0_standard<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling3p0_standard( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling3p0Standard(PlanArtcraftKling3p0Standard { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -46,9 +46,9 @@ pub fn plan_generate_video_artcraft_kling3p0_standard<'a>( })) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -169,11 +169,11 @@ mod tests { use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; - fn base_request() -> GenerateVideoRequest<'static> { + fn base_request() -> GenerateVideoRequest { GenerateVideoRequest { model: CommonVideoModel::Kling3p0Standard, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), negative_prompt: None, start_frame: None, end_frame: None, @@ -264,7 +264,7 @@ mod tests { #[test] fn url_image_ref_returns_error() { let request = GenerateVideoRequest { - start_frame: Some(ImageRef::Url("https://example.com/image.jpg")), + start_frame: Some(ImageRef::Url("https://example.com/image.jpg".to_string())), ..base_request() }; let result = request.build(); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_1_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_1_6_pro.rs index 00ec5a92b3..480fa5617f 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_1_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_1_6_pro.rs @@ -11,21 +11,21 @@ use artcraft_api_defs::generate::video::generate_kling_1_6_pro_image_to_video::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling16Pro<'a> { - pub prompt: Option<&'a str>, - pub start_frame: &'a MediaFileToken, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling16Pro { + pub prompt: Option, + pub start_frame: MediaFileToken, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling_1_6_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling_1_6_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => t, Some(ImageRef::Url(_)) => { return Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -37,13 +37,13 @@ pub fn plan_generate_video_artcraft_kling_1_6_pro<'a>( })) } }; - let end_frame = resolve_end_frame(request.end_frame)?; + let end_frame = resolve_end_frame(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling16Pro(PlanArtcraftKling16Pro { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -52,9 +52,9 @@ pub fn plan_generate_video_artcraft_kling_1_6_pro<'a>( })) } -fn resolve_end_frame<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_end_frame( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -129,7 +129,7 @@ fn plan_duration( } } -impl PlanArtcraftKling16Pro<'_> { +impl PlanArtcraftKling16Pro { pub fn is_ten_seconds(&self) -> bool { matches!(self.duration, Some(GenerateKling16ProDuration::TenSeconds)) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_master.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_master.rs index 5cffc505de..ad2777e824 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_master.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_master.rs @@ -11,20 +11,20 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_master_image_to_video use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling21Master<'a> { - pub prompt: Option<&'a str>, - pub start_frame: &'a MediaFileToken, +pub struct PlanArtcraftKling21Master { + pub prompt: Option, + pub start_frame: MediaFileToken, pub aspect_ratio: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling_2_1_master<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling_2_1_master( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => t, Some(ImageRef::Url(_)) => { return Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -48,7 +48,7 @@ pub fn plan_generate_video_artcraft_kling_2_1_master<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling21Master(PlanArtcraftKling21Master { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, duration, @@ -121,7 +121,7 @@ fn plan_duration( } } -impl PlanArtcraftKling21Master<'_> { +impl PlanArtcraftKling21Master { pub fn is_ten_seconds(&self) -> bool { matches!(self.duration, Some(GenerateKling21MasterDuration::TenSeconds)) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_pro.rs index e3173cb0a1..1de7ffd909 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_1_pro.rs @@ -11,21 +11,21 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling21Pro<'a> { - pub prompt: Option<&'a str>, - pub start_frame: &'a MediaFileToken, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling21Pro { + pub prompt: Option, + pub start_frame: MediaFileToken, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling_2_1_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling_2_1_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => t, Some(ImageRef::Url(_)) => { return Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -37,13 +37,13 @@ pub fn plan_generate_video_artcraft_kling_2_1_pro<'a>( })) } }; - let end_frame = resolve_end_frame(request.end_frame)?; + let end_frame = resolve_end_frame(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling21Pro(PlanArtcraftKling21Pro { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -52,9 +52,9 @@ pub fn plan_generate_video_artcraft_kling_2_1_pro<'a>( })) } -fn resolve_end_frame<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_end_frame( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -129,7 +129,7 @@ fn plan_duration( } } -impl PlanArtcraftKling21Pro<'_> { +impl PlanArtcraftKling21Pro { pub fn is_ten_seconds(&self) -> bool { matches!(self.duration, Some(GenerateKling21ProDuration::TenSeconds)) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_5_turbo_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_5_turbo_pro.rs index a065740940..3a37262e37 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_5_turbo_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_5_turbo_pro.rs @@ -11,30 +11,30 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_5_turbo_multi_fu use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling2p5TurboPro<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling2p5TurboPro { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling_2_5_turbo_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling_2_5_turbo_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling2p5TurboPro(PlanArtcraftKling2p5TurboPro { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -43,9 +43,9 @@ pub fn plan_generate_video_artcraft_kling_2_5_turbo_pro<'a>( })) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -120,7 +120,7 @@ fn plan_duration( } } -impl PlanArtcraftKling2p5TurboPro<'_> { +impl PlanArtcraftKling2p5TurboPro { pub fn is_ten_seconds(&self) -> bool { matches!(self.duration, Some(Kling2p5TurboProMultiFunctionVideoGenDuration::TenSeconds)) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_6_pro.rs index 9df6422743..5417c20bb2 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_kling_2_6_pro.rs @@ -11,22 +11,22 @@ use artcraft_api_defs::generate::video::multi_function::kling_2_6_multi_function use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftKling2p6Pro<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftKling2p6Pro { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub generate_audio: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_kling_2_6_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_kling_2_6_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { None => None, Some(ImageRef::MediaFileToken(t)) => Some(t), Some(ImageRef::Url(_)) => { @@ -45,8 +45,8 @@ pub fn plan_generate_video_artcraft_kling_2_6_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftKling2p6Pro(PlanArtcraftKling2p6Pro { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, aspect_ratio, duration, @@ -120,7 +120,7 @@ fn plan_duration( } } -impl PlanArtcraftKling2p6Pro<'_> { +impl PlanArtcraftKling2p6Pro { pub fn is_ten_seconds(&self) -> bool { matches!(self.duration, Some(Kling2p6ProMultiFunctionVideoGenDuration::TenSeconds)) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance1p5_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance1p5_pro.rs index 1302095acc..1741a9dfd3 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance1p5_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance1p5_pro.rs @@ -13,10 +13,10 @@ use artcraft_api_defs::generate::video::multi_function::seedance_1p5_pro_multi_f use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedance1p5Pro<'a> { - pub prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftSeedance1p5Pro { + pub prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub resolution: Option, @@ -24,20 +24,20 @@ pub struct PlanArtcraftSeedance1p5Pro<'a> { pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_seedance1p5_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_seedance1p5_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; Ok(VideoGenerationPlan::ArtcraftSeedance1p5Pro(PlanArtcraftSeedance1p5Pro { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -48,9 +48,9 @@ pub fn plan_generate_video_artcraft_seedance1p5_pro<'a>( })) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -187,11 +187,11 @@ mod tests { use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; - fn base_seedance_1p5_pro_request() -> GenerateVideoRequest<'static> { + fn base_seedance_1p5_pro_request() -> GenerateVideoRequest { GenerateVideoRequest { model: CommonVideoModel::Seedance1p5Pro, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), negative_prompt: None, start_frame: None, end_frame: None, @@ -282,7 +282,7 @@ mod tests { #[test] fn url_image_ref_accepted_for_cost_path() { let request = GenerateVideoRequest { - start_frame: Some(ImageRef::Url("https://example.com/image.jpg")), + start_frame: Some(ImageRef::Url("https://example.com/image.jpg".to_string())), ..base_seedance_1p5_pro_request() }; let VideoGenerationPlan::ArtcraftSeedance1p5Pro(plan) = request.build().unwrap() else { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0.rs index 47ea91c454..e82bf51c12 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0.rs @@ -15,43 +15,43 @@ use tokens::tokens::characters::CharacterToken; use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedance2p0<'a> { - pub prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, - pub reference_images: Option<&'a Vec>, - pub reference_videos: Option<&'a Vec>, - pub reference_audio: Option<&'a Vec>, - pub reference_characters: Option<&'a Vec>, +pub struct PlanArtcraftSeedance2p0 { + pub prompt: Option, + pub start_frame: Option, + pub end_frame: Option, + pub reference_images: Option>, + pub reference_videos: Option>, + pub reference_audio: Option>, + pub reference_characters: Option>, pub aspect_ratio: Option, pub duration_seconds: Option, pub batch_count: Seedance2p0BatchCount, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_seedance2p0<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_seedance2p0( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; - let reference_images = resolve_image_list_ref(request.reference_images)?; - let reference_videos = resolve_video_list_ref(request.reference_videos)?; - let reference_audio = resolve_audio_list_ref(request.reference_audio)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; + let reference_images = resolve_image_list_ref(request.reference_images.clone())?; + let reference_videos = resolve_video_list_ref(request.reference_videos.clone())?; + let reference_audio = resolve_audio_list_ref(request.reference_audio.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftSeedance2p0(PlanArtcraftSeedance2p0 { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, reference_images, reference_videos, reference_audio, - reference_characters: resolve_character_list_ref(request.reference_character_tokens), + reference_characters: resolve_character_list_ref(request.reference_character_tokens.clone()), aspect_ratio, duration_seconds, batch_count, @@ -59,18 +59,18 @@ pub fn plan_generate_video_artcraft_seedance2p0<'a>( })) } -fn resolve_character_list_ref<'a>( - character_list_ref: Option>, -) -> Option<&'a Vec> { +fn resolve_character_list_ref( + character_list_ref: Option, +) -> Option> { match character_list_ref { None => None, Some(crate::api::character_list_ref::CharacterListRef::CharacterTokens(tokens)) => Some(tokens), } } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -80,9 +80,9 @@ fn resolve_image_ref<'a>( } } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -92,9 +92,9 @@ fn resolve_image_list_ref<'a>( } } -fn resolve_video_list_ref<'a>( - video_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_video_list_ref( + video_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match video_list_ref { None => Ok(None), Some(VideoListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -104,9 +104,9 @@ fn resolve_video_list_ref<'a>( } } -fn resolve_audio_list_ref<'a>( - audio_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_audio_list_ref( + audio_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match audio_list_ref { None => Ok(None), Some(AudioListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -365,7 +365,7 @@ mod tests { #[test] fn url_image_ref_returns_error() { let request = GenerateVideoRequest { - start_frame: Some(ImageRef::Url("https://example.com/image.jpg")), + start_frame: Some(ImageRef::Url("https://example.com/image.jpg".to_string())), ..base_video_request() }; let result = request.build(); diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0_fast.rs index e8bc89d797..edb4a60f44 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance2p0_fast.rs @@ -15,29 +15,29 @@ use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_funct use tokens::tokens::characters::CharacterToken; use tokens::tokens::media_files::MediaFileToken; -pub fn plan_generate_video_artcraft_seedance2p0_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_seedance2p0_fast( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; - let reference_images = resolve_image_list_ref(request.reference_images)?; - let reference_videos = resolve_video_list_ref(request.reference_videos)?; - let reference_audio = resolve_audio_list_ref(request.reference_audio)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; + let reference_images = resolve_image_list_ref(request.reference_images.clone())?; + let reference_videos = resolve_video_list_ref(request.reference_videos.clone())?; + let reference_audio = resolve_audio_list_ref(request.reference_audio.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftSeedance2p0Fast(PlanArtcraftSeedance2p0 { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, reference_images, reference_videos, reference_audio, - reference_characters: resolve_character_list_ref(request.reference_character_tokens), + reference_characters: resolve_character_list_ref(request.reference_character_tokens.clone()), aspect_ratio, duration_seconds, batch_count, @@ -45,18 +45,18 @@ pub fn plan_generate_video_artcraft_seedance2p0_fast<'a>( })) } -fn resolve_character_list_ref<'a>( - character_list_ref: Option>, -) -> Option<&'a Vec> { +fn resolve_character_list_ref( + character_list_ref: Option, +) -> Option> { match character_list_ref { None => None, Some(crate::api::character_list_ref::CharacterListRef::CharacterTokens(tokens)) => Some(tokens), } } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -66,9 +66,9 @@ fn resolve_image_ref<'a>( } } -fn resolve_image_list_ref<'a>( - image_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_image_list_ref( + image_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), Some(ImageListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -78,9 +78,9 @@ fn resolve_image_list_ref<'a>( } } -fn resolve_video_list_ref<'a>( - video_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_video_list_ref( + video_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match video_list_ref { None => Ok(None), Some(VideoListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -90,9 +90,9 @@ fn resolve_video_list_ref<'a>( } } -fn resolve_audio_list_ref<'a>( - audio_list_ref: Option>, -) -> Result>, ArtcraftRouterError> { +fn resolve_audio_list_ref( + audio_list_ref: Option, +) -> Result>, ArtcraftRouterError> { match audio_list_ref { None => Ok(None), Some(AudioListRef::MediaFileTokens(tokens)) => Ok(Some(tokens)), @@ -214,11 +214,11 @@ mod tests { Seedance2p0AspectRatio, Seedance2p0BatchCount, }; - fn base_request() -> GenerateVideoRequest<'static> { + fn base_request() -> GenerateVideoRequest { GenerateVideoRequest { model: CommonVideoModel::Seedance2p0Fast, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), negative_prompt: None, start_frame: None, end_frame: None, @@ -248,7 +248,7 @@ mod tests { let req = base_request(); let plan = req.build().unwrap(); if let VideoGenerationPlan::ArtcraftSeedance2p0Fast(p) = plan { - assert_eq!(p.prompt, Some("a cat in space")); + assert_eq!(p.prompt, Some("a cat in space".to_string())); } else { panic!("wrong variant"); } } @@ -328,7 +328,7 @@ mod tests { #[test] fn url_image_ref_returns_error() { let req = GenerateVideoRequest { - start_frame: Some(ImageRef::Url("https://example.com/image.jpg")), + start_frame: Some(ImageRef::Url("https://example.com/image.jpg".to_string())), ..base_request() }; assert!(matches!( diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance_1_0_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance_1_0_lite.rs index 2fbd05c082..95458eb237 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance_1_0_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_seedance_1_0_lite.rs @@ -13,22 +13,22 @@ use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_vide use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSeedance10Lite<'a> { - pub prompt: Option<&'a str>, - pub start_frame: &'a MediaFileToken, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftSeedance10Lite { + pub prompt: Option, + pub start_frame: MediaFileToken, + pub end_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_seedance_1_0_lite<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_seedance_1_0_lite( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => t, Some(ImageRef::Url(_)) => { return Err(ArtcraftRouterError::Client(ClientError::ArtcraftOnlySupportsMediaTokens)) @@ -40,14 +40,14 @@ pub fn plan_generate_video_artcraft_seedance_1_0_lite<'a>( })) } }; - let end_frame = resolve_end_frame(request.end_frame)?; + let end_frame = resolve_end_frame(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftSeedance10Lite(PlanArtcraftSeedance10Lite { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -57,9 +57,9 @@ pub fn plan_generate_video_artcraft_seedance_1_0_lite<'a>( })) } -fn resolve_end_frame<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_end_frame( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -145,7 +145,7 @@ fn plan_duration( } } -impl PlanArtcraftSeedance10Lite<'_> { +impl PlanArtcraftSeedance10Lite { /// Legacy handler default: 5 seconds. pub fn duration_seconds_for_cost(&self) -> u64 { match self.duration { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2.rs index 83ea15ca5e..4322fe2027 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2.rs @@ -13,21 +13,21 @@ use artcraft_api_defs::generate::video::multi_function::sora_2_multi_function_vi use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSora2<'a> { - pub prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftSora2 { + pub prompt: Option, + pub start_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_sora_2<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_sora_2( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { None => None, Some(ImageRef::MediaFileToken(t)) => Some(t), Some(ImageRef::Url(_)) => { @@ -47,7 +47,7 @@ pub fn plan_generate_video_artcraft_sora_2<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftSora2(PlanArtcraftSora2 { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, resolution, @@ -126,7 +126,7 @@ fn plan_duration( } } -impl PlanArtcraftSora2<'_> { +impl PlanArtcraftSora2 { /// Fal client default: 4 seconds when None. pub fn duration_seconds_for_cost(&self) -> u64 { use Sora2MultiFunctionVideoGenDuration as D; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2_pro.rs index dcc954434e..e7de7c9861 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_sora_2_pro.rs @@ -13,21 +13,21 @@ use artcraft_api_defs::generate::video::multi_function::sora_2_pro_multi_functio use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftSora2Pro<'a> { - pub prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftSora2Pro { + pub prompt: Option, + pub start_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_sora_2_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_sora_2_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { None => None, Some(ImageRef::MediaFileToken(t)) => Some(t), Some(ImageRef::Url(_)) => { @@ -47,7 +47,7 @@ pub fn plan_generate_video_artcraft_sora_2_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftSora2Pro(PlanArtcraftSora2Pro { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, resolution, @@ -128,7 +128,7 @@ fn plan_duration( } } -impl PlanArtcraftSora2Pro<'_> { +impl PlanArtcraftSora2Pro { /// Fal client default: 4 seconds when None. pub fn duration_seconds_for_cost(&self) -> u64 { use Sora2ProMultiFunctionVideoGenDuration as D; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_2.rs index f0cc9d675a..e0b7db687e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_2.rs @@ -11,23 +11,23 @@ use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftVeo2<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftVeo2 { + pub prompt: Option, /// Required for execution. May be None on the cost path when the omni-gen /// distillation hydrated the media token to a URL (which the Artcraft /// provider can't use but cost estimation doesn't need). - pub start_frame: Option<&'a MediaFileToken>, + pub start_frame: Option, pub aspect_ratio: Option, pub duration: Option, pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_veo_2<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_veo_2( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => Some(t), // Omni-gen distillation hydrates media tokens to URLs before running the // Artcraft cost path. Cost only depends on duration, so URL-form refs are @@ -55,7 +55,7 @@ pub fn plan_generate_video_artcraft_veo_2<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftVeo2(PlanArtcraftVeo2 { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, duration, @@ -114,7 +114,7 @@ fn plan_duration( } } -impl PlanArtcraftVeo2<'_> { +impl PlanArtcraftVeo2 { /// Mirrors the Fal client's default-resolved duration used for billing. pub fn duration_seconds_for_cost(&self) -> u64 { match self.duration { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3.rs index 1113394ea1..e45ca71d60 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3.rs @@ -12,11 +12,11 @@ use artcraft_api_defs::generate::video::generate_veo_3_image_to_video::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftVeo3<'a> { - pub prompt: Option<&'a str>, +pub struct PlanArtcraftVeo3 { + pub prompt: Option, /// Required for image-to-video. None for text-to-video or when the /// omni-gen distillation hydrated the token to a URL. - pub start_frame: Option<&'a MediaFileToken>, + pub start_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, @@ -28,12 +28,12 @@ pub struct PlanArtcraftVeo3<'a> { pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_veo_3<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_veo_3( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => Some(t), // Omni-gen distillation hydrates media tokens to URLs before running the // Artcraft cost path. Cost only depends on duration/audio, so URL-form @@ -62,7 +62,7 @@ pub fn plan_generate_video_artcraft_veo_3<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftVeo3(PlanArtcraftVeo3 { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, resolution, @@ -149,7 +149,7 @@ fn plan_duration( } } -impl PlanArtcraftVeo3<'_> { +impl PlanArtcraftVeo3 { /// Duration in seconds for cost estimation. Uses the raw requested /// duration, clamped to {4, 6, 8}, defaulting to 8s. pub fn duration_seconds_for_cost(&self) -> u64 { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3_fast.rs index cfaec5f2ff..c35f1a2cdf 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3_fast.rs @@ -12,9 +12,9 @@ use artcraft_api_defs::generate::video::generate_veo_3_fast_image_to_video::{ use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftVeo3Fast<'a> { - pub prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftVeo3Fast { + pub prompt: Option, + pub start_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, @@ -22,12 +22,12 @@ pub struct PlanArtcraftVeo3Fast<'a> { pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_veo_3_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_veo_3_fast( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = match request.start_frame { + let start_frame = match request.start_frame.clone() { Some(ImageRef::MediaFileToken(t)) => Some(t), Some(ImageRef::Url(_)) => None, None => None, @@ -45,7 +45,7 @@ pub fn plan_generate_video_artcraft_veo_3_fast<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftVeo3Fast(PlanArtcraftVeo3Fast { - prompt: request.prompt, + prompt: request.prompt.clone(), start_frame, aspect_ratio, resolution, @@ -124,7 +124,7 @@ fn plan_duration( } } -impl PlanArtcraftVeo3Fast<'_> { +impl PlanArtcraftVeo3Fast { pub fn duration_seconds_for_cost(&self) -> u64 { 8 } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1.rs index d98879a866..c01b85b0da 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1.rs @@ -13,11 +13,11 @@ use artcraft_api_defs::generate::video::multi_function::veo_3p1_multi_function_v use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftVeo3p1<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftVeo3p1 { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, @@ -25,28 +25,28 @@ pub struct PlanArtcraftVeo3p1<'a> { pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_veo_3p1<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_veo_3p1( + request: &GenerateVideoRequest, +) -> Result { let plan = build_plan_artcraft_veo_3p1(request)?; Ok(VideoGenerationPlan::ArtcraftVeo3p1(plan)) } -pub(crate) fn build_plan_artcraft_veo_3p1<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub(crate) fn build_plan_artcraft_veo_3p1( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(PlanArtcraftVeo3p1 { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -57,9 +57,9 @@ pub(crate) fn build_plan_artcraft_veo_3p1<'a>( }) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -141,7 +141,7 @@ fn plan_duration( } } -impl PlanArtcraftVeo3p1<'_> { +impl PlanArtcraftVeo3p1 { /// Legacy Veo 3.1 multi-function handler defaults `None` to SixSeconds. pub fn duration_seconds_for_cost(&self) -> u64 { use Veo3p1MultiFunctionVideoGenDuration as D; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1_fast.rs index 1be4a089d1..38d24f6272 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/artcraft/plan_generate_video_artcraft_veo_3p1_fast.rs @@ -13,11 +13,11 @@ use artcraft_api_defs::generate::video::multi_function::veo_3p1_fast_multi_funct use tokens::tokens::media_files::MediaFileToken; #[derive(Debug, Clone)] -pub struct PlanArtcraftVeo3p1Fast<'a> { - pub prompt: Option<&'a str>, - pub negative_prompt: Option<&'a str>, - pub start_frame: Option<&'a MediaFileToken>, - pub end_frame: Option<&'a MediaFileToken>, +pub struct PlanArtcraftVeo3p1Fast { + pub prompt: Option, + pub negative_prompt: Option, + pub start_frame: Option, + pub end_frame: Option, pub aspect_ratio: Option, pub resolution: Option, pub duration: Option, @@ -25,21 +25,21 @@ pub struct PlanArtcraftVeo3p1Fast<'a> { pub idempotency_token: String, } -pub fn plan_generate_video_artcraft_veo_3p1_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_artcraft_veo_3p1_fast( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame = resolve_image_ref(request.start_frame)?; - let end_frame = resolve_image_ref(request.end_frame)?; + let start_frame = resolve_image_ref(request.start_frame.clone())?; + let end_frame = resolve_image_ref(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::ArtcraftVeo3p1Fast(PlanArtcraftVeo3p1Fast { - prompt: request.prompt, - negative_prompt: request.negative_prompt, + prompt: request.prompt.clone(), + negative_prompt: request.negative_prompt.clone(), start_frame, end_frame, aspect_ratio, @@ -50,9 +50,9 @@ pub fn plan_generate_video_artcraft_veo_3p1_fast<'a>( })) } -fn resolve_image_ref<'a>( - image_ref: Option>, -) -> Result, ArtcraftRouterError> { +fn resolve_image_ref( + image_ref: Option, +) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), Some(ImageRef::MediaFileToken(t)) => Ok(Some(t)), @@ -134,7 +134,7 @@ fn plan_duration( } } -impl PlanArtcraftVeo3p1Fast<'_> { +impl PlanArtcraftVeo3p1Fast { /// Legacy Veo 3.1 Fast multi-function handler defaults `None` to SixSeconds. pub fn duration_seconds_for_cost(&self) -> u64 { use Veo3p1FastMultiFunctionVideoGenDuration as D; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_1_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_1_6_pro.rs index 2d500ce580..f717d0d38c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_1_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_1_6_pro.rs @@ -18,18 +18,18 @@ pub struct PlanFalKling16Pro { pub duration: Kling1p6ProDuration, } -pub fn plan_generate_video_fal_kling_1_6_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_1_6_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_url = require_url(request.start_frame, "start_frame", "Kling 1.6 Pro requires a starting frame")?; - let end_image_url = optional_url(request.end_frame)?; + let image_url = require_url(request.start_frame.clone(), "start_frame", "Kling 1.6 Pro requires a starting frame")?; + let end_image_url = optional_url(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalKling16Pro(PlanFalKling16Pro { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), image_url, end_image_url, aspect_ratio, @@ -38,7 +38,7 @@ pub fn plan_generate_video_fal_kling_1_6_pro<'a>( } pub(crate) fn require_url( - image_ref: Option>, + image_ref: Option, field: &'static str, reason: &str, ) -> Result { @@ -55,7 +55,7 @@ pub(crate) fn require_url( } pub(crate) fn optional_url( - image_ref: Option>, + image_ref: Option, ) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_master.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_master.rs index 14249ea292..a6cc6a2c72 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_master.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_master.rs @@ -17,12 +17,12 @@ pub struct PlanFalKling21Master { pub duration: Kling2p1MasterDuration, } -pub fn plan_generate_video_fal_kling_2_1_master<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_2_1_master( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_url = require_url(request.start_frame, "start_frame", "Kling 2.1 Master requires a starting frame")?; + let image_url = require_url(request.start_frame.clone(), "start_frame", "Kling 2.1 Master requires a starting frame")?; if request.end_frame.is_some() { return Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { field: "end_frame", @@ -34,7 +34,7 @@ pub fn plan_generate_video_fal_kling_2_1_master<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalKling21Master(PlanFalKling21Master { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), image_url, aspect_ratio, duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_pro.rs index cbb6d22e5c..40de42270e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_1_pro.rs @@ -18,18 +18,18 @@ pub struct PlanFalKling21Pro { pub duration: Kling2p1ProDuration, } -pub fn plan_generate_video_fal_kling_2_1_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_2_1_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let image_url = require_url(request.start_frame, "start_frame", "Kling 2.1 Pro requires a starting frame")?; - let end_image_url = optional_url(request.end_frame)?; + let image_url = require_url(request.start_frame.clone(), "start_frame", "Kling 2.1 Pro requires a starting frame")?; + let end_image_url = optional_url(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalKling21Pro(PlanFalKling21Pro { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), image_url, end_image_url, aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_5_turbo_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_5_turbo_pro.rs index 4ec8d9db17..699710a91e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_5_turbo_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_5_turbo_pro.rs @@ -37,12 +37,12 @@ pub struct PlanFalKling2p5TurboPro { pub duration: Option, } -pub fn plan_generate_video_fal_kling_2_5_turbo_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_2_5_turbo_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => { if request.end_frame.is_some() { return Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { @@ -54,7 +54,7 @@ pub fn plan_generate_video_fal_kling_2_5_turbo_pro<'a>( } Some(image_url) => FalKling2p5TurboProMode::ImageToVideo { image_url, - end_image_url: optional_url(request.end_frame)?, + end_image_url: optional_url(request.end_frame.clone())?, }, }; @@ -62,8 +62,8 @@ pub fn plan_generate_video_fal_kling_2_5_turbo_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalKling2p5TurboPro(PlanFalKling2p5TurboPro { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, aspect_ratio, duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_6_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_6_pro.rs index 6bc32c273b..f5a202defe 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_6_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_2_6_pro.rs @@ -35,9 +35,9 @@ pub struct PlanFalKling2p6Pro { pub generate_audio: Option, } -pub fn plan_generate_video_fal_kling_2_6_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_2_6_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.end_frame.is_some() { @@ -47,7 +47,7 @@ pub fn plan_generate_video_fal_kling_2_6_pro<'a>( })); } - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => FalKling2p6ProMode::TextToVideo, Some(image_url) => FalKling2p6ProMode::ImageToVideo { image_url }, }; @@ -56,8 +56,8 @@ pub fn plan_generate_video_fal_kling_2_6_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalKling2p6Pro(PlanFalKling2p6Pro { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, aspect_ratio, duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_pro.rs index 573879e141..ddb74ec5ea 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_pro.rs @@ -36,9 +36,9 @@ pub struct PlanFalKling3p0Pro { pub generate_audio: Option, } -pub fn plan_generate_video_fal_kling_3p0_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_3p0_pro( + request: &GenerateVideoRequest, +) -> Result { let inner = build_kling_3p0_plan(request, "Kling 3.0 Pro")?; Ok(VideoGenerationPlan::FalKling3p0Pro(PlanFalKling3p0Pro { prompt: inner.prompt, @@ -59,13 +59,13 @@ pub(crate) struct Kling3p0Common { pub generate_audio: Option, } -pub(crate) fn build_kling_3p0_plan<'a>( - request: &'a GenerateVideoRequest<'a>, +pub(crate) fn build_kling_3p0_plan( + request: &GenerateVideoRequest, _model_label: &'static str, ) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => { if request.end_frame.is_some() { return Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { @@ -77,7 +77,7 @@ pub(crate) fn build_kling_3p0_plan<'a>( } Some(image_url) => FalKling3p0Mode::ImageToVideo { image_url, - end_image_url: optional_url(request.end_frame)?, + end_image_url: optional_url(request.end_frame.clone())?, }, }; @@ -85,8 +85,8 @@ pub(crate) fn build_kling_3p0_plan<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(Kling3p0Common { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, aspect_ratio, duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_standard.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_standard.rs index c0785430c5..e1d3a960dc 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_standard.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_kling_3p0_standard.rs @@ -15,9 +15,9 @@ pub struct PlanFalKling3p0Standard { pub generate_audio: Option, } -pub fn plan_generate_video_fal_kling_3p0_standard<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_kling_3p0_standard( + request: &GenerateVideoRequest, +) -> Result { let inner = build_kling_3p0_plan(request, "Kling 3.0 Standard")?; Ok(VideoGenerationPlan::FalKling3p0Standard(PlanFalKling3p0Standard { prompt: inner.prompt, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1_0_lite.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1_0_lite.rs index bc2f8952f0..fa689e93d1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1_0_lite.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1_0_lite.rs @@ -20,23 +20,23 @@ pub struct PlanFalSeedance10Lite { pub duration: Seedance1LiteDuration, } -pub fn plan_generate_video_fal_seedance_1_0_lite<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_seedance_1_0_lite( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let image_url = require_url( - request.start_frame, + request.start_frame.clone(), "start_frame", "Seedance 1.0 Lite requires a starting frame", )?; - let end_image_url = optional_url(request.end_frame)?; + let end_image_url = optional_url(request.end_frame.clone())?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalSeedance10Lite(PlanFalSeedance10Lite { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), image_url, end_image_url, aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1p5_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1p5_pro.rs index 41690fd945..68af430705 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1p5_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_seedance_1p5_pro.rs @@ -57,12 +57,12 @@ pub struct PlanFalSeedance1p5Pro { pub generate_audio: Option, } -pub fn plan_generate_video_fal_seedance_1p5_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_seedance_1p5_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => { if request.end_frame.is_some() { return Err(ArtcraftRouterError::Client(ClientError::ModelDoesNotSupportOption { @@ -74,7 +74,7 @@ pub fn plan_generate_video_fal_seedance_1p5_pro<'a>( } Some(image_url) => FalSeedance1p5ProMode::ImageToVideo { image_url, - end_image_url: optional_url(request.end_frame)?, + end_image_url: optional_url(request.end_frame.clone())?, }, }; @@ -83,7 +83,7 @@ pub fn plan_generate_video_fal_seedance_1p5_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalSeedance1p5Pro(PlanFalSeedance1p5Pro { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), mode, aspect_ratio, resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2.rs index 3eb407a87c..92fe1764ac 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2.rs @@ -43,9 +43,9 @@ pub struct PlanFalSora2 { pub duration: Option, } -pub fn plan_generate_video_fal_sora_2<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_sora_2( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.end_frame.is_some() { @@ -55,7 +55,7 @@ pub fn plan_generate_video_fal_sora_2<'a>( })); } - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => FalSora2Mode::TextToVideo, Some(image_url) => FalSora2Mode::ImageToVideo { image_url }, }; @@ -65,7 +65,7 @@ pub fn plan_generate_video_fal_sora_2<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalSora2(PlanFalSora2 { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), mode, aspect_ratio, resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2_pro.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2_pro.rs index 73b9821021..fa1f076880 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2_pro.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_sora_2_pro.rs @@ -43,9 +43,9 @@ pub struct PlanFalSora2Pro { pub duration: Option, } -pub fn plan_generate_video_fal_sora_2_pro<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_sora_2_pro( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.end_frame.is_some() { @@ -55,7 +55,7 @@ pub fn plan_generate_video_fal_sora_2_pro<'a>( })); } - let mode = match optional_url(request.start_frame)? { + let mode = match optional_url(request.start_frame.clone())? { None => FalSora2ProMode::TextToVideo, Some(image_url) => FalSora2ProMode::ImageToVideo { image_url }, }; @@ -65,7 +65,7 @@ pub fn plan_generate_video_fal_sora_2_pro<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalSora2Pro(PlanFalSora2Pro { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), mode, aspect_ratio, resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_2.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_2.rs index 1223fbac87..a66468178d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_2.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_2.rs @@ -28,16 +28,16 @@ pub struct PlanFalVeo2 { pub duration: Veo2Duration, } -pub fn plan_generate_video_fal_veo_2<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_veo_2( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.end_frame.is_some() { return Err(unsupported("end_frame", "Veo 2 does not support an ending frame")); } - let mode = match request.start_frame { + let mode = match request.start_frame.clone() { Some(ImageRef::Url(url)) => FalVeo2Mode::ImageToVideo { image_url: url.to_string(), }, @@ -56,8 +56,8 @@ pub fn plan_generate_video_fal_veo_2<'a>( let duration = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::FalVeo2(PlanFalVeo2 { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, aspect_ratio, duration, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3.rs index 7573b88c1c..990706db79 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3.rs @@ -69,16 +69,16 @@ pub struct PlanFalVeo3 { pub generate_audio: bool, } -pub fn plan_generate_video_fal_veo_3<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_veo_3( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; if request.end_frame.is_some() { return Err(unsupported("end_frame", "Veo 3 does not support an ending frame")); } - let mode = match request.start_frame { + let mode = match request.start_frame.clone() { Some(ImageRef::Url(url)) => FalVeo3Mode::ImageToVideo { image_url: url.to_string(), }, @@ -101,8 +101,8 @@ pub fn plan_generate_video_fal_veo_3<'a>( let generate_audio = request.generate_audio.unwrap_or(true); Ok(VideoGenerationPlan::FalVeo3(PlanFalVeo3 { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, t2v_aspect_ratio, i2v_aspect_ratio, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3_fast.rs index 6398a5a332..f9c08b6045 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3_fast.rs @@ -20,12 +20,12 @@ pub struct PlanFalVeo3Fast { pub generate_audio: bool, } -pub fn plan_generate_video_fal_veo_3_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_veo_3_fast( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame_url = resolve_required_image_url(request.start_frame)?; + let start_frame_url = resolve_required_image_url(request.start_frame.clone())?; if request.end_frame.is_some() { return Err(unsupported("end_frame", "Veo 3 Fast does not support an ending frame")); } @@ -36,7 +36,7 @@ pub fn plan_generate_video_fal_veo_3_fast<'a>( let generate_audio = request.generate_audio.unwrap_or(true); Ok(VideoGenerationPlan::FalVeo3Fast(PlanFalVeo3Fast { - prompt: request.prompt.unwrap_or("").to_string(), + prompt: request.prompt.clone().unwrap_or_default(), start_frame_url, aspect_ratio, resolution, @@ -46,7 +46,7 @@ pub fn plan_generate_video_fal_veo_3_fast<'a>( } fn resolve_required_image_url( - image_ref: Option>, + image_ref: Option, ) -> Result { match image_ref { Some(ImageRef::Url(url)) => Ok(url.to_string()), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1.rs index 20be14c776..9c4b84f02b 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1.rs @@ -48,27 +48,27 @@ pub struct PlanFalVeo3p1 { pub generate_audio: Option, } -pub fn plan_generate_video_fal_veo_3p1<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_veo_3p1( + request: &GenerateVideoRequest, +) -> Result { let plan = build_plan_fal_veo_3p1(request, "Veo 3.1")?; Ok(VideoGenerationPlan::FalVeo3p1(plan)) } -pub(crate) fn build_plan_fal_veo_3p1<'a>( - request: &'a GenerateVideoRequest<'a>, +pub(crate) fn build_plan_fal_veo_3p1( + request: &GenerateVideoRequest, model_label: &'static str, ) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let mode = resolve_mode(request.start_frame, request.end_frame, model_label)?; + let mode = resolve_mode(request.start_frame.clone(), request.end_frame.clone(), model_label)?; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; let resolution = plan_resolution(request.resolution, strategy)?; let duration = plan_duration(request.duration_seconds, strategy)?; Ok(PlanFalVeo3p1 { - prompt: request.prompt.unwrap_or("").to_string(), - negative_prompt: request.negative_prompt.map(|s| s.to_string()), + prompt: request.prompt.clone().unwrap_or_default(), + negative_prompt: request.negative_prompt.clone(), mode, aspect_ratio, resolution, @@ -78,8 +78,8 @@ pub(crate) fn build_plan_fal_veo_3p1<'a>( } fn resolve_mode( - start_frame: Option>, - end_frame: Option>, + start_frame: Option, + end_frame: Option, model_label: &'static str, ) -> Result { let start = resolve_optional_image_url(start_frame)?; @@ -99,7 +99,7 @@ fn resolve_mode( } fn resolve_optional_image_url( - image_ref: Option>, + image_ref: Option, ) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1_fast.rs index e810847673..ffc697c43e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/fal/plan_generate_video_fal_veo_3p1_fast.rs @@ -13,9 +13,9 @@ pub struct PlanFalVeo3p1Fast { pub inner: PlanFalVeo3p1, } -pub fn plan_generate_video_fal_veo_3p1_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_fal_veo_3p1_fast( + request: &GenerateVideoRequest, +) -> Result { let inner = build_plan_fal_veo_3p1(request, "Veo 3.1 Fast")?; Ok(VideoGenerationPlan::FalVeo3p1Fast(PlanFalVeo3p1Fast { inner })) } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/muapi/plan_generate_video_muapi_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/muapi/plan_generate_video_muapi_seedance2p0.rs index 5c6694070f..a194e58b8e 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/muapi/plan_generate_video_muapi_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/muapi/plan_generate_video_muapi_seedance2p0.rs @@ -40,9 +40,9 @@ pub struct PlanMuapiSeedance2p0 { pub mode: MuapiSeedance2p0Mode, } -pub fn plan_generate_video_muapi_seedance2p0<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_muapi_seedance2p0( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; // Muapi does not support start/end frames, video references, or audio references. @@ -71,9 +71,9 @@ pub fn plan_generate_video_muapi_seedance2p0<'a>( })); } - let image_urls = resolve_image_urls(request.reference_images)?; + let image_urls = resolve_image_urls(request.reference_images.clone())?; - let prompt = request.prompt.unwrap_or("").to_string(); + let prompt = request.prompt.clone().unwrap_or_default(); let mode = match image_urls { Some(urls) => { @@ -100,7 +100,7 @@ pub fn plan_generate_video_muapi_seedance2p0<'a>( } fn resolve_image_urls( - reference_images: Option>, + reference_images: Option, ) -> Result>, ArtcraftRouterError> { match reference_images { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs index b8b505b86e..36ef34af75 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs @@ -23,23 +23,23 @@ pub struct PlanSeedance2proSeedance2p0 { pub batch_count: BatchCount, } -pub fn plan_generate_video_seedance2pro_seedance2p0<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_seedance2pro_seedance2p0( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame_url = resolve_image_ref_url(request.start_frame)?; - let end_frame_url = resolve_image_ref_url(request.end_frame)?; - let reference_image_urls = resolve_image_list_ref_urls(request.reference_images)?; - let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos)?; - let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio)?; + let start_frame_url = resolve_image_ref_url(request.start_frame.clone())?; + let end_frame_url = resolve_image_ref_url(request.end_frame.clone())?; + let reference_image_urls = resolve_image_list_ref_urls(request.reference_images.clone())?; + let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos.clone())?; + let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio.clone())?; let resolution = plan_resolution(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::Seedance2proSeedance2p0(PlanSeedance2proSeedance2p0 { - prompt: request.prompt.map(|p| p.to_string()), + prompt: request.prompt.clone(), start_frame_url, end_frame_url, reference_image_urls, @@ -52,7 +52,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0<'a>( } fn resolve_image_ref_url( - image_ref: Option>, + image_ref: Option, ) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), @@ -64,7 +64,7 @@ fn resolve_image_ref_url( } fn resolve_image_list_ref_urls( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), @@ -76,7 +76,7 @@ fn resolve_image_list_ref_urls( } fn resolve_video_list_ref_urls( - video_list_ref: Option>, + video_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match video_list_ref { None => Ok(None), @@ -88,7 +88,7 @@ fn resolve_video_list_ref_urls( } fn resolve_audio_list_ref_urls( - audio_list_ref: Option>, + audio_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match audio_list_ref { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs index c20f7f3a23..e6cb1a9cab 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs @@ -23,23 +23,23 @@ pub struct PlanSeedance2proSeedance2p0Fast { pub batch_count: BatchCount, } -pub fn plan_generate_video_seedance2pro_seedance2p0_fast<'a>( - request: &'a GenerateVideoRequest<'a>, -) -> Result, ArtcraftRouterError> { +pub fn plan_generate_video_seedance2pro_seedance2p0_fast( + request: &GenerateVideoRequest, +) -> Result { let strategy = request.request_mismatch_mitigation_strategy; - let start_frame_url = resolve_image_ref_url(request.start_frame)?; - let end_frame_url = resolve_image_ref_url(request.end_frame)?; - let reference_image_urls = resolve_image_list_ref_urls(request.reference_images)?; - let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos)?; - let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio)?; + let start_frame_url = resolve_image_ref_url(request.start_frame.clone())?; + let end_frame_url = resolve_image_ref_url(request.end_frame.clone())?; + let reference_image_urls = resolve_image_list_ref_urls(request.reference_images.clone())?; + let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos.clone())?; + let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio.clone())?; let resolution = plan_resolution(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; Ok(VideoGenerationPlan::Seedance2proSeedance2p0Fast(PlanSeedance2proSeedance2p0Fast { - prompt: request.prompt.map(|p| p.to_string()), + prompt: request.prompt.clone(), start_frame_url, end_frame_url, reference_image_urls, @@ -52,7 +52,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0_fast<'a>( } fn resolve_image_ref_url( - image_ref: Option>, + image_ref: Option, ) -> Result, ArtcraftRouterError> { match image_ref { None => Ok(None), @@ -64,7 +64,7 @@ fn resolve_image_ref_url( } fn resolve_image_list_ref_urls( - image_list_ref: Option>, + image_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match image_list_ref { None => Ok(None), @@ -76,7 +76,7 @@ fn resolve_image_list_ref_urls( } fn resolve_video_list_ref_urls( - video_list_ref: Option>, + video_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match video_list_ref { None => Ok(None), @@ -88,7 +88,7 @@ fn resolve_video_list_ref_urls( } fn resolve_audio_list_ref_urls( - audio_list_ref: Option>, + audio_list_ref: Option, ) -> Result>, ArtcraftRouterError> { match audio_list_ref { None => Ok(None), diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/video_generation_plan.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/video_generation_plan.rs index d008dc7b74..3bee61abce 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/video_generation_plan.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/video_generation_plan.rs @@ -114,25 +114,25 @@ use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_see use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; #[derive(Debug)] -pub enum VideoGenerationPlan<'a> { - ArtcraftKling16Pro(PlanArtcraftKling16Pro<'a>), - ArtcraftKling21Master(PlanArtcraftKling21Master<'a>), - ArtcraftKling21Pro(PlanArtcraftKling21Pro<'a>), - ArtcraftKling2p5TurboPro(PlanArtcraftKling2p5TurboPro<'a>), - ArtcraftKling2p6Pro(PlanArtcraftKling2p6Pro<'a>), - ArtcraftKling3p0Pro(PlanArtcraftKling3p0Pro<'a>), - ArtcraftKling3p0Standard(PlanArtcraftKling3p0Standard<'a>), - ArtcraftSeedance10Lite(PlanArtcraftSeedance10Lite<'a>), - ArtcraftSeedance1p5Pro(PlanArtcraftSeedance1p5Pro<'a>), - ArtcraftSeedance2p0(PlanArtcraftSeedance2p0<'a>), - ArtcraftSeedance2p0Fast(PlanArtcraftSeedance2p0<'a>), - ArtcraftSora2(PlanArtcraftSora2<'a>), - ArtcraftSora2Pro(PlanArtcraftSora2Pro<'a>), - ArtcraftVeo2(PlanArtcraftVeo2<'a>), - ArtcraftVeo3(PlanArtcraftVeo3<'a>), - ArtcraftVeo3Fast(PlanArtcraftVeo3Fast<'a>), - ArtcraftVeo3p1(PlanArtcraftVeo3p1<'a>), - ArtcraftVeo3p1Fast(PlanArtcraftVeo3p1Fast<'a>), +pub enum VideoGenerationPlan { + ArtcraftKling16Pro(PlanArtcraftKling16Pro), + ArtcraftKling21Master(PlanArtcraftKling21Master), + ArtcraftKling21Pro(PlanArtcraftKling21Pro), + ArtcraftKling2p5TurboPro(PlanArtcraftKling2p5TurboPro), + ArtcraftKling2p6Pro(PlanArtcraftKling2p6Pro), + ArtcraftKling3p0Pro(PlanArtcraftKling3p0Pro), + ArtcraftKling3p0Standard(PlanArtcraftKling3p0Standard), + ArtcraftSeedance10Lite(PlanArtcraftSeedance10Lite), + ArtcraftSeedance1p5Pro(PlanArtcraftSeedance1p5Pro), + ArtcraftSeedance2p0(PlanArtcraftSeedance2p0), + ArtcraftSeedance2p0Fast(PlanArtcraftSeedance2p0), + ArtcraftSora2(PlanArtcraftSora2), + ArtcraftSora2Pro(PlanArtcraftSora2Pro), + ArtcraftVeo2(PlanArtcraftVeo2), + ArtcraftVeo3(PlanArtcraftVeo3), + ArtcraftVeo3Fast(PlanArtcraftVeo3Fast), + ArtcraftVeo3p1(PlanArtcraftVeo3p1), + ArtcraftVeo3p1Fast(PlanArtcraftVeo3p1Fast), MuapiSeedance2p0(PlanMuapiSeedance2p0), Seedance2proSeedance2p0(PlanSeedance2proSeedance2p0), Seedance2proSeedance2p0Fast(PlanSeedance2proSeedance2p0Fast), @@ -154,7 +154,7 @@ pub enum VideoGenerationPlan<'a> { FalSora2Pro(PlanFalSora2Pro), } -impl<'a> VideoGenerationPlan<'a> { +impl VideoGenerationPlan { pub async fn generate_video( &self, client: &RouterClient, diff --git a/crates/api_clients/artcraft/artcraft_router/src/test_helpers.rs b/crates/api_clients/artcraft/artcraft_router/src/test_helpers.rs index 2f003763e4..8b7562eb84 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/test_helpers.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/test_helpers.rs @@ -21,11 +21,11 @@ pub fn get_artcraft_client() -> RouterClient { RouterClient::Artcraft(RouterArtcraftClient::new(ApiHost::Storyteller, credentials)) } -pub fn base_image_request() -> GenerateImageRequest<'static> { +pub fn base_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::NanoBananaPro, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -48,11 +48,11 @@ pub fn get_fal_client() -> RouterClient { RouterClient::Fal(RouterFalClient::new(api_key, webhook_url)) } -pub fn base_fal_image_request() -> GenerateImageRequest<'static> { +pub fn base_fal_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::NanoBananaPro, provider: Provider::Fal, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -67,11 +67,11 @@ pub fn base_fal_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_seedream_4_image_request() -> GenerateImageRequest<'static> { +pub fn base_seedream_4_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Seedream4, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -86,11 +86,11 @@ pub fn base_seedream_4_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_seedream_4p5_image_request() -> GenerateImageRequest<'static> { +pub fn base_seedream_4p5_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Seedream4p5, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -105,11 +105,11 @@ pub fn base_seedream_4p5_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_seedream_5_lite_image_request() -> GenerateImageRequest<'static> { +pub fn base_seedream_5_lite_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Seedream5Lite, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -124,11 +124,11 @@ pub fn base_seedream_5_lite_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_nano_banana_2_image_request() -> GenerateImageRequest<'static> { +pub fn base_nano_banana_2_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::NanoBanana2, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -143,11 +143,11 @@ pub fn base_nano_banana_2_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_nano_banana_image_request() -> GenerateImageRequest<'static> { +pub fn base_nano_banana_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::NanoBanana, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -162,11 +162,11 @@ pub fn base_nano_banana_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_gpt_image_1_image_request() -> GenerateImageRequest<'static> { +pub fn base_gpt_image_1_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::GptImage1, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -181,11 +181,11 @@ pub fn base_gpt_image_1_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_gpt_image_1p5_image_request() -> GenerateImageRequest<'static> { +pub fn base_gpt_image_1p5_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::GptImage1p5, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -200,11 +200,11 @@ pub fn base_gpt_image_1p5_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_flux_1_dev_image_request() -> GenerateImageRequest<'static> { +pub fn base_flux_1_dev_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Flux1Dev, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -219,11 +219,11 @@ pub fn base_flux_1_dev_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_flux_1_schnell_image_request() -> GenerateImageRequest<'static> { +pub fn base_flux_1_schnell_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Flux1Schnell, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -238,11 +238,11 @@ pub fn base_flux_1_schnell_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_flux_pro_1p1_image_request() -> GenerateImageRequest<'static> { +pub fn base_flux_pro_1p1_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::FluxPro11, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -257,7 +257,7 @@ pub fn base_flux_pro_1p1_image_request() -> GenerateImageRequest<'static> { } } -pub fn base_qwen_edit_2511_angles_image_request() -> GenerateImageRequest<'static> { +pub fn base_qwen_edit_2511_angles_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::QwenEdit2511Angles, provider: Provider::Artcraft, @@ -276,7 +276,7 @@ pub fn base_qwen_edit_2511_angles_image_request() -> GenerateImageRequest<'stati } } -pub fn base_flux_2_lora_angles_image_request() -> GenerateImageRequest<'static> { +pub fn base_flux_2_lora_angles_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::Flux2LoraAngles, provider: Provider::Artcraft, @@ -295,11 +295,11 @@ pub fn base_flux_2_lora_angles_image_request() -> GenerateImageRequest<'static> } } -pub fn base_flux_pro_1p1_ultra_image_request() -> GenerateImageRequest<'static> { +pub fn base_flux_pro_1p1_ultra_image_request() -> GenerateImageRequest { GenerateImageRequest { model: CommonImageModel::FluxPro11Ultra, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), image_inputs: None, resolution: None, aspect_ratio: None, @@ -314,11 +314,11 @@ pub fn base_flux_pro_1p1_ultra_image_request() -> GenerateImageRequest<'static> } } -pub fn base_video_request() -> GenerateVideoRequest<'static> { +pub fn base_video_request() -> GenerateVideoRequest { GenerateVideoRequest { model: CommonVideoModel::Seedance2p0, provider: Provider::Artcraft, - prompt: Some("a cat in space"), + prompt: Some("a cat in space".to_string()), negative_prompt: None, start_frame: None, end_frame: None,