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