From b6e899b9fa0211e9ace85f6c031726054571be96 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 29 Dec 2025 02:05:30 -0500 Subject: [PATCH] veo 3.1 text to video costs --- ...ueue_veo_3p1_fast_text_to_video_webhook.rs | 26 ++++++++++++++++++ .../enqueue_veo_3p1_text_to_video_webhook.rs | 27 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_fast_text_to_video_webhook.rs b/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_fast_text_to_video_webhook.rs index 74d31345cc..bee62b987e 100644 --- a/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_fast_text_to_video_webhook.rs +++ b/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_fast_text_to_video_webhook.rs @@ -1,6 +1,7 @@ use crate::creds::fal_api_key::FalApiKey; use crate::error::classify_fal_error::classify_fal_error; use crate::error::fal_error_plus::FalErrorPlus; +use crate::requests::traits::fal_request_cost_calculator_trait::{FalRequestCostCalculator, UsdCents}; use fal::endpoints::fal_ai::veo::veo3_1::veo_3p1_fast_text_to_video::{veo_3p1_fast_text_to_video, Veo3p1FastTextToVideoInput}; use fal::webhook::WebhookResponse; use reqwest::IntoUrl; @@ -44,6 +45,31 @@ pub enum EnqueueVeo3p1FastTextToVideoResolution { TenEightyP, } +impl FalRequestCostCalculator for EnqueueVeo3p1FastTextToVideoArgs<'_, R> { + fn calculate_cost_in_cents(&self) -> UsdCents { + // "For every second of video you generated, you will be charged + // $0.10 (audio off) or + // $0.15 (audio on). + // For example, a 5s video with audio on will cost $0.75." + let duration = self.duration + .unwrap_or(EnqueueVeo3p1FastTextToVideoDurationSeconds::Eight); + + let generate_audio = self.generate_audio.unwrap_or(true); + + match (duration, generate_audio) { + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Four, false) => 40, + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Six, false) => 60, + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Eight, false) => 80, + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Four, true) => 60, + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Six, true) => 90, + (EnqueueVeo3p1FastTextToVideoDurationSeconds::Eight, true) => 120, + } + } +} + + +/// Veo 3.1 Fast Text-to-Video +/// https://fal.ai/models/fal-ai/veo3.1/fast pub async fn enqueue_veo_3p1_fast_text_to_video_webhook( args: EnqueueVeo3p1FastTextToVideoArgs<'_, R> ) -> Result { diff --git a/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_text_to_video_webhook.rs b/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_text_to_video_webhook.rs index d8a839da02..4421cee882 100644 --- a/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_text_to_video_webhook.rs +++ b/crates/api_clients/fal_client/src/requests/webhook/video/text/enqueue_veo_3p1_text_to_video_webhook.rs @@ -1,6 +1,7 @@ use crate::creds::fal_api_key::FalApiKey; use crate::error::classify_fal_error::classify_fal_error; use crate::error::fal_error_plus::FalErrorPlus; +use crate::requests::traits::fal_request_cost_calculator_trait::{FalRequestCostCalculator, UsdCents}; use fal::endpoints::fal_ai::veo::veo3_1::veo_3p1_text_to_video::{veo_3p1_text_to_video, Veo3p1TextToVideoInput}; use fal::webhook::WebhookResponse; use reqwest::IntoUrl; @@ -44,6 +45,32 @@ pub enum EnqueueVeo3p1TextToVideoResolution { TenEightyP, } + +impl FalRequestCostCalculator for EnqueueVeo3p1TextToVideoArgs<'_, R> { + fn calculate_cost_in_cents(&self) -> UsdCents { + // "For every second of video you generated, you will be charged + // $0.20 (audio off) or + // $0.40 (audio on). + // For example, a 5s video with audio on will cost $2." + let duration = self.duration + .unwrap_or(EnqueueVeo3p1TextToVideoDurationSeconds::Eight); + + let generate_audio = self.generate_audio.unwrap_or(true); + + match (duration, generate_audio) { + (EnqueueVeo3p1TextToVideoDurationSeconds::Four, false) => 80, + (EnqueueVeo3p1TextToVideoDurationSeconds::Six, false) => 120, + (EnqueueVeo3p1TextToVideoDurationSeconds::Eight, false) => 160, + (EnqueueVeo3p1TextToVideoDurationSeconds::Four, true) => 160, + (EnqueueVeo3p1TextToVideoDurationSeconds::Six, true) => 240, + (EnqueueVeo3p1TextToVideoDurationSeconds::Eight, true) => 320, + } + } +} + + +/// Veo 3.1 Text-to-Video +/// https://fal.ai/models/fal-ai/veo3.1 pub async fn enqueue_veo_3p1_text_to_video_webhook( args: EnqueueVeo3p1TextToVideoArgs<'_, R> ) -> Result {