mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-04 01:18:34 +00:00
refactoring .. starting to take shape
This commit is contained in:
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),
|
||||
}
|
||||
|
||||
+18
-3
@@ -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;
|
||||
+7
-6
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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> {
|
||||
|
||||
-23
@@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
@@ -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))
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
-15
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
+20
@@ -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
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user