This commit is contained in:
Brandon Thomas committed 2026-04-21 21:44:41 -04:00
1 parent 26db6cdf32
commit 1c093cdc17
3 files changed
+73 -77

No files matched your search

@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
pub struct GptImage2TextToImageInput {
pub prompt: String,
/// "1024x768", "1024x1024", "1024x1536", "1920x1080", "2560x1440", "3840x2160"
/// square_hd, square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9
#[serde(skip_serializing_if = "Option::is_none")]
pub image_size: Option<String>,
@@ -5,6 +5,8 @@ use crate::requests::traits::fal_request_cost_calculator_trait::{FalRequestCostC
use crate::requests::http::image::edit::http_gpt_image_2_edit_image::{gpt_image_2_edit_image, GptImage2EditImageInput};
use crate::requests::api::webhook_response::WebhookResponse;
use reqwest::IntoUrl;
use crate::requests::webhook::image::edit::enqueue_gpt_image_2_edit_image_webhook::EnqueueGptImage2EditImageQuality::{High, Medium};
use crate::requests::webhook::image::edit::enqueue_gpt_image_2_edit_image_webhook::EnqueueGptImage2EditImageSize::SquareHd;
pub struct EnqueueGptImage2EditImageArgs<'a, R: IntoUrl> {
// Request required
@@ -33,18 +35,13 @@ pub enum EnqueueGptImage2EditImageNumImages {
#[derive(Copy, Clone, Debug)]
pub enum EnqueueGptImage2EditImageSize {
/// 1024x768
Landscape4x3,
/// 1024x1024
SquareHd,
Square,
/// 1024x1536
Portrait,
/// 1920x1080
Portrait4x3,
Portrait16x9,
Landscape4x3,
Landscape16x9,
/// 2560x1440
Qhd,
/// 3840x2160
Uhd4k,
Auto,
}
#[derive(Copy, Clone, Debug)]
@@ -64,31 +61,34 @@ pub enum EnqueueGptImage2EditImageOutputFormat {
impl <U: IntoUrl> FalRequestCostCalculator for EnqueueGptImage2EditImageArgs<'_, U> {
fn calculate_cost_in_cents(&self) -> UsdCents {
// Cost table (per image):
// 1024x768: low=$0.01, medium=$0.04, high=$0.15
// 1024x1024: low=$0.01, medium=$0.06, high=$0.22
// 1024x1536: low=$0.01, medium=$0.05, high=$0.17
// 1920x1080: low=$0.01, medium=$0.04, high=$0.16
// 2560x1440: low=$0.01, medium=$0.06, high=$0.23
// 3840x2160: low=$0.02, medium=$0.11, high=$0.41
// Cost table (per image) by approximate pixel dimensions:
//
// landscape_4_3 (~1024x768): low=$0.01, medium=$0.04, high=$0.15
// square (~1024x1024): low=$0.01, medium=$0.06, high=$0.22
// portrait_4_3 (~768x1024): low=$0.01, medium=$0.04, high=$0.15
// landscape_16_9(~1920x1080): low=$0.01, medium=$0.04, high=$0.16
// portrait_16_9 (~1080x1920): low=$0.01, medium=$0.04, high=$0.16
// square_hd (~2048x2048): low=$0.01, medium=$0.06, high=$0.23
// auto (varies): estimated as square
let use_quality = self.quality.unwrap_or(EnqueueGptImage2EditImageQuality::High);
let use_size = self.image_size.unwrap_or(EnqueueGptImage2EditImageSize::Square);
use EnqueueGptImage2EditImageQuality::*;
use EnqueueGptImage2EditImageSize::*;
let base_cost = match (use_quality, use_size) {
(EnqueueGptImage2EditImageQuality::Low, EnqueueGptImage2EditImageSize::Uhd4k) => 2,
(EnqueueGptImage2EditImageQuality::Low, _) => 1,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Landscape4x3) => 4,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Square) => 6,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Portrait) => 5,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Landscape16x9) => 4,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Qhd) => 6,
(EnqueueGptImage2EditImageQuality::Medium, EnqueueGptImage2EditImageSize::Uhd4k) => 11,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Landscape4x3) => 15,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Square) => 22,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Portrait) => 17,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Landscape16x9) => 16,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Qhd) => 23,
(EnqueueGptImage2EditImageQuality::High, EnqueueGptImage2EditImageSize::Uhd4k) => 41,
(Low, _) => 1,
(Medium, Landscape4x3 | Portrait4x3 | Landscape16x9 | Portrait16x9) => 4,
(Medium, Square) => 6,
(Medium, SquareHd) => 6,
(Medium, Auto) => 6, // TODO(bt): Unknown
(High, Landscape4x3 | Portrait4x3) => 15,
(High, Landscape16x9 | Portrait16x9) => 16,
(High, Square) => 22,
(High, SquareHd) => 23,
(High, Auto) => 23, // TODO(bt): Unknown
};
let cost = match self.num_images {
EnqueueGptImage2EditImageNumImages::One => base_cost,
EnqueueGptImage2EditImageNumImages::Two => base_cost * 2,
@@ -113,14 +113,15 @@ pub async fn enqueue_gpt_image_2_edit_image_webhook<R: IntoUrl>(
let image_size = args.image_size
.map(|s| match s {
EnqueueGptImage2EditImageSize::Landscape4x3 => "1024x768",
EnqueueGptImage2EditImageSize::Square => "1024x1024",
EnqueueGptImage2EditImageSize::Portrait => "1024x1536",
EnqueueGptImage2EditImageSize::Landscape16x9 => "1920x1080",
EnqueueGptImage2EditImageSize::Qhd => "2560x1440",
EnqueueGptImage2EditImageSize::Uhd4k => "3840x2160",
EnqueueGptImage2EditImageSize::SquareHd => "square_hd",
EnqueueGptImage2EditImageSize::Square => "square",
EnqueueGptImage2EditImageSize::Portrait4x3 => "portrait_4_3",
EnqueueGptImage2EditImageSize::Portrait16x9 => "portrait_16_9",
EnqueueGptImage2EditImageSize::Landscape4x3 => "landscape_4_3",
EnqueueGptImage2EditImageSize::Landscape16x9 => "landscape_16_9",
EnqueueGptImage2EditImageSize::Auto => "auto",
})
.map(|resolution| resolution.to_string());
.map(|size| size.to_string());
let quality = args.quality
.map(|s| match s {
@@ -31,18 +31,12 @@ pub enum EnqueueGptImage2TextToImageNumImages {
#[derive(Copy, Clone, Debug)]
pub enum EnqueueGptImage2TextToImageSize {
/// 1024x768
Landscape4x3,
/// 1024x1024
SquareHd,
Square,
/// 1024x1536
Portrait,
/// 1920x1080
Portrait4x3,
Portrait16x9,
Landscape4x3,
Landscape16x9,
/// 2560x1440
Qhd,
/// 3840x2160
Uhd4k,
}
#[derive(Copy, Clone, Debug)]
@@ -62,31 +56,32 @@ pub enum EnqueueGptImage2TextToImageOutputFormat {
impl <U: IntoUrl> FalRequestCostCalculator for EnqueueGptImage2TextToImageArgs<'_, U> {
fn calculate_cost_in_cents(&self) -> UsdCents {
// Cost table (per image):
// 1024x768: low=$0.01, medium=$0.04, high=$0.15
// 1024x1024: low=$0.01, medium=$0.06, high=$0.22
// 1024x1536: low=$0.01, medium=$0.05, high=$0.17
// 1920x1080: low=$0.01, medium=$0.04, high=$0.16
// 2560x1440: low=$0.01, medium=$0.06, high=$0.23
// 3840x2160: low=$0.02, medium=$0.11, high=$0.41
// Cost table (per image) by approximate pixel dimensions:
//
// landscape_4_3 (~1024x768): low=$0.01, medium=$0.04, high=$0.15
// square (~1024x1024): low=$0.01, medium=$0.06, high=$0.22
// portrait_4_3 (~768x1024): low=$0.01, medium=$0.04, high=$0.15
// landscape_16_9(~1920x1080): low=$0.01, medium=$0.04, high=$0.16
// portrait_16_9 (~1080x1920): low=$0.01, medium=$0.04, high=$0.16
// square_hd (~2048x2048): low=$0.01, medium=$0.06, high=$0.23
// auto (varies): estimated as square
let use_quality = self.quality.unwrap_or(EnqueueGptImage2TextToImageQuality::High);
let use_size = self.image_size.unwrap_or(EnqueueGptImage2TextToImageSize::Square);
use EnqueueGptImage2TextToImageQuality::*;
use EnqueueGptImage2TextToImageSize::*;
let base_cost = match (use_quality, use_size) {
(EnqueueGptImage2TextToImageQuality::Low, EnqueueGptImage2TextToImageSize::Uhd4k) => 2,
(EnqueueGptImage2TextToImageQuality::Low, _) => 1,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Landscape4x3) => 4,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Square) => 6,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Portrait) => 5,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Landscape16x9) => 4,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Qhd) => 6,
(EnqueueGptImage2TextToImageQuality::Medium, EnqueueGptImage2TextToImageSize::Uhd4k) => 11,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Landscape4x3) => 15,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Square) => 22,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Portrait) => 17,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Landscape16x9) => 16,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Qhd) => 23,
(EnqueueGptImage2TextToImageQuality::High, EnqueueGptImage2TextToImageSize::Uhd4k) => 41,
(Low, _) => 1,
(Medium, Landscape4x3 | Portrait4x3 | Landscape16x9 | Portrait16x9) => 4,
(Medium, Square) => 6,
(Medium, SquareHd) => 6,
(High, Landscape4x3 | Portrait4x3) => 15,
(High, Landscape16x9 | Portrait16x9) => 16,
(High, Square) => 22,
(High, SquareHd) => 23,
};
let cost = match self.num_images {
EnqueueGptImage2TextToImageNumImages::One => base_cost,
EnqueueGptImage2TextToImageNumImages::Two => base_cost * 2,
@@ -111,14 +106,14 @@ pub async fn enqueue_gpt_image_2_text_to_image_webhook<R: IntoUrl>(
let image_size = args.image_size
.map(|s| match s {
EnqueueGptImage2TextToImageSize::Landscape4x3 => "1024x768",
EnqueueGptImage2TextToImageSize::Square => "1024x1024",
EnqueueGptImage2TextToImageSize::Portrait => "1024x1536",
EnqueueGptImage2TextToImageSize::Landscape16x9 => "1920x1080",
EnqueueGptImage2TextToImageSize::Qhd => "2560x1440",
EnqueueGptImage2TextToImageSize::Uhd4k => "3840x2160",
EnqueueGptImage2TextToImageSize::SquareHd => "square_hd",
EnqueueGptImage2TextToImageSize::Square => "square",
EnqueueGptImage2TextToImageSize::Portrait4x3 => "portrait_4_3",
EnqueueGptImage2TextToImageSize::Portrait16x9 => "portrait_16_9",
EnqueueGptImage2TextToImageSize::Landscape4x3 => "landscape_4_3",
EnqueueGptImage2TextToImageSize::Landscape16x9 => "landscape_16_9",
})
.map(|resolution| resolution.to_string());
.map(|size| size.to_string());
let quality = args.quality
.map(|s| match s {