Compare commits

...
59 changed files with 56 additions and 66 deletions
Generated
+5 -6
View File
@@ -790,7 +790,7 @@ dependencies = [
"log",
"muapi_client",
"reqwest 0.12.23",
"seedance2pro",
"seedance2pro_client",
"serde",
"serde_derive",
"strum 0.28.0",
@@ -10489,7 +10489,7 @@ dependencies = [
"log",
"mysql_queries",
"reqwest 0.12.23",
"seedance2pro",
"seedance2pro_client",
"serde",
"serde_derive",
"serde_json",
@@ -10501,7 +10501,7 @@ dependencies = [
]
[[package]]
name = "seedance2pro"
name = "seedance2pro_client"
version = "0.0.1"
dependencies = [
"chrono",
@@ -11576,7 +11576,6 @@ dependencies = [
"easyenv",
"elasticsearch",
"elasticsearch_schema",
"email_sender",
"enums",
"enums_public",
"errors",
@@ -11620,7 +11619,7 @@ dependencies = [
"reusable_types",
"rust-s3",
"rustls 0.23.36",
"seedance2pro",
"seedance2pro_client",
"serde",
"serde_derive",
"serde_json",
@@ -11802,7 +11801,7 @@ dependencies = [
"easyenv",
"errors",
"log",
"seedance2pro",
"seedance2pro_client",
"serde_json",
"tokio",
]
+2 -2
View File
@@ -17,7 +17,7 @@ members = [
"crates/api_clients/openai_sora_client",
"crates/api_clients/openart_client",
"crates/api_clients/muapi_client",
"crates/api_clients/seedance2pro",
"crates/api_clients/seedance2pro_client",
"crates/api_clients/runwayml_client",
"crates/api_clients/thumbnail_generator",
"crates/api_clients/world_labs_api",
@@ -252,7 +252,7 @@ muapi_client = { path = "crates/api_clients/muapi_client" }
mysql_queries = { path = "crates/schema/database/mysql_queries" }
openai_sora_client = { path = "crates/api_clients/openai_sora_client" }
primitives = { path = "crates/lib/data/primitives" }
seedance2pro = { path = "crates/api_clients/seedance2pro" }
seedance2pro_client = { path = "crates/api_clients/seedance2pro_client" }
shared_service_components = { path = "crates/lib/shared_service_components" }
sqlite_tasks = { path = "crates/schema/database/sqlite_tasks" }
subprocess_common = { path = "crates/lib/subprocess_common" }
@@ -20,7 +20,7 @@ artcraft_api_defs.workspace = true
artcraft_client.workspace = true
fal_client.workspace = true
muapi_client.workspace = true
seedance2pro.workspace = true
seedance2pro_client.workspace = true
tokens.workspace = true
url_utils.workspace = true
world_labs_api.workspace = true
@@ -1,4 +1,4 @@
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
pub struct RouterSeedance2ProClient {
pub(crate) session: Seedance2ProSession,
@@ -3,7 +3,7 @@ use std::fmt::{Display, Formatter};
use artcraft_client::error::storyteller_error::StorytellerError;
use fal_client::error::fal_error_plus::FalErrorPlus;
use muapi_client::error::muapi_error::MuapiError;
use seedance2pro::error::seedance2pro_error::Seedance2ProError;
use seedance2pro_client::error::seedance2pro_error::Seedance2ProError;
#[derive(Debug)]
pub enum ProviderError {
@@ -1,6 +1,6 @@
use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_function_video_gen::Seedance2p0BatchCount;
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro::requests::generate_video::generate_video::{BatchCount, GenerateVideoArgs, Resolution};
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::generate_video::generate_video::{BatchCount, GenerateVideoArgs, Resolution};
use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance2p0::PlanArtcraftSeedance2p0;
use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate;
@@ -1,5 +1,5 @@
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro::requests::generate_video::generate_video::{GenerateVideoArgs, Resolution};
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoArgs, Resolution};
use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0::PlanSeedance2proSeedance2p0;
use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate;
@@ -6,13 +6,13 @@ use crate::generate::generate_video::generate_video_response::{
};
use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0::PlanSeedance2proSeedance2p0;
use crate::utils::download_file::download_file;
use seedance2pro::requests::generate_video::generate_video::{
use seedance2pro_client::requests::generate_video::generate_video::{
generate_video, GenerateVideoArgs,
};
use seedance2pro::requests::prepare_file_upload::prepare_file_upload::{
use seedance2pro_client::requests::prepare_file_upload::prepare_file_upload::{
prepare_file_upload, PrepareFileUploadArgs,
};
use seedance2pro::requests::upload_file::upload_file::{
use seedance2pro_client::requests::upload_file::upload_file::{
upload_file, UploadFileArgs,
};
use url_utils::extension::extract_extension_from_url::{
@@ -58,7 +58,7 @@ pub async fn execute_seedance2pro_seedance2p0(
/// Downloads a file from a source URL and re-uploads it to seedance2pro CDN.
async fn upload_to_seedance2pro(
session: &seedance2pro::creds::seedance2pro_session::Seedance2ProSession,
session: &seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession,
source_url: &str,
) -> Result<String, ArtcraftRouterError> {
let extension = extract_extension_from_url_str(source_url, &ExtractExtensions::All)
@@ -85,7 +85,7 @@ async fn upload_to_seedance2pro(
}
async fn upload_optional_url(
session: &seedance2pro::creds::seedance2pro_session::Seedance2ProSession,
session: &seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession,
url: Option<&str>,
) -> Result<Option<String>, ArtcraftRouterError> {
match url {
@@ -95,7 +95,7 @@ async fn upload_optional_url(
}
async fn upload_optional_url_list(
session: &seedance2pro::creds::seedance2pro_session::Seedance2ProSession,
session: &seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession,
urls: Option<&[String]>,
) -> Result<Option<Vec<String>>, ArtcraftRouterError> {
match urls {
@@ -8,7 +8,7 @@ use crate::errors::artcraft_router_error::ArtcraftRouterError;
use crate::errors::client_error::ClientError;
use crate::generate::generate_video::generate_video_request::GenerateVideoRequest;
use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan;
use seedance2pro::requests::generate_video::generate_video::{BatchCount, Resolution};
use seedance2pro_client::requests::generate_video::generate_video::{BatchCount, Resolution};
#[derive(Debug, Clone)]
pub struct PlanSeedance2proSeedance2p0 {
@@ -1,5 +1,5 @@
[package]
name = "seedance2pro"
name = "seedance2pro_client"
edition = "2024"
version = "0.0.1"
publish = false
@@ -8,7 +8,7 @@ publish = false
normal = ["workspace-build-acceleration"]
[lib]
name = "seedance2pro"
name = "seedance2pro_client"
path = "src/lib.rs"
[dependencies]
@@ -12,7 +12,7 @@ easyenv.workspace = true
# Internal
errors.workspace = true
seedance2pro.workspace = true
seedance2pro_client.workspace = true
# External
anyhow.workspace = true
@@ -2,9 +2,9 @@ use std::collections::BTreeMap;
use anyhow::anyhow;
use log::info;
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro::requests::poll_orders::failure_type::FailureType;
use seedance2pro::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs, TaskStatus};
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::poll_orders::failure_type::FailureType;
use seedance2pro_client::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs, TaskStatus};
use super::super::state::Seedance2ProState;
@@ -1,8 +1,8 @@
use anyhow::anyhow;
use clap::Args;
use log::info;
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs};
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs};
use super::super::state::Seedance2ProState;
@@ -48,7 +48,7 @@ pub async fn run(state: &Seedance2ProState, args: FindJobArgs) -> anyhow::Result
std::process::exit(1);
}
fn order_to_json(order: &seedance2pro::requests::poll_orders::poll_orders::OrderStatus) -> serde_json::Value {
fn order_to_json(order: &seedance2pro_client::requests::poll_orders::poll_orders::OrderStatus) -> serde_json::Value {
serde_json::json!({
"order_id": order.order_id,
"task_status": format!("{:?}", order.task_status),
@@ -43,7 +43,7 @@ use artcraft_client::endpoints::media_files::upload_video_media_file_from_file::
use artcraft_client::endpoints::prompts::create_prompt::create_prompt;
use tauri::AppHandle;
use tempdir::TempDir;
use url_utils::extension::extract_download_extension_from_url::{extract_download_extension_from_url, extract_download_extension_from_url_str};
use url_utils::download_extension::extract_download_extension_from_url::{extract_download_extension_from_url, extract_download_extension_from_url_str};
pub struct SuccessfulGeneration {
pub prompt: Option<String>,
@@ -57,7 +57,7 @@ use artcraft_client::recipes::upload_media_file_from_file::upload_media_file_fro
use tauri::AppHandle;
use tokens::tokens::batch_generations::BatchGenerationToken;
use url::Url;
use url_utils::extension::extract_download_extension_from_url::extract_download_extension_from_url_str;
use url_utils::download_extension::extract_download_extension_from_url::extract_download_extension_from_url_str;
use world_labs_client::api::api_types::world_id::WorldObjectId;
use world_labs_client::api::requests::worlds::poll_world_status::{poll_world_status, PollWorldStatusArgs};
use world_labs_client::credentials::world_labs_bearer_token::WorldLabsBearerToken;
@@ -1,5 +1,6 @@
/// When downloading a remote file, it makes sense to try to match the same file extension (with reasonable safeguards).
#[deprecated(note = "Use `Extension` in `url_utils::extension::extension` instead")]
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum DownloadExtension {
// Image
@@ -1,13 +1,15 @@
use crate::extension::download_extension::DownloadExtension;
use crate::download_extension::DownloadExtension;
use url::Url;
/// This should be used for naming files on the local file system based on their URL.
#[deprecated(note = "Use `extract_extension_from_url_str` in `url_utils::extension::extract_extension_from_url` instead")]
pub fn extract_download_extension_from_url_str(url: &str) -> Option<DownloadExtension> {
let parsed_url = Url::parse(url).ok()?;
extract_download_extension_from_url(&parsed_url)
}
/// This should be used for naming files on the local file system based on their URL.
#[deprecated(note = "Use `extract_extension_from_url` in `url_utils::extension::extract_extension_from_url` instead")]
pub fn extract_download_extension_from_url(url: &Url) -> Option<DownloadExtension> {
let path = url.path();
let extension = std::path::Path::new(path)
@@ -18,8 +20,8 @@ pub fn extract_download_extension_from_url(url: &Url) -> Option<DownloadExtensio
#[cfg(test)]
mod tests {
use crate::extension::download_extension::DownloadExtension;
use crate::extension::extract_download_extension_from_url::extract_download_extension_from_url_str;
use crate::download_extension::DownloadExtension;
use crate::download_extension::extract_download_extension_from_url::extract_download_extension_from_url_str;
#[test]
fn success_case() {
@@ -0,0 +1,4 @@
mod download_extension;
pub mod extract_download_extension_from_url;
pub use download_extension::DownloadExtension;
@@ -1,4 +1,2 @@
pub mod download_extension;
pub mod extension;
pub mod extract_download_extension_from_url;
pub mod extract_extension_from_url;
+2 -1
View File
@@ -1 +1,2 @@
pub mod extension;
pub mod extension;
pub mod download_extension;
@@ -32,7 +32,7 @@ errors.workspace = true
hashing = { path = "../../../lib/files/hashing" }
jobs_common = { path = "../../../lib/jobs_common" }
mysql_queries = { path = "../../../schema/database/mysql_queries" }
seedance2pro = { path = "../../../api_clients/seedance2pro" }
seedance2pro_client = { path = "../../../api_clients/seedance2pro_client" }
server_environment = { path = "../../../lib/server_environment" }
tokens.workspace = true
@@ -1,7 +1,7 @@
use cloud_storage::bucket_client::BucketClient;
use concurrency::relaxed_atomic_bool::RelaxedAtomicBool;
use jobs_common::job_stats::JobStats;
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use server_environment::ServerEnvironment;
use sqlx::MySqlPool;
@@ -22,7 +22,7 @@ use config::shared_constants::DEFAULT_MYSQL_CONNECTION_STRING;
use config::shared_constants::DEFAULT_RUST_LOG;
use errors::AnyhowResult;
use jobs_common::job_stats::JobStats;
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use server_environment::ServerEnvironment;
use crate::http_server::run_http_server::{launch_http_server, CreateServerArgs};
@@ -3,7 +3,7 @@ use std::time::Duration;
use log::{error, info, warn};
use mysql_queries::queries::generic_inference::seedance2pro::list_pending_seedance2pro_jobs::list_pending_seedance2pro_jobs;
use seedance2pro::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs, TaskStatus};
use seedance2pro_client::requests::poll_orders::poll_orders::{poll_orders, PollOrdersArgs, TaskStatus};
use crate::process_job::process_failed_job::process_failed_job;
use crate::process_job::process_successful_job::process_successful_job;
@@ -4,8 +4,8 @@ use enums::by_table::generic_inference_jobs::frontend_failure_category::Frontend
use mysql_queries::queries::generic_inference::job::mark_job_failed_by_token::{mark_job_failed_by_token, MarkJobFailedByTokenArgs};
use mysql_queries::queries::generic_inference::seedance2pro::list_pending_seedance2pro_jobs::PendingSeedance2ProJob;
use mysql_queries::queries::wallets::refund::try_to_refund_ledger_entry::{try_to_refund_ledger_entry, WalletRefundOutcome};
use seedance2pro::requests::poll_orders::failure_type::FailureType;
use seedance2pro::requests::poll_orders::poll_orders::OrderStatus;
use seedance2pro_client::requests::poll_orders::failure_type::FailureType;
use seedance2pro_client::requests::poll_orders::poll_orders::OrderStatus;
use crate::job_dependencies::JobDependencies;
@@ -12,7 +12,7 @@ use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use mysql_queries::queries::generic_inference::seedance2pro::list_pending_seedance2pro_jobs::PendingSeedance2ProJob;
use mysql_queries::queries::media_files::create::insert_builder::media_file_insert_builder::MediaFileInsertBuilder;
use mysql_queries::queries::generic_inference::web::mark_generic_inference_job_successfully_done_by_token::mark_generic_inference_job_successfully_done_by_token;
use seedance2pro::requests::poll_orders::poll_orders::OrderStatus;
use seedance2pro_client::requests::poll_orders::poll_orders::OrderStatus;
use crate::job_dependencies::JobDependencies;
const PREFIX: &str = "artcraft_";
@@ -49,7 +49,6 @@ crockford = { path = "../../../lib/data/crockford" }
datetimes = { path = "../../../lib/data/datetimes" }
easyenv.workspace = true
elasticsearch_schema = { path = "../../../schema/database/elasticsearch_schema" }
email_sender= { path = "../../../lib/email_sender" }
enums.workspace = true
enums_public.workspace = true
errors.workspace = true
@@ -73,7 +72,7 @@ redis_caching = { path = "../../../lib/caching/redis_caching" }
redis_common = { path = "../../../schema/database/redis_common" }
redis_schema = { path = "../../../schema/database/redis_schema" }
reusable_types = { path = "../../../schema/public/reusable_types" }
seedance2pro.workspace = true
seedance2pro_client.workspace = true
server_environment = { path = "../../../lib/server_environment" }
thumbnail_generator = { path = "../../../api_clients/thumbnail_generator" }
tokens.workspace = true
@@ -31,14 +31,14 @@ use mysql_queries::queries::prompt_context_items::insert_batch_prompt_context_it
insert_batch_prompt_context_items, InsertBatchArgs, PromptContextItem,
};
use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs};
use seedance2pro::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro::requests::generate_video::generate_video::{
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::generate_video::generate_video::{
generate_video, BatchCount, GenerateVideoArgs, Resolution,
};
use seedance2pro::requests::prepare_file_upload::prepare_file_upload::{
use seedance2pro_client::requests::prepare_file_upload::prepare_file_upload::{
prepare_file_upload, PrepareFileUploadArgs,
};
use seedance2pro::requests::upload_file::upload_file::{upload_file, UploadFileArgs};
use seedance2pro_client::requests::upload_file::upload_file::{upload_file, UploadFileArgs};
use sqlx::Acquire;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::media_files::MediaFileToken;
@@ -8,7 +8,6 @@ use sqlx::MySqlPool;
use strum_macros::Display;
use crockford::crockford_entropy_lower;
use email_sender::smtp_email_sender::SmtpEmailSender;
use enums::by_table::email_sender_jobs::email_category::EmailCategory;
use http_server_common::request::get_request_ip::get_request_ip;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
@@ -86,7 +85,6 @@ pub async fn password_reset_request_handler(
mysql_pool: web::Data<MySqlPool>,
server_environment: web::Data<ServerEnvironment>,
server_state: web::Data<Arc<ServerState>>,
_sender: web::Data<SmtpEmailSender>,
) -> Result<HttpResponse, PasswordResetRequestedErrorResponse> {
let username_or_email = request.username_or_email.trim();
@@ -50,7 +50,6 @@ use config::common_env::CommonEnv;
use config::shared_constants::DEFAULT_RUST_LOG;
use elasticsearch::http::transport::Transport;
use elasticsearch::Elasticsearch;
use email_sender::smtp_email_sender::SmtpEmailSender;
use errors::AnyhowResult;
use fal_client::creds::fal_api_key::FalApiKey;
use log::info;
@@ -393,12 +392,6 @@ async fn main() -> AnyhowResult<()> {
.trim()
.to_string();
// TODO(bt,2023-11-11): Password and account details should be a secret, but gotta go fast.
let email_sender = SmtpEmailSender::new(
"smtp.gmail.com",
"noreply@storyteller.ai".to_string(),
"FakeYouHanashi1".to_string())?;
let server_environment_typed = match server_environment {
ServerEnvironment::Production => server_environment::ServerEnvironment::Production,
ServerEnvironment::Development => server_environment::ServerEnvironment::Development,
@@ -465,7 +458,6 @@ async fn main() -> AnyhowResult<()> {
audio_uploads_bucket_root,
sort_key_crypto,
static_api_token_set,
email_sender,
fal: FalData {
api_key: fal_api_key,
webhook_url: fal_webhook_url,
@@ -661,7 +653,6 @@ pub async fn serve(server_state: ServerState) -> AnyhowResult<()>
.app_data(web::Data::new(server_state_arc.stripe.clone().client.clone()))
.app_data(web::Data::new(server_state_arc.third_party_url_redirector))
.app_data(web::Data::new(server_state_arc.google_sign_in_cert.clone()))
.app_data(web::Data::new(server_state_arc.email_sender.clone()))
.app_data(web::Data::new(old_server_environment))
.app_data(web::Data::new(new_server_environment))
.app_data(web::Data::from(product_lookup)) // NB: Data::from(Arc<T>) for dynamic dispatch
@@ -6,7 +6,6 @@ use billing_component::stripe::stripe_config::StripeConfig;
use chrono::{DateTime, Utc};
use cloud_storage::bucket_client::BucketClient;
use elasticsearch::Elasticsearch;
use email_sender::smtp_email_sender::SmtpEmailSender;
use fal_client::creds::fal_api_key::FalApiKey;
use memory_caching::arc_ttl_sieve::ArcTtlSieve;
use memory_caching::single_item_ttl_cache::SingleItemTtlCache;
@@ -106,8 +105,6 @@ pub struct ServerState {
pub sort_key_crypto: SortKeyCrypto,
pub email_sender: SmtpEmailSender,
pub ip_ban_list: IpBanList,
pub cidr_ban_set: BannedCidrSet,