Skip to main content

gproxy_protocol/protocol/gemini/
video.rs

1//! Veo video generation wire models (Gemini API `:predictLongRunning` and the
2//! long-running operation poll that returns generated video references).
3
4use std::collections::BTreeMap;
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::common::ExtraFields;
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
12#[serde(rename_all = "camelCase")]
13#[derive(gproxy_protocol_macros::WireBuilder)]
14#[non_exhaustive]
15pub struct VeoGenerateVideosRequest {
16    #[serde(default, skip_serializing_if = "Vec::is_empty")]
17    pub instances: Vec<VeoInstance>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub parameters: Option<VeoParameters>,
20    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
21    pub extra: ExtraFields,
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
25#[serde(rename_all = "camelCase")]
26#[derive(gproxy_protocol_macros::WireBuilder)]
27#[non_exhaustive]
28pub struct VeoInstance {
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub prompt: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub image: Option<VeoMedia>,
33    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
34    pub extra: ExtraFields,
35}
36
37/// Inline or GCS-referenced media (request images, Vertex-form video results).
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
39#[serde(rename_all = "camelCase")]
40#[derive(gproxy_protocol_macros::WireBuilder)]
41#[non_exhaustive]
42pub struct VeoMedia {
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub bytes_base64_encoded: Option<String>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub gcs_uri: Option<String>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub mime_type: Option<String>,
49    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
50    pub extra: ExtraFields,
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
54#[serde(rename_all = "camelCase")]
55#[derive(gproxy_protocol_macros::WireBuilder)]
56#[non_exhaustive]
57pub struct VeoParameters {
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub aspect_ratio: Option<String>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub duration_seconds: Option<u32>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub negative_prompt: Option<String>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub number_of_videos: Option<u32>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub person_generation: Option<String>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub resolution: Option<String>,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub seed: Option<i64>,
72    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
73    pub extra: ExtraFields,
74}
75
76/// `google.longrunning.Operation` as returned by `:predictLongRunning` and the
77/// operation poll endpoint.
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
79#[serde(rename_all = "camelCase")]
80#[derive(gproxy_protocol_macros::WireBuilder)]
81#[non_exhaustive]
82pub struct VeoOperation {
83    pub name: String,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub metadata: Option<Value>,
86    #[serde(default)]
87    pub done: bool,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub error: Option<VeoOperationError>,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub response: Option<VeoOperationResponse>,
92    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
93    pub extra: ExtraFields,
94}
95
96/// `google.rpc.Status`.
97#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
98#[serde(rename_all = "camelCase")]
99#[derive(gproxy_protocol_macros::WireBuilder)]
100#[non_exhaustive]
101pub struct VeoOperationError {
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub code: Option<i64>,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub message: Option<String>,
106    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
107    pub extra: ExtraFields,
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
111#[serde(rename_all = "camelCase")]
112#[derive(gproxy_protocol_macros::WireBuilder)]
113#[non_exhaustive]
114pub struct VeoOperationResponse {
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub generate_video_response: Option<VeoGenerateVideoResponse>,
117    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
118    pub extra: ExtraFields,
119}
120
121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
122#[serde(rename_all = "camelCase")]
123#[derive(gproxy_protocol_macros::WireBuilder)]
124#[non_exhaustive]
125pub struct VeoGenerateVideoResponse {
126    /// Gemini API form: samples wrapping a `video.uri` file reference.
127    #[serde(default, skip_serializing_if = "Vec::is_empty")]
128    pub generated_samples: Vec<VeoGeneratedSample>,
129    /// Vertex form: inline/GCS videos.
130    #[serde(default, skip_serializing_if = "Vec::is_empty")]
131    pub videos: Vec<VeoGeneratedVideo>,
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub rai_media_filtered_count: Option<u32>,
134    #[serde(default, skip_serializing_if = "Vec::is_empty")]
135    pub rai_media_filtered_reasons: Vec<String>,
136    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
137    pub extra: ExtraFields,
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
141#[serde(rename_all = "camelCase")]
142#[derive(gproxy_protocol_macros::WireBuilder)]
143#[non_exhaustive]
144pub struct VeoGeneratedSample {
145    #[serde(skip_serializing_if = "Option::is_none")]
146    pub video: Option<VeoGeneratedVideo>,
147    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
148    pub extra: ExtraFields,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
152#[serde(rename_all = "camelCase")]
153#[derive(gproxy_protocol_macros::WireBuilder)]
154#[non_exhaustive]
155pub struct VeoGeneratedVideo {
156    /// Gemini API file reference, fetchable via the files download endpoint.
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub uri: Option<String>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub bytes_base64_encoded: Option<String>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub gcs_uri: Option<String>,
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub mime_type: Option<String>,
165    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
166    pub extra: ExtraFields,
167}