1use derive_builder::Builder;
2use serde::{Deserialize, Serialize};
3
4use crate::error::OpenAIError;
5
6use super::InputSource;
7
8#[derive(Default, Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
9pub enum ImageSize {
10 #[serde(rename = "256x256")]
11 S256x256,
12 #[serde(rename = "512x512")]
13 S512x512,
14 #[default]
15 #[serde(rename = "1024x1024")]
16 S1024x1024,
17 #[serde(rename = "1792x1024")]
18 S1792x1024,
19 #[serde(rename = "1024x1792")]
20 S1024x1792,
21}
22
23#[derive(Default, Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
24pub enum DallE2ImageSize {
25 #[serde(rename = "256x256")]
26 S256x256,
27 #[serde(rename = "512x512")]
28 S512x512,
29 #[default]
30 #[serde(rename = "1024x1024")]
31 S1024x1024,
32}
33
34#[derive(Debug, Serialize, Deserialize, Default, Clone, Copy, PartialEq)]
35#[serde(rename_all = "lowercase")]
36pub enum ImageResponseFormat {
37 #[default]
38 Url,
39 #[serde(rename = "b64_json")]
40 B64Json,
41}
42
43#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
44pub enum ImageModel {
45 #[default]
46 #[serde(rename = "dall-e-2")]
47 DallE2,
48 #[serde(rename = "dall-e-3")]
49 DallE3,
50 #[serde(untagged)]
51 Other(String),
52}
53
54#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
55#[serde(rename_all = "lowercase")]
56pub enum ImageQuality {
57 #[default]
58 Standard,
59 HD,
60}
61
62#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
63#[serde(rename_all = "lowercase")]
64pub enum ImageStyle {
65 #[default]
66 Vivid,
67 Natural,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, Default, Builder, PartialEq)]
71#[builder(name = "CreateImageRequestArgs")]
72#[builder(pattern = "mutable")]
73#[builder(setter(into, strip_option), default)]
74#[builder(derive(Debug))]
75#[builder(build_fn(error = "OpenAIError"))]
76pub struct CreateImageRequest {
77 pub prompt: String,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub model: Option<ImageModel>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub n: Option<u8>, #[serde(skip_serializing_if = "Option::is_none")]
92 pub quality: Option<ImageQuality>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub response_format: Option<ImageResponseFormat>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
101 pub size: Option<ImageSize>,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
108 pub style: Option<ImageStyle>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub user: Option<String>,
113}
114
115#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
116#[serde(untagged)]
117pub enum Image {
118 Url {
120 url: String,
121 revised_prompt: Option<String>,
122 },
123 B64Json {
125 b64_json: std::sync::Arc<String>,
126 revised_prompt: Option<String>,
127 },
128}
129
130#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
131pub struct ImagesResponse {
132 pub created: u32,
133 pub data: Vec<std::sync::Arc<Image>>,
134}
135
136#[derive(Debug, Default, Clone, PartialEq)]
137pub struct ImageInput {
138 pub source: InputSource,
139}
140
141#[derive(Debug, Clone, Default, Builder, PartialEq)]
142#[builder(name = "CreateImageEditRequestArgs")]
143#[builder(pattern = "mutable")]
144#[builder(setter(into, strip_option), default)]
145#[builder(derive(Debug))]
146#[builder(build_fn(error = "OpenAIError"))]
147pub struct CreateImageEditRequest {
148 pub image: ImageInput,
150
151 pub prompt: String,
153
154 pub mask: Option<ImageInput>,
156
157 pub model: Option<ImageModel>,
159
160 pub n: Option<u8>, pub size: Option<DallE2ImageSize>,
165
166 pub response_format: Option<ImageResponseFormat>,
168
169 pub user: Option<String>,
171}
172
173#[derive(Debug, Default, Clone, Builder, PartialEq)]
174#[builder(name = "CreateImageVariationRequestArgs")]
175#[builder(pattern = "mutable")]
176#[builder(setter(into, strip_option), default)]
177#[builder(derive(Debug))]
178#[builder(build_fn(error = "OpenAIError"))]
179pub struct CreateImageVariationRequest {
180 pub image: ImageInput,
182
183 pub model: Option<ImageModel>,
185
186 pub n: Option<u8>, pub size: Option<DallE2ImageSize>,
191
192 pub response_format: Option<ImageResponseFormat>,
194
195 pub user: Option<String>,
197}