From df2a890f7135bc024e3a3a06cbeb1af36d2eb269 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 20 Apr 2026 18:55:00 -0400 Subject: [PATCH] refactoring .. starting to take shape --- .../src/errors/artcraft_router_error.rs | 4 +++ .../generate_video_request_builder.rs | 21 +++++++++++-- .../src/generate/generate_video_v2/mod.rs | 4 +-- .../kinovi/seedance_2p0/draft_request.rs | 13 ++++---- .../kinovi/seedance_2p0/ready_request.rs | 2 +- .../video_generation_draft.rs | 23 -------------- .../video_generation_draft_request.rs | 31 +++++++++++++++++++ .../video_generation_ready_request.rs | 15 --------- .../video_generation_request.rs | 20 ++++++++++++ 9 files changed, 83 insertions(+), 50 deletions(-) delete mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft.rs create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft_request.rs delete mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_ready_request.rs create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_request.rs diff --git a/crates/api_clients/artcraft/artcraft_router/src/errors/artcraft_router_error.rs b/crates/api_clients/artcraft/artcraft_router/src/errors/artcraft_router_error.rs index 111d8d4941..0cf8db90e7 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/errors/artcraft_router_error.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/errors/artcraft_router_error.rs @@ -15,6 +15,9 @@ pub enum ArtcraftRouterError { /// The requested model is not yet supported by the router. UnsupportedModel(String), + /// [Temporary during migration] The requested model/provider is not yet supported by the router. + UnsupportedProviderAndModelForNewApi(String), + /// Invalid or missing input arguments. InvalidInput(String), @@ -30,6 +33,7 @@ impl Display for ArtcraftRouterError { Self::Client(e) => write!(f, "Client error: {}", e), Self::Download(e) => write!(f, "Download error: {}", e), Self::UnsupportedModel(model) => write!(f, "Unsupported model: {}", model), + Self::UnsupportedProviderAndModelForNewApi(msg) => write!(f, "Unsupported provider/model (for new API during migration): {}", msg), Self::InvalidInput(msg) => write!(f, "Invalid input: {}", msg), Self::Provider(e) => write!(f, "Provider error: {}", e), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request_builder.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request_builder.rs index 480955e404..3cb0948ba1 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request_builder.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/generate_video_request_builder.rs @@ -9,17 +9,17 @@ use crate::api::provider::Provider; use crate::api::video_list_ref::VideoListRef; use crate::client::request_mismatch_mitigation_strategy::RequestMismatchMitigationStrategy; use crate::errors::artcraft_router_error::ArtcraftRouterError; +use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling3p0_pro::plan_generate_video_artcraft_kling3p0_pro; +use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling3p0_standard::plan_generate_video_artcraft_kling3p0_standard; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling_1_6_pro::plan_generate_video_artcraft_kling_1_6_pro; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling_2_1_master::plan_generate_video_artcraft_kling_2_1_master; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling_2_1_pro::plan_generate_video_artcraft_kling_2_1_pro; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling_2_5_turbo_pro::plan_generate_video_artcraft_kling_2_5_turbo_pro; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling_2_6_pro::plan_generate_video_artcraft_kling_2_6_pro; -use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling3p0_pro::plan_generate_video_artcraft_kling3p0_pro; -use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_kling3p0_standard::plan_generate_video_artcraft_kling3p0_standard; -use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance_1_0_lite::plan_generate_video_artcraft_seedance_1_0_lite; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance1p5_pro::plan_generate_video_artcraft_seedance1p5_pro; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance2p0::plan_generate_video_artcraft_seedance2p0; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance2p0_fast::plan_generate_video_artcraft_seedance2p0_fast; +use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance_1_0_lite::plan_generate_video_artcraft_seedance_1_0_lite; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_sora_2::plan_generate_video_artcraft_sora_2; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_sora_2_pro::plan_generate_video_artcraft_sora_2_pro; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_veo_2::plan_generate_video_artcraft_veo_2; @@ -47,6 +47,8 @@ use crate::generate::generate_video::plan::muapi::plan_generate_video_muapi_seed use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0::plan_generate_video_seedance2pro_seedance2p0; use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0_fast::plan_generate_video_seedance2pro_seedance2p0_fast; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; +use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::draft_request::KinoviSeedance2p0DraftRequest; +use crate::generate::generate_video_v2::video_generation_draft_request::VideoGenerationDraftRequest; /// Plan to either (1) generate a video or (2) determine how much it costs to generate that video. /// This works across multiple providers by shaping a generic "GenerateVideoRequest" into a provider-specific plan. @@ -110,6 +112,13 @@ pub struct GenerateVideoRequestBuilder { } impl GenerateVideoRequestBuilder { + pub fn to_draft(self) -> Result { + match (self.provider, self.model) { + (Provider::Seedance2Pro, CommonVideoModel::Seedance2p0) => Ok(KinoviSeedance2p0DraftRequest::from_builder(self)?), + _ => self.unsupported_provider_and_model(), + } + } + /// Read the video generation request, construct a plan, then yield a means to execute it. pub fn build(&self) -> Result { match self.provider { @@ -188,6 +197,12 @@ impl GenerateVideoRequestBuilder { )) } + fn unsupported_provider_and_model(&self) -> Result { + Err(ArtcraftRouterError::UnsupportedProviderAndModelForNewApi( + format!("Video generation for model `{:?}` is not supported for provider {:?} using the new API", self.model, self.provider) + )) + } + pub fn get_or_generate_idempotency_token(&self) -> 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_v2/mod.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/mod.rs index 684a452e4e..e0ce54d488 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/mod.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/mod.rs @@ -1,3 +1,3 @@ pub mod providers; -pub mod video_generation_ready_request; -pub mod video_generation_draft; \ No newline at end of file +pub mod video_generation_request; +pub mod video_generation_draft_request; \ No newline at end of file diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/draft_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/draft_request.rs index 87926d4a51..11d0796cf6 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/draft_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/draft_request.rs @@ -1,7 +1,8 @@ use crate::errors::artcraft_router_error::ArtcraftRouterError; -use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; -use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::type_conversions::{map_common_resolution_to_kinovi, plan_aspect_ratio, plan_batch_count, plan_duration}; +use crate::generate::generate_video::generate_video_request_builder::GenerateVideoRequestBuilder; use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; +use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::type_conversions::{map_common_resolution_to_kinovi, plan_aspect_ratio, plan_batch_count, plan_duration}; +use crate::generate::generate_video_v2::video_generation_draft_request::VideoGenerationDraftRequest; use seedance2pro_client::requests::generate_video::generate_video::{KinoviAspectRatio, KinoviBatchCount, KinoviGenerateVideoRequest, KinoviModelType, KinoviOutputResolution}; #[derive(Debug, Clone)] @@ -24,7 +25,7 @@ pub struct KinoviSeedance2p0DraftRequest { // Pending types that need to be queried. - pub remaining_request: Option, + pub remaining_request: Option, // pub start_frame: Option, // pub end_frame: Option, @@ -35,7 +36,7 @@ pub struct KinoviSeedance2p0DraftRequest { } impl KinoviSeedance2p0DraftRequest { - pub fn from_request(mut request: GenerateVideoRequest) -> Result { + pub fn from_builder(mut request: GenerateVideoRequestBuilder) -> Result { let strategy = request.request_mismatch_mitigation_strategy; let aspect_ratio = plan_aspect_ratio(request.aspect_ratio, strategy)?; @@ -45,14 +46,14 @@ impl KinoviSeedance2p0DraftRequest { let prompt = request.prompt.take().unwrap_or_default(); // TODO: Fill out body - Ok(Self { + Ok(VideoGenerationDraftRequest::KinoviSeedance2p0(Self { aspect_ratio, resolution, batch_count, duration_seconds, prompt, remaining_request: Some(request), - }) + })) } pub fn estimate_cost(&self) -> VideoGenerationCostEstimate { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/ready_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/ready_request.rs index 7b90b87545..69b7bca359 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/ready_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/providers/kinovi/seedance_2p0/ready_request.rs @@ -13,7 +13,7 @@ pub struct KinoviSeedance2p0ReadyRequest { impl KinoviSeedance2p0ReadyRequest { - pub async fn from_ready_request( + pub async fn from_draft( mut request: KinoviSeedance2p0DraftRequest, client: &RouterSeedance2ProClient, ) -> Result { diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft.rs deleted file mode 100644 index e220d205c3..0000000000 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::errors::artcraft_router_error::ArtcraftRouterError; -use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; -use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::draft_request::KinoviSeedance2p0DraftRequest; - -#[derive(Clone, Debug)] -pub enum VideoGenerationDraft { - KinoviSeedance2p0(KinoviSeedance2p0DraftRequest), -} - -impl VideoGenerationDraft { - - pub fn estimate_cost(&self) -> Result { - match self { - VideoGenerationDraft::KinoviSeedance2p0(draft) => Ok(draft.estimate_cost()), - } - } - - pub fn prepare_final(&self) -> Result<(), String> { - match self { - VideoGenerationDraft::KinoviSeedance2p0(plan) => plan.prepare_final(), - } - } -} diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft_request.rs new file mode 100644 index 0000000000..79c2f5c427 --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_draft_request.rs @@ -0,0 +1,31 @@ +use crate::client::router_client::RouterClient; +use crate::errors::artcraft_router_error::ArtcraftRouterError; +use crate::errors::client_error::{ClientError, ClientType}; +use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; +use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::draft_request::KinoviSeedance2p0DraftRequest; +use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::ready_request::KinoviSeedance2p0ReadyRequest; +use crate::generate::generate_video_v2::video_generation_request::VideoGenerationRequest; + +#[derive(Clone, Debug)] +pub enum VideoGenerationDraftRequest { + KinoviSeedance2p0(KinoviSeedance2p0DraftRequest), +} + +impl VideoGenerationDraftRequest { + + pub fn estimate_cost(&self) -> Result { + match self { + VideoGenerationDraftRequest::KinoviSeedance2p0(draft) => Ok(draft.estimate_cost()), + } + } + + pub async fn finalize(self, client: &RouterClient) -> Result { + match self { + VideoGenerationDraftRequest::KinoviSeedance2p0(draft) => { + let client_ref = client.get_seedance2pro_client_ref()?; + let result = KinoviSeedance2p0ReadyRequest::from_draft(draft, client_ref).await?; + Ok(VideoGenerationRequest::KinoviSeedance2p0(result)) + }, + } + } +} diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_ready_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_ready_request.rs deleted file mode 100644 index b82a8fb046..0000000000 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_ready_request.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::errors::artcraft_router_error::ArtcraftRouterError; -use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::ready_request::KinoviSeedance2p0ReadyRequest; - -#[derive(Clone, Debug)] -pub enum VideoGenerationReadyRequest { - KinoviSeedance2p0(KinoviSeedance2p0ReadyRequest), -} - -impl VideoGenerationReadyRequest { - pub async fn send_request(&self) -> Result<(), ArtcraftRouterError> { - match self { - VideoGenerationReadyRequest::KinoviSeedance2p0(request) => request.send().await, - } - } -} diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_request.rs new file mode 100644 index 0000000000..c796b3c56c --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video_v2/video_generation_request.rs @@ -0,0 +1,20 @@ +use crate::client::router_client::RouterClient; +use crate::errors::artcraft_router_error::ArtcraftRouterError; +use crate::generate::generate_video::generate_video_response::GenerateVideoResponse; +use crate::generate::generate_video_v2::providers::kinovi::seedance_2p0::ready_request::KinoviSeedance2p0ReadyRequest; + +#[derive(Clone, Debug)] +pub enum VideoGenerationRequest { + KinoviSeedance2p0(KinoviSeedance2p0ReadyRequest), +} + +impl VideoGenerationRequest { + pub async fn send_request(&self, client: &RouterClient) -> Result { + match self { + VideoGenerationRequest::KinoviSeedance2p0(request) => { + let client_ref = client.get_seedance2pro_client_ref()?; + request.send(client_ref).await + }, + } + } +}