1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum AssetType {
7 Image,
8 Video,
9 Audio,
10 Music,
11 Tts,
12 Model3d,
13 Sprite,
14 World,
15 Text,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
19#[serde(rename_all = "snake_case")]
20pub enum ImageEditMode {
21 Edit,
22 Inpaint,
23 Restyle,
24 Expand,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct GenerateRequest {
29 pub asset_type: AssetType,
30 pub prompt: Option<String>,
31 pub model: Option<String>,
32 pub input_file: Option<String>,
33 pub provider: Option<String>,
34 pub size: Option<String>,
35 pub transparent: Option<bool>,
36 #[serde(default)]
37 pub reference_images: Vec<String>,
38 pub edit_mode: Option<ImageEditMode>,
39 pub session_id: Option<String>,
40 #[serde(default)]
41 pub params: Value,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct GenerateResponse {
46 pub provider_id: String,
47 pub output_path: Option<String>,
48 pub output_url: Option<String>,
49 pub output_data: Option<String>,
50 #[serde(default)]
51 pub metadata: Value,
52 pub cost_usd: Option<f64>,
53 pub elapsed_ms: Option<u64>,
54 pub job_id: Option<String>,
55 pub user_id: Option<String>,
56 pub session_id: Option<String>,
57}
58
59#[derive(Debug, Clone, Default, Serialize, Deserialize)]
60pub struct ImageOptions {
61 pub model: Option<String>,
62 pub provider: Option<String>,
63 pub size: Option<String>,
64 pub transparent: Option<bool>,
65 pub input: Option<String>,
66 #[serde(default)]
67 pub reference_images: Vec<String>,
68 pub edit_mode: Option<ImageEditMode>,
69 pub session_id: Option<String>,
70 #[serde(default)]
71 pub params: Value,
72}
73
74#[derive(Debug, Clone, Default, Serialize, Deserialize)]
75pub struct VideoOptions {
76 pub model: Option<String>,
77 pub provider: Option<String>,
78 pub input: Option<String>,
79 pub size: Option<String>,
80 #[serde(default)]
81 pub params: Value,
82}
83
84#[derive(Debug, Clone, Default, Serialize, Deserialize)]
85pub struct AudioOptions {
86 pub model: Option<String>,
87 pub provider: Option<String>,
88 pub audio_type: Option<String>,
89 pub duration: Option<u32>,
90 #[serde(default)]
91 pub params: Value,
92}
93
94#[derive(Debug, Clone, Default, Serialize, Deserialize)]
95pub struct TtsOptions {
96 pub model: Option<String>,
97 pub provider: Option<String>,
98 pub voice: Option<String>,
99 pub voice_id: Option<String>,
100 pub language: Option<String>,
101 pub instructions: Option<String>,
102 #[serde(default)]
103 pub params: Value,
104}
105
106#[derive(Debug, Clone, Default, Serialize, Deserialize)]
107pub struct MusicOptions {
108 pub model: Option<String>,
109 pub provider: Option<String>,
110 pub duration: Option<u32>,
111 pub force_instrumental: Option<bool>,
112 pub output_format: Option<String>,
113 #[serde(default)]
114 pub params: Value,
115}
116
117#[derive(Debug, Clone, Default, Serialize, Deserialize)]
118pub struct Model3dOptions {
119 pub model: Option<String>,
120 pub provider: Option<String>,
121 pub input: Option<String>,
122 pub model_version: Option<String>,
123 pub face_limit: Option<u32>,
124 pub pbr: Option<bool>,
125 pub texture_quality: Option<String>,
126 pub auto_size: Option<bool>,
127 pub negative_prompt: Option<String>,
128 #[serde(default)]
129 pub multiview: Vec<String>,
130 pub style: Option<String>,
131 #[serde(default)]
132 pub params: Value,
133}
134
135#[derive(Debug, Clone, Default, Serialize, Deserialize)]
136pub struct SpriteOptions {
137 pub model: Option<String>,
138 pub provider: Option<String>,
139 pub input: Option<String>,
140 pub animation_type: Option<String>,
141 pub direction: Option<String>,
142 pub duration: Option<u32>,
143 pub style: Option<String>,
144 pub output_format: Option<String>,
145 pub fps: Option<u32>,
146 #[serde(default)]
147 pub params: Value,
148}
149
150#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
151#[serde(rename_all = "snake_case")]
152pub enum CropMode {
153 Tightest,
154 PowerOf2,
155}
156
157#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
158#[serde(rename_all = "snake_case")]
159pub enum ComposeDirection {
160 Horizontal,
161 Vertical,
162 Grid,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166#[serde(tag = "op", rename_all = "snake_case")]
167pub enum ProcessOperation {
168 SmartCrop {
169 mode: Option<CropMode>,
170 },
171 Resize {
172 width: u32,
173 height: u32,
174 },
175 Compose {
176 direction: ComposeDirection,
177 columns: Option<u32>,
178 padding: Option<u32>,
179 frame_width: Option<u32>,
180 frame_height: Option<u32>,
181 },
182 ExtractFrames {
183 count: Option<u32>,
184 },
185 RemoveBg {
186 bg_color: Option<String>,
187 },
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct ProcessRequest {
192 pub input: Option<String>,
193 #[serde(default)]
194 pub inputs: Vec<String>,
195 pub operations: Vec<ProcessOperation>,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
199pub struct ProcessOutputItem {
200 pub output_data: String,
201 pub width: u32,
202 pub height: u32,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
206pub struct ProcessResponse {
207 pub output_data: String,
208 pub width: u32,
209 pub height: u32,
210 #[serde(default)]
211 pub outputs: Vec<ProcessOutputItem>,
212 #[serde(default)]
213 pub operations_applied: Vec<String>,
214 pub elapsed_ms: u64,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
218pub struct JobSummary {
219 pub id: String,
220 pub user_id: Option<String>,
221 pub asset_type: String,
222 pub provider_id: String,
223 pub status: String,
224 pub error_message: Option<String>,
225 pub output_path: Option<String>,
226 pub cost_usd: Option<f64>,
227 pub created_at: String,
228 pub started_at: Option<String>,
229 pub completed_at: Option<String>,
230 pub duration_ms: Option<i64>,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
234pub struct ProviderCapabilities {
235 pub supports_transparency: bool,
236 pub supports_streaming: bool,
237 pub max_concurrent: u32,
238 pub rate_limit_rpm: Option<u32>,
239 pub priority: i32,
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize)]
243pub struct ProviderInfo {
244 pub id: String,
245 pub display_name: String,
246 pub asset_types: Vec<AssetType>,
247 pub capabilities: ProviderCapabilities,
248}