mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-11 12:23:20 +00:00
variants
This commit is contained in:
1 parent
26db6cdf32
commit
1c093cdc17
3 files changed
+73
-77
No files matched your search
+1
-1
@@ -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>,
|
||||
|
||||
|
||||
+39
-38
@@ -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 {
|
||||
|
||||
+33
-38
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user