diff --git a/Cargo.lock b/Cargo.lock index e59cd9a115..99322188f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4038,7 +4038,6 @@ version = "0.0.1" dependencies = [ "anyhow", "errors", - "fal", "file_to_base64_url", "futures 0.3.32", "log", diff --git a/crates/api_clients/fal_client/Cargo.toml b/crates/api_clients/fal_client/Cargo.toml index eb37212cc2..40e4e16761 100644 --- a/crates/api_clients/fal_client/Cargo.toml +++ b/crates/api_clients/fal_client/Cargo.toml @@ -12,7 +12,7 @@ name = "fal_client" path = "src/lib.rs" [dependencies] -# Workspace hack (faster compile times) +# cargo-hakari workspace hack (faster compile times) workspace-build-acceleration.workspace = true # Internal @@ -31,11 +31,10 @@ thiserror.workspace = true tokio.workspace = true url.workspace = true -# For now, we'll vendor in fal. -# We need to implement webhooks and the upstream doesn't support them yet. -#fal = { version = "0.3.6", features = ["endpoints"] } -fal = { path = "../../vendor/fal-rs", features = ["endpoints"] } - [dev-dependencies] -test_utils = { path = "../../testing/test_utils" } +# Internal Dev +test_utils.workspace = true test_data.workspace = true + +# External Dev +# (None yet) diff --git a/crates/api_clients/fal_client/src/lib.rs b/crates/api_clients/fal_client/src/lib.rs index 296dc7df6c..55ebd9a579 100644 --- a/crates/api_clients/fal_client/src/lib.rs +++ b/crates/api_clients/fal_client/src/lib.rs @@ -1,9 +1,4 @@ -//! A wrapper for the "fal" crate that bakes in a few extra recipes and utilities. - -// NB: The vendored `fal` crate is still a dependency for now. -// Files under `requests/queue/` and `utils/queue_status_checker.rs` still use -// `fal::endpoints::*` and `fal::prelude::*` directly. Those will be migrated later. -extern crate fal; +//! A fal wrapper pub mod creds; pub mod error; diff --git a/crates/api_clients/fal_client/src/model/enqueued_request.rs b/crates/api_clients/fal_client/src/model/enqueued_request.rs index 4fce8291ea..f000deb3ea 100644 --- a/crates/api_clients/fal_client/src/model/enqueued_request.rs +++ b/crates/api_clients/fal_client/src/model/enqueued_request.rs @@ -1,8 +1,9 @@ use crate::creds::fal_api_key::FalApiKey; use crate::model::fal_endpoint::FalEndpoint; use crate::model::fal_request_id::FalRequestId; +use crate::requests::api::queue::Queue; +use crate::requests::api::queue_response::QueueResponse; use errors::AnyhowResult; -use fal::queue::{Queue, QueueResponse}; use reqwest::Client; use serde::de::DeserializeOwned; diff --git a/crates/api_clients/fal_client/src/model/fal_endpoint.rs b/crates/api_clients/fal_client/src/model/fal_endpoint.rs index 1a3b7334a2..7b3c9de8d8 100644 --- a/crates/api_clients/fal_client/src/model/fal_endpoint.rs +++ b/crates/api_clients/fal_client/src/model/fal_endpoint.rs @@ -1,6 +1,5 @@ -use fal::queue::Queue; +use crate::requests::api::queue::Queue; use serde::de::DeserializeOwned; - // TODO(bt,2025-05-26): A macro to define these + tests. const FLUX_PRO_ULTRA_TEXT_TO_IMAGE: &str = "fal-ai/flux-pro/v1.1-ultra"; diff --git a/crates/api_clients/fal_client/src/requests/webhook/image/edit/enqueue_nano_banana_2_edit_image_webhook.rs b/crates/api_clients/fal_client/src/requests/webhook/image/edit/enqueue_nano_banana_2_edit_image_webhook.rs index 8b214992a8..ed149c9dae 100644 --- a/crates/api_clients/fal_client/src/requests/webhook/image/edit/enqueue_nano_banana_2_edit_image_webhook.rs +++ b/crates/api_clients/fal_client/src/requests/webhook/image/edit/enqueue_nano_banana_2_edit_image_webhook.rs @@ -150,7 +150,7 @@ mod tests { use crate::requests::webhook::image::edit::enqueue_nano_banana_2_edit_image_webhook::{enqueue_nano_banana_2_edit_image_webhook, EnqueueNanoBanana2EditImageArgs, EnqueueNanoBanana2EditImageAspectRatio, EnqueueNanoBanana2EditImageNumImages, EnqueueNanoBanana2EditImageResolution}; use errors::AnyhowResult; use std::fs::read_to_string; - use test_data::web::image_urls::{ERNEST_SCARED_STUPID_IMAGE_URL, GHOST_IMAGE_URL, TREX_SKELETON_IMAGE_URL}; + use test_data::web::image_urls::{ERNEST_SCARED_STUPID_IMAGE_URL, GHOST_IMAGE_URL, TREX_SKELETON_IMAGE_URL, WHITE_HOUSE_SUNSET_IMAGE_URL}; #[tokio::test] #[ignore] @@ -178,4 +178,31 @@ mod tests { Ok(()) } + + #[tokio::test] + #[ignore] + async fn test_2() -> AnyhowResult<()> { + // XXX: Don't commit secrets! + let secret = read_to_string("/Users/bt/Artcraft/credentials/fal_api_key.txt")?; + + let api_key = FalApiKey::from_str(&secret); + + let args = EnqueueNanoBanana2EditImageArgs { + image_urls: vec![ + WHITE_HOUSE_SUNSET_IMAGE_URL.to_string(), + TREX_SKELETON_IMAGE_URL.to_string(), + ERNEST_SCARED_STUPID_IMAGE_URL.to_string(), + ], + prompt: "Put the scared man and the t-rex in front of the white house scene. Make the man afraid of the t-rex.", + num_images: EnqueueNanoBanana2EditImageNumImages::Two, + aspect_ratio: Some(EnqueueNanoBanana2EditImageAspectRatio::SixteenByNine), + resolution: Some(EnqueueNanoBanana2EditImageResolution::TwoK), + api_key: &api_key, + webhook_url: "https://example.com/webhook", + }; + + let result = enqueue_nano_banana_2_edit_image_webhook(args).await?; + + Ok(()) + } } diff --git a/crates/api_clients/fal_client/src/utils/clone_queue_payload.rs b/crates/api_clients/fal_client/src/utils/clone_queue_payload.rs index b8b78bee1a..9d3c58b60a 100644 --- a/crates/api_clients/fal_client/src/utils/clone_queue_payload.rs +++ b/crates/api_clients/fal_client/src/utils/clone_queue_payload.rs @@ -1,5 +1,6 @@ +use crate::requests::api::queue::Queue; +use crate::requests::api::queue_response::QueueResponse; use crate::utils::clone_queue_response::clone_queue_response; -use fal::queue::{Queue, QueueResponse}; use serde::de::DeserializeOwned; pub fn clone_queue_payload(queue: &Queue) -> QueueResponse { diff --git a/crates/api_clients/fal_client/src/utils/clone_queue_response.rs b/crates/api_clients/fal_client/src/utils/clone_queue_response.rs index 8caee7302e..bb97b31005 100644 --- a/crates/api_clients/fal_client/src/utils/clone_queue_response.rs +++ b/crates/api_clients/fal_client/src/utils/clone_queue_response.rs @@ -1,4 +1,4 @@ -use fal::queue::QueueResponse; +use crate::requests::api::queue_response::QueueResponse; pub fn clone_queue_response(response: &QueueResponse) -> QueueResponse { QueueResponse {