1use serde::{Deserialize, Serialize};
2use serde_json::{Map, Value};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub struct Envelope<T> {
7 pub data: T,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "snake_case")]
14pub enum TaskStatus {
15 Pending,
17 Processing,
19 Success,
21 Failed,
23 Canceled,
25 #[serde(other)]
27 Unknown,
28}
29
30impl TaskStatus {
31 pub fn is_terminal(&self) -> bool {
33 matches!(self, Self::Success | Self::Failed | Self::Canceled)
34 }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
39pub struct MediaModel {
40 pub model: String,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub name: Option<String>,
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub media_type: Option<String>,
48 #[serde(default, skip_serializing_if = "Vec::is_empty")]
50 pub operations: Vec<MediaModelOperation>,
51 #[serde(flatten)]
53 pub extra: Map<String, Value>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58pub struct MediaModelOperation {
59 pub mode: String,
61 #[serde(default, skip_serializing_if = "Option::is_none")]
63 pub description: Option<String>,
64 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub input: Option<Value>,
67 #[serde(default, skip_serializing_if = "Vec::is_empty")]
69 pub parameters: Vec<MediaModelParameter>,
70 #[serde(flatten)]
72 pub extra: Map<String, Value>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
77pub struct MediaModelParameter {
78 pub name: String,
80 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub r#type: Option<String>,
83 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub label: Option<String>,
86 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub default: Option<Value>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub r#enum: Option<Vec<Value>>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub values: Option<Vec<Value>>,
95 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub min: Option<Value>,
98 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub max: Option<Value>,
101 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub step: Option<Value>,
104 #[serde(default)]
106 pub required: bool,
107 #[serde(flatten)]
109 pub extra: Map<String, Value>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
114pub struct UploadedFile {
115 pub object: String,
117 pub provider: String,
119 pub url: String,
121 pub key: String,
123 pub file_type: String,
125 pub content_type: String,
127 pub size: u64,
129 pub filename: String,
131 #[serde(flatten)]
133 pub extra: Map<String, Value>,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
138pub struct MediaResultImage {
139 pub url: String,
141 #[serde(flatten)]
143 pub extra: Map<String, Value>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
148pub struct MediaResultVideo {
149 pub url: String,
151 #[serde(default, skip_serializing_if = "Option::is_none")]
153 pub preview_url: Option<String>,
154 #[serde(default, skip_serializing_if = "Option::is_none")]
156 pub thumbnail_url: Option<String>,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub duration: Option<Value>,
160 #[serde(flatten)]
162 pub extra: Map<String, Value>,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
167pub struct MediaResultAudio {
168 pub url: String,
170 #[serde(default, skip_serializing_if = "Option::is_none")]
172 pub image_url: Option<String>,
173 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub title: Option<String>,
176 #[serde(default, skip_serializing_if = "Option::is_none")]
178 pub duration: Option<Value>,
179 #[serde(flatten)]
181 pub extra: Map<String, Value>,
182}
183
184#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
186pub struct GenerationResult {
187 #[serde(default, skip_serializing_if = "Vec::is_empty")]
189 pub images: Vec<MediaResultImage>,
190 #[serde(default, skip_serializing_if = "Vec::is_empty")]
192 pub videos: Vec<MediaResultVideo>,
193 #[serde(default, skip_serializing_if = "Vec::is_empty")]
195 pub audios: Vec<MediaResultAudio>,
196 #[serde(flatten)]
198 pub extra: Map<String, Value>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
203pub struct GenerationTaskError {
204 #[serde(default, skip_serializing_if = "Option::is_none")]
206 pub code: Option<String>,
207 #[serde(default, skip_serializing_if = "Option::is_none")]
209 pub message: Option<String>,
210 #[serde(flatten)]
212 pub extra: Map<String, Value>,
213}
214
215#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
217pub struct GenerationTask {
218 pub id: String,
220 pub status: TaskStatus,
222 #[serde(default, skip_serializing_if = "Option::is_none")]
224 pub model: Option<String>,
225 #[serde(default, skip_serializing_if = "Option::is_none")]
227 pub media_type: Option<String>,
228 #[serde(default, skip_serializing_if = "Option::is_none")]
230 pub mode: Option<String>,
231 #[serde(default, skip_serializing_if = "Option::is_none")]
233 pub cost_credits: Option<u64>,
234 #[serde(default, skip_serializing_if = "Option::is_none")]
236 pub created_at: Option<String>,
237 #[serde(default, skip_serializing_if = "Option::is_none")]
239 pub updated_at: Option<String>,
240 #[serde(default, skip_serializing_if = "Option::is_none")]
242 pub result: Option<GenerationResult>,
243 #[serde(default, skip_serializing_if = "Option::is_none")]
245 pub error: Option<GenerationTaskError>,
246 #[serde(flatten)]
248 pub extra: Map<String, Value>,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
253pub struct PublicApp {
254 pub id: String,
256 #[serde(default)]
258 pub input_parameters: Vec<AppInputParameter>,
259 #[serde(flatten)]
261 pub extra: Map<String, Value>,
262}
263
264#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
266pub struct AppInputParameter {
267 pub name: String,
269 pub r#type: String,
271 #[serde(default, skip_serializing_if = "Vec::is_empty")]
273 pub values: Vec<Value>,
274 #[serde(flatten)]
276 pub extra: Map<String, Value>,
277}
278
279#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
281pub struct AppGenerationTask {
282 pub id: String,
284 pub status: TaskStatus,
286 #[serde(default, skip_serializing_if = "Option::is_none")]
288 pub result: Option<GenerationResult>,
289 #[serde(default, skip_serializing_if = "Option::is_none")]
291 pub error: Option<GenerationTaskError>,
292 #[serde(flatten)]
294 pub extra: Map<String, Value>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
299pub struct ChatModel {
300 pub id: String,
302 pub object: String,
304 #[serde(default, skip_serializing_if = "Option::is_none")]
306 pub created: Option<i64>,
307 #[serde(default, skip_serializing_if = "Option::is_none")]
309 pub owned_by: Option<String>,
310 #[serde(default, skip_serializing_if = "Option::is_none")]
312 pub name: Option<String>,
313 #[serde(default, skip_serializing_if = "Option::is_none")]
315 pub description: Option<String>,
316 #[serde(default, skip_serializing_if = "Map::is_empty")]
318 pub capabilities: Map<String, Value>,
319 #[serde(default, skip_serializing_if = "Vec::is_empty")]
321 pub tags: Vec<String>,
322 #[serde(flatten)]
324 pub extra: Map<String, Value>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
329pub struct ChatModelList {
330 pub object: String,
332 pub data: Vec<ChatModel>,
334}