From 9949178a4bb7feff139760dd2ff2ef586aaf00e1 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 23 Feb 2026 15:08:32 +0700 Subject: [PATCH] imgref --- .../artcraft_router/src/api/image_list_ref.rs | 6 ++++ .../lib/artcraft_router/src/api/image_ref.rs | 6 ++++ crates/lib/artcraft_router/src/api/mod.rs | 2 ++ .../src/errors/client_error.rs | 7 ----- .../generate_video_artcraft_seedance2p0.rs | 21 +++++++++++-- .../generate/generate_video/generate_video.rs | 15 ---------- .../generate_video/generate_video_request.rs | 30 +++++-------------- 7 files changed, 40 insertions(+), 47 deletions(-) create mode 100644 crates/lib/artcraft_router/src/api/image_list_ref.rs create mode 100644 crates/lib/artcraft_router/src/api/image_ref.rs diff --git a/crates/lib/artcraft_router/src/api/image_list_ref.rs b/crates/lib/artcraft_router/src/api/image_list_ref.rs new file mode 100644 index 0000000000..6b057ed906 --- /dev/null +++ b/crates/lib/artcraft_router/src/api/image_list_ref.rs @@ -0,0 +1,6 @@ +use tokens::tokens::media_files::MediaFileToken; + +pub enum ImageListRef<'a> { + MediaFileTokens(&'a Vec), + Urls(&'a Vec), +} diff --git a/crates/lib/artcraft_router/src/api/image_ref.rs b/crates/lib/artcraft_router/src/api/image_ref.rs new file mode 100644 index 0000000000..617a27bdc1 --- /dev/null +++ b/crates/lib/artcraft_router/src/api/image_ref.rs @@ -0,0 +1,6 @@ +use tokens::tokens::media_files::MediaFileToken; + +pub enum ImageRef<'a> { + MediaFileToken(&'a MediaFileToken), + Url(&'a str), +} diff --git a/crates/lib/artcraft_router/src/api/mod.rs b/crates/lib/artcraft_router/src/api/mod.rs index f48eb31eb2..b9f9b51850 100644 --- a/crates/lib/artcraft_router/src/api/mod.rs +++ b/crates/lib/artcraft_router/src/api/mod.rs @@ -1,4 +1,6 @@ pub mod common_aspect_ratio; pub mod common_resolution; pub mod common_video_model; +pub mod image_list_ref; +pub mod image_ref; pub mod provider; diff --git a/crates/lib/artcraft_router/src/errors/client_error.rs b/crates/lib/artcraft_router/src/errors/client_error.rs index 4ba729996f..61fba9acf7 100644 --- a/crates/lib/artcraft_router/src/errors/client_error.rs +++ b/crates/lib/artcraft_router/src/errors/client_error.rs @@ -18,10 +18,6 @@ impl Display for ClientType { pub enum ClientError { /// The requested client is not configured on the RouterClient. ClientNotConfigured(ClientType), - - /// Both a URL and a media token were supplied for the same field. - /// The field name is included for debugging. - UrlAndMediaTokenSupplied(String), } impl Error for ClientError {} @@ -32,9 +28,6 @@ impl Display for ClientError { Self::ClientNotConfigured(client_type) => { write!(f, "{} client is not configured on the RouterClient", client_type) } - Self::UrlAndMediaTokenSupplied(field) => { - write!(f, "Both a URL and a media token were supplied for '{}'; supply only one", field) - } } } } diff --git a/crates/lib/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs b/crates/lib/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs index 7cbcce1384..bf064b0b3d 100644 --- a/crates/lib/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs +++ b/crates/lib/artcraft_router/src/generate/generate_video/execute/artcraft/generate_video_artcraft_seedance2p0.rs @@ -1,4 +1,6 @@ use crate::api::common_aspect_ratio::CommonAspectRatio; +use crate::api::image_ref::ImageRef; +use crate::api::image_list_ref::ImageListRef; use crate::client::router_artcraft_client::RouterArtcraftClient; use crate::errors::artcraft_router_error::ArtcraftRouterError; use crate::errors::provider_error::ProviderError; @@ -40,12 +42,25 @@ pub async fn generate_video_artcraft_seedance2p0( _ => Seedance2p0BatchCount::One, }; + let start_frame_media_token = match &request.start_frame { + Some(ImageRef::MediaFileToken(t)) => Some((*t).to_owned()), + _ => None, + }; + let end_frame_media_token = match &request.end_frame { + Some(ImageRef::MediaFileToken(t)) => Some((*t).to_owned()), + _ => None, + }; + let reference_image_media_tokens = match &request.reference_images { + Some(ImageListRef::MediaFileTokens(tokens)) => Some((*tokens).to_owned()), + _ => None, + }; + let request = Seedance2p0MultiFunctionVideoGenRequest { uuid_idempotency_token, prompt, - start_frame_media_token: request.start_frame_media_token.map(|t| t.to_owned()), - end_frame_media_token: request.end_frame_media_token.map(|t| t.to_owned()), - reference_image_media_tokens: request.reference_image_media_tokens.map(|tokens| tokens.to_owned()), + start_frame_media_token, + end_frame_media_token, + reference_image_media_tokens, aspect_ratio, duration_seconds: None, batch_count: Some(batch_count), diff --git a/crates/lib/artcraft_router/src/generate/generate_video/generate_video.rs b/crates/lib/artcraft_router/src/generate/generate_video/generate_video.rs index d880960bb4..1956b7d4d3 100644 --- a/crates/lib/artcraft_router/src/generate/generate_video/generate_video.rs +++ b/crates/lib/artcraft_router/src/generate/generate_video/generate_video.rs @@ -1,7 +1,6 @@ use crate::api::common_video_model::CommonVideoModel; use crate::api::provider::Provider; use crate::errors::artcraft_router_error::ArtcraftRouterError; -use crate::errors::client_error::ClientError; use crate::generate::generate_video::execute::artcraft::generate_video_artcraft_seedance2p0::generate_video_artcraft_seedance2p0; use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use tokens::tokens::generic_inference_jobs::InferenceJobToken; @@ -14,23 +13,9 @@ pub struct GenerateVideoResponse { pub all_inference_job_tokens: Vec, } -fn validate_request(args: &GenerateVideoRequest<'_>) -> Result<(), ClientError> { - if args.start_frame_url.is_some() && args.start_frame_media_token.is_some() { - return Err(ClientError::UrlAndMediaTokenSupplied("start_frame".to_string())); - } - if args.end_frame_url.is_some() && args.end_frame_media_token.is_some() { - return Err(ClientError::UrlAndMediaTokenSupplied("end_frame".to_string())); - } - if args.reference_image_urls.is_some() && args.reference_image_media_tokens.is_some() { - return Err(ClientError::UrlAndMediaTokenSupplied("reference_images".to_string())); - } - Ok(()) -} - pub async fn generate_video( args: &GenerateVideoRequest<'_>, ) -> Result { - validate_request(args)?; match args.provider { Provider::Artcraft => { diff --git a/crates/lib/artcraft_router/src/generate/generate_video/generate_video_request.rs b/crates/lib/artcraft_router/src/generate/generate_video/generate_video_request.rs index e9d2a28996..a162908f9b 100644 --- a/crates/lib/artcraft_router/src/generate/generate_video/generate_video_request.rs +++ b/crates/lib/artcraft_router/src/generate/generate_video/generate_video_request.rs @@ -1,9 +1,10 @@ use crate::api::common_aspect_ratio::CommonAspectRatio; use crate::api::common_resolution::CommonVideoResolution; use crate::api::common_video_model::CommonVideoModel; +use crate::api::image_list_ref::ImageListRef; +use crate::api::image_ref::ImageRef; use crate::api::provider::Provider; use crate::client::router_client::RouterClient; -use tokens::tokens::media_files::MediaFileToken; use crate::client::request_mismatch_mitigation_strategy::RequestMismatchMitigationStrategy; pub struct GenerateVideoRequest<'a> { @@ -19,29 +20,14 @@ pub struct GenerateVideoRequest<'a> { // /// Some models support negative prompts // pub negative_prompt: Option, - /// Starting keyframe (optional). Must be a URL. - /// Mutually exclusive with `start_frame_media_token`. - pub start_frame_url: Option<&'a str>, + /// Starting keyframe (optional). + pub start_frame: Option>, - /// Starting keyframe as a media token (optional). - /// Mutually exclusive with `start_frame_url`. - pub start_frame_media_token: Option<&'a MediaFileToken>, + /// Ending keyframe (optional). + pub end_frame: Option>, - /// Ending keyframe (optional). Must be a URL. - /// Mutually exclusive with `end_frame_media_token`. - pub end_frame_url: Option<&'a str>, - - /// Ending keyframe as a media token (optional). - /// Mutually exclusive with `end_frame_url`. - pub end_frame_media_token: Option<&'a MediaFileToken>, - - /// Reference image URLs (optional). - /// Mutually exclusive with `reference_image_media_tokens`. - pub reference_image_urls: Option<&'a Vec>, - - /// Reference image media tokens (optional). - /// Mutually exclusive with `reference_image_urls`. - pub reference_image_media_tokens: Option<&'a Vec>, + /// Reference images (optional). + pub reference_images: Option>, /// The resolution to use pub resolution: Option,