use crate::connection::{HttpBody, MultipartPart};
use crate::{Rest, WireRequest, WireResponse};
use serde::{Deserialize, Serialize};
fn optional<'de, D, T>(d: D) -> Result<Option<T>, D::Error>
where
D: serde::Deserializer<'de>,
T: Deserialize<'de>,
{
T::deserialize(d).map(Some)
}
fn nullable<'de, D, T>(d: D) -> Result<Option<Option<T>>, D::Error>
where
D: serde::Deserializer<'de>,
T: Deserialize<'de>,
{
Option::<T>::deserialize(d).map(Some)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageBackground {
#[serde(rename = "transparent")]
Transparent,
#[serde(rename = "opaque")]
Opaque,
#[serde(rename = "auto")]
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageModeration {
#[serde(rename = "low")]
Low,
#[serde(rename = "auto")]
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageOutputFormat {
#[serde(rename = "png")]
Png,
#[serde(rename = "jpeg")]
Jpeg,
#[serde(rename = "webp")]
Webp,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageQuality {
#[serde(rename = "standard")]
Standard,
#[serde(rename = "hd")]
Hd,
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "auto")]
Auto,
#[serde(rename = "xhigh")]
Xhigh,
#[serde(rename = "max")]
Max,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageResponseFormat {
#[serde(rename = "url")]
Url,
#[serde(rename = "b64_json")]
B64Json,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageStyle {
#[serde(rename = "vivid")]
Vivid,
#[serde(rename = "natural")]
Natural,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum InputFidelity {
#[serde(rename = "high")]
High,
#[serde(rename = "low")]
Low,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum EditedImageQuality {
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "auto")]
Auto,
#[serde(rename = "xhigh")]
Xhigh,
#[serde(rename = "max")]
Max,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum EditedImageSize {
#[serde(rename = "auto")]
Auto,
#[serde(rename = "1024x1024")]
Square,
#[serde(rename = "1536x1024")]
Landscape,
#[serde(rename = "1024x1536")]
Portrait,
#[serde(untagged)]
Custom(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum OutputImageBackground {
#[serde(rename = "transparent")]
Transparent,
#[serde(rename = "opaque")]
Opaque,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum OutputImageQuality {
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "xhigh")]
Xhigh,
#[serde(rename = "max")]
Max,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum OutputImageSize {
#[serde(rename = "1024x1024")]
Square,
#[serde(rename = "1024x1536")]
Portrait,
#[serde(rename = "1536x1024")]
Landscape,
#[serde(untagged)]
Custom(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum MultipartImageQuality {
#[serde(rename = "standard")]
Standard,
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "xhigh")]
Xhigh,
#[serde(rename = "max")]
Max,
#[serde(rename = "auto")]
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum StreamImageQuality {
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "xhigh")]
Xhigh,
#[serde(rename = "max")]
Max,
#[serde(rename = "auto")]
Auto,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CreateImageRequestBody {
pub prompt: String,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub background: Option<Option<ImageBackground>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub model: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub moderation: Option<Option<ImageModeration>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub n: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub output_compression: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub output_format: Option<Option<ImageOutputFormat>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub partial_images: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub quality: Option<Option<ImageQuality>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub response_format: Option<Option<ImageResponseFormat>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub stream: Option<Option<bool>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub style: Option<Option<ImageStyle>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub user: Option<String>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImageReference {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub file_id: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub image_url: Option<String>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct EditImageJsonBody {
pub images: Vec<ImageReference>,
pub prompt: String,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub background: Option<Option<ImageBackground>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub model: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub moderation: Option<Option<ImageModeration>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub n: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub output_compression: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub output_format: Option<Option<ImageOutputFormat>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub partial_images: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub input_fidelity: Option<Option<InputFidelity>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub mask: Option<ImageReference>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub quality: Option<Option<EditedImageQuality>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<Option<EditedImageSize>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub stream: Option<Option<bool>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub user: Option<String>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct EditImageMultipartForm {
pub image: Vec<MultipartPart>,
pub prompt: String,
pub mask: Option<MultipartPart>,
pub background: Option<Option<ImageBackground>>,
pub model: Option<Option<String>>,
pub n: Option<Option<i64>>,
pub output_compression: Option<Option<i64>>,
pub output_format: Option<Option<ImageOutputFormat>>,
pub partial_images: Option<Option<i64>>,
pub input_fidelity: Option<Option<InputFidelity>>,
pub quality: Option<Option<MultipartImageQuality>>,
pub size: Option<Option<String>>,
pub response_format: Option<Option<ImageResponseFormat>>,
pub stream: Option<Option<bool>>,
pub user: Option<String>,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImagesResponse {
pub created: i64,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub background: Option<OutputImageBackground>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub data: Option<Vec<GeneratedImage>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub output_format: Option<ImageOutputFormat>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub quality: Option<OutputImageQuality>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<OutputImageSize>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<ImageUsage>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct GeneratedImage {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub b64_json: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub url: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub revised_prompt: Option<String>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImageUsage {
pub input_tokens: i64,
pub input_tokens_details: ImageTokenDetails,
pub output_tokens: i64,
pub total_tokens: i64,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub output_tokens_details: Option<ImageTokenDetails>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImageTokenDetails {
pub image_tokens: i64,
pub text_tokens: i64,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImagePartialEvent {
pub b64_json: String,
pub background: ImageBackground,
pub created_at: i64,
pub output_format: ImageOutputFormat,
pub partial_image_index: i64,
pub quality: StreamImageQuality,
pub size: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ImageCompletedEvent {
pub b64_json: String,
pub background: ImageBackground,
pub created_at: i64,
pub output_format: ImageOutputFormat,
pub quality: StreamImageQuality,
pub size: String,
pub usage: ImageUsage,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageGenerationStreamEvent {
#[serde(rename = "image_generation.partial_image")]
Partial(ImagePartialEvent),
#[serde(rename = "image_generation.completed")]
Completed(ImageCompletedEvent),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ImageEditStreamEvent {
#[serde(rename = "image_edit.partial_image")]
Partial(ImagePartialEvent),
#[serde(rename = "image_edit.completed")]
Completed(ImageCompletedEvent),
}
pub type CreateImageRequest = WireRequest<CreateImageRequestBody>;
pub type CreateImageResponse = WireResponse<ImagesResponse>;
pub type CreateImageStreamResponse = WireResponse<crate::connection::ByteStream>;
pub type EditImageJsonRequest = WireRequest<EditImageJsonBody>;
pub type EditImageMultipartRequest = WireRequest<EditImageMultipartForm>;
pub type RawEditImageRequest = WireRequest<crate::connection::Multipart>;
pub type EditImageResponse = WireResponse<ImagesResponse>;
pub type EditImageStreamResponse = WireResponse<crate::connection::ByteStream>;
pub type RawImageResponse = WireResponse<HttpBody>;