Skip to main content

gproxy_protocol/wire/gemini/
video.rs

1//! Gemini Developer API Veo `predictLongRunning` wire bodies.
2//!
3//! This module models only the current mldev/Developer API JSON paths. Vertex
4//! storage, seed, FPS, audio, mask, and other platform-only configuration is
5//! intentionally absent. `model` belongs in the HTTP path (`{model}:predictLongRunning`).
6
7use crate::{Rest, WireRequest, WireResponse};
8use serde::{Deserialize, Serialize};
9use serde_json::{Map, Value};
10
11/// An image accepted by the Developer API Veo wire.
12#[derive(
13    Debug,
14    Clone,
15    PartialEq,
16    Serialize,
17    Deserialize,
18    gproxy_protocol_macros::WireBuilder,
19    gproxy_protocol_macros::DeclaredFields,
20)]
21#[serde(rename_all = "camelCase")]
22#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
23pub struct VideoImage {
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub bytes_base64_encoded: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub mime_type: Option<String>,
28    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
29    pub rest: Rest,
30}
31
32/// A video source or generated sample in the Developer API wire.
33#[derive(
34    Debug,
35    Clone,
36    PartialEq,
37    Serialize,
38    Deserialize,
39    gproxy_protocol_macros::WireBuilder,
40    gproxy_protocol_macros::DeclaredFields,
41)]
42#[serde(rename_all = "camelCase")]
43#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
44pub struct Video {
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub uri: Option<String>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub encoded_video: Option<String>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    /// MIME type, for example `video/mp4`; this is not the base64 encoding label.
51    pub encoding: Option<String>,
52    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
53    pub rest: Rest,
54}
55
56#[derive(
57    Debug,
58    Clone,
59    PartialEq,
60    Serialize,
61    Deserialize,
62    gproxy_protocol_macros::WireBuilder,
63    gproxy_protocol_macros::DeclaredFields,
64)]
65#[serde(rename_all = "camelCase")]
66#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
67pub struct VideoReferenceImage {
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub image: Option<VideoImage>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub reference_type: Option<VideoReferenceType>,
72    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
73    pub rest: Rest,
74}
75
76/// The Developer API currently accepts asset references. Style references are
77/// SDK/Vertex concepts and are deliberately rejected before serialization.
78#[derive(
79    Debug,
80    Clone,
81    Copy,
82    PartialEq,
83    Eq,
84    Serialize,
85    Deserialize,
86    gproxy_protocol_macros::DeclaredFields,
87)]
88#[serde(rename_all = "UPPERCASE")]
89#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
90pub enum VideoReferenceType {
91    Asset,
92}
93
94#[derive(
95    Debug,
96    Clone,
97    PartialEq,
98    Serialize,
99    Deserialize,
100    gproxy_protocol_macros::WireBuilder,
101    gproxy_protocol_macros::DeclaredFields,
102)]
103#[serde(rename_all = "camelCase")]
104#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
105pub struct VideoGenerationInstance {
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub prompt: Option<String>,
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub image: Option<VideoImage>,
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub video: Option<Video>,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub last_frame: Option<VideoImage>,
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub reference_images: Option<Vec<VideoReferenceImage>>,
116    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
117    pub rest: Rest,
118}
119
120#[derive(
121    Debug,
122    Clone,
123    PartialEq,
124    Serialize,
125    Deserialize,
126    gproxy_protocol_macros::WireBuilder,
127    gproxy_protocol_macros::DeclaredFields,
128)]
129#[serde(rename_all = "camelCase")]
130#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
131pub struct VideoGenerationParameters {
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub sample_count: Option<i32>,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub duration_seconds: Option<i32>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub aspect_ratio: Option<String>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub resolution: Option<String>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub person_generation: Option<String>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub negative_prompt: Option<String>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub enhance_prompt: Option<bool>,
146    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
147    pub rest: Rest,
148}
149
150#[derive(
151    Debug,
152    Clone,
153    PartialEq,
154    Serialize,
155    Deserialize,
156    gproxy_protocol_macros::WireBuilder,
157    gproxy_protocol_macros::DeclaredFields,
158)]
159#[serde(rename_all = "camelCase")]
160#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
161pub struct VideoWebhookConfig {
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub uris: Option<Vec<String>>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    /// Arbitrary user metadata is a declared contract field, not a flattened extension.
166    #[serde(alias = "user_metadata")]
167    pub user_metadata: Option<Map<String, Value>>,
168    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
169    pub rest: Rest,
170}
171
172#[derive(
173    Debug,
174    Clone,
175    PartialEq,
176    Serialize,
177    Deserialize,
178    gproxy_protocol_macros::WireBuilder,
179    gproxy_protocol_macros::DeclaredFields,
180)]
181#[serde(rename_all = "camelCase")]
182#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
183pub struct PredictLongRunningRequestBody {
184    pub instances: Vec<VideoGenerationInstance>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub parameters: Option<VideoGenerationParameters>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    #[serde(alias = "webhook_config")]
189    pub webhook_config: Option<VideoWebhookConfig>,
190    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
191    pub rest: Rest,
192}
193
194pub type PredictLongRunningRequest = WireRequest<PredictLongRunningRequestBody>;
195pub type PredictLongRunningResponse = WireResponse<VideoOperation>;
196/// Fetches `GET {operation_name}`; the operation name is an HTTP path resource.
197pub type FetchVideoOperationRequest = WireRequest<()>;
198pub type FetchVideoOperationResponse = WireResponse<VideoOperation>;
199
200#[derive(
201    Debug,
202    Clone,
203    PartialEq,
204    Serialize,
205    Deserialize,
206    gproxy_protocol_macros::WireBuilder,
207    gproxy_protocol_macros::DeclaredFields,
208)]
209#[serde(rename_all = "camelCase")]
210#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
211pub struct VideoOperation {
212    #[serde(skip_serializing_if = "Option::is_none")]
213    pub name: Option<String>,
214    #[serde(skip_serializing_if = "Option::is_none")]
215    /// Service-defined metadata is an explicit JSON dictionary.
216    pub metadata: Option<Map<String, Value>>,
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub done: Option<bool>,
219    #[serde(skip_serializing_if = "Option::is_none")]
220    pub error: Option<GoogleRpcStatus>,
221    #[serde(skip_serializing_if = "Option::is_none")]
222    pub response: Option<VideoOperationResponse>,
223    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
224    pub rest: Rest,
225}
226
227/// The native mldev response wrapper. SDKs expose its contents as a flattened
228/// convenience property, but the wire keeps `generateVideoResponse`.
229#[derive(
230    Debug,
231    Clone,
232    PartialEq,
233    Serialize,
234    Deserialize,
235    gproxy_protocol_macros::WireBuilder,
236    gproxy_protocol_macros::DeclaredFields,
237)]
238#[serde(rename_all = "camelCase")]
239#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
240pub struct VideoOperationResponse {
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub generate_video_response: Option<GenerateVideoResponse>,
243    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
244    pub rest: Rest,
245}
246
247#[derive(
248    Debug,
249    Clone,
250    PartialEq,
251    Serialize,
252    Deserialize,
253    gproxy_protocol_macros::WireBuilder,
254    gproxy_protocol_macros::DeclaredFields,
255)]
256#[serde(rename_all = "camelCase")]
257#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
258pub struct GoogleRpcStatus {
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub code: Option<i32>,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub message: Option<String>,
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub details: Option<Vec<Map<String, Value>>>,
265    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
266    pub rest: Rest,
267}
268
269#[derive(
270    Debug,
271    Clone,
272    PartialEq,
273    Serialize,
274    Deserialize,
275    gproxy_protocol_macros::WireBuilder,
276    gproxy_protocol_macros::DeclaredFields,
277)]
278#[serde(rename_all = "camelCase")]
279#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
280pub struct GenerateVideoResponse {
281    #[serde(skip_serializing_if = "Option::is_none")]
282    pub generated_samples: Option<Vec<GeneratedVideoSample>>,
283    #[serde(skip_serializing_if = "Option::is_none")]
284    pub rai_media_filtered_count: Option<i32>,
285    #[serde(skip_serializing_if = "Option::is_none")]
286    pub rai_media_filtered_reasons: Option<Vec<String>>,
287    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
288    pub rest: Rest,
289}
290
291#[derive(
292    Debug,
293    Clone,
294    PartialEq,
295    Serialize,
296    Deserialize,
297    gproxy_protocol_macros::WireBuilder,
298    gproxy_protocol_macros::DeclaredFields,
299)]
300#[serde(rename_all = "camelCase")]
301#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
302pub struct GeneratedVideoSample {
303    #[serde(skip_serializing_if = "Option::is_none")]
304    pub video: Option<Video>,
305    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
306    pub rest: Rest,
307}