refactoring .. starting to take shape

This commit is contained in:
Brandon Thomas committed 2026-04-20 18:55:00 -04:00
1 parent fa12020e8a
commit df2a890f71
9 files changed
+83 -50

No files matched your search

@@ -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),
}
@@ -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<VideoGenerationDraftRequest, ArtcraftRouterError> {
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<VideoGenerationPlan, ArtcraftRouterError> {
match self.provider {
@@ -188,6 +197,12 @@ impl GenerateVideoRequestBuilder {
))
}
fn unsupported_provider_and_model(&self) -> Result<VideoGenerationDraftRequest, ArtcraftRouterError> {
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())
@@ -1,3 +1,3 @@
pub mod providers;
pub mod video_generation_ready_request;
pub mod video_generation_draft;
pub mod video_generation_request;
pub mod video_generation_draft_request;
@@ -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<GenerateVideoRequest>,
pub remaining_request: Option<GenerateVideoRequestBuilder>,
// pub start_frame: Option<ImageRef>,
// pub end_frame: Option<ImageRef>,
@@ -35,7 +36,7 @@ pub struct KinoviSeedance2p0DraftRequest {
}
impl KinoviSeedance2p0DraftRequest {
pub fn from_request(mut request: GenerateVideoRequest) -> Result<Self, ArtcraftRouterError> {
pub fn from_builder(mut request: GenerateVideoRequestBuilder) -> Result<VideoGenerationDraftRequest, ArtcraftRouterError> {
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 {
@@ -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<Self, ArtcraftRouterError> {
@@ -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<VideoGenerationCostEstimate, ArtcraftRouterError> {
match self {
VideoGenerationDraft::KinoviSeedance2p0(draft) => Ok(draft.estimate_cost()),
}
}
pub fn prepare_final(&self) -> Result<(), String> {
match self {
VideoGenerationDraft::KinoviSeedance2p0(plan) => plan.prepare_final(),
}
}
}
@@ -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<VideoGenerationCostEstimate, ArtcraftRouterError> {
match self {
VideoGenerationDraftRequest::KinoviSeedance2p0(draft) => Ok(draft.estimate_cost()),
}
}
pub async fn finalize(self, client: &RouterClient) -> Result<VideoGenerationRequest, ArtcraftRouterError> {
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))
},
}
}
}
@@ -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,
}
}
}
@@ -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<GenerateVideoResponse, ArtcraftRouterError> {
match self {
VideoGenerationRequest::KinoviSeedance2p0(request) => {
let client_ref = client.get_seedance2pro_client_ref()?;
request.send(client_ref).await
},
}
}
}