Skip to main content

gproxy_protocol/protocol/openai/video/
requests.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize, de};
4
5use super::super::common::Extra;
6use super::{
7    VideoContentVariant, VideoExtensionSeconds, VideoListOrder, VideoModelId, VideoSeconds,
8    VideoSize,
9};
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
12#[non_exhaustive]
13pub struct CreateVideoRequest {
14    pub prompt: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub input_reference: Option<VideoInputReference>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub model: Option<VideoModelId>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub seconds: Option<VideoSeconds>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub size: Option<VideoSize>,
23    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
24    pub extra: Extra,
25}
26
27/// An image guiding video generation. Multipart files are represented by a
28/// normalized string; JSON requests use exactly one of `file_id` or
29/// `image_url`.
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31#[serde(untagged)]
32#[non_exhaustive]
33pub enum VideoInputReference {
34    File(String),
35    Image(VideoImageReference),
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, gproxy_protocol_macros::WireBuilder)]
39#[non_exhaustive]
40pub struct VideoImageReference {
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub file_id: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub image_url: Option<String>,
45    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
46    pub extra: Extra,
47}
48
49impl<'de> Deserialize<'de> for VideoImageReference {
50    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
51        #[derive(Deserialize)]
52        struct Raw {
53            file_id: Option<String>,
54            image_url: Option<String>,
55            #[serde(default, flatten)]
56            extra: Extra,
57        }
58
59        let raw = Raw::deserialize(deserializer)?;
60        match (raw.file_id.is_some(), raw.image_url.is_some()) {
61            (true, false) | (false, true) => Ok(Self {
62                file_id: raw.file_id,
63                image_url: raw.image_url,
64                extra: raw.extra,
65            }),
66            (true, true) => Err(de::Error::custom(
67                "video image reference must contain exactly one of file_id or image_url",
68            )),
69            (false, false) => Err(de::Error::custom(
70                "video image reference must contain file_id or image_url",
71            )),
72        }
73    }
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[non_exhaustive]
78pub struct RetrieveVideoRequest {
79    pub video_id: String,
80    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
81    pub extra: Extra,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
85#[non_exhaustive]
86pub struct ListVideosRequest {
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub after: Option<String>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub limit: Option<u32>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub order: Option<VideoListOrder>,
93    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
94    pub extra: Extra,
95}
96
97#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
98#[non_exhaustive]
99pub struct DeleteVideoRequest {
100    pub video_id: String,
101    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
102    pub extra: Extra,
103}
104
105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
106#[non_exhaustive]
107pub struct DownloadVideoContentRequest {
108    pub video_id: String,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub variant: Option<VideoContentVariant>,
111    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
112    pub extra: Extra,
113}
114
115#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
116#[non_exhaustive]
117pub struct RemixVideoRequest {
118    pub video_id: String,
119    pub prompt: String,
120    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
121    pub extra: Extra,
122}
123
124#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
125#[non_exhaustive]
126pub struct CreateVideoCharacterRequest {
127    pub name: String,
128    /// Multipart video content normalized to a `data:<mime>;base64,...` URL.
129    pub video: String,
130    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
131    pub extra: Extra,
132}
133
134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
135#[non_exhaustive]
136pub struct GetVideoCharacterRequest {
137    pub character_id: String,
138    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
139    pub extra: Extra,
140}
141
142#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
143#[non_exhaustive]
144pub struct EditVideoRequest {
145    pub prompt: String,
146    pub video: VideoReference,
147    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
148    pub extra: Extra,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
152#[non_exhaustive]
153pub struct ExtendVideoRequest {
154    pub prompt: String,
155    pub seconds: VideoExtensionSeconds,
156    pub video: VideoReference,
157    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
158    pub extra: Extra,
159}
160
161/// A normalized multipart upload string or a reference to an existing video.
162#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
163#[serde(untagged)]
164#[non_exhaustive]
165pub enum VideoReference {
166    File(String),
167    Existing(VideoIdReference),
168}
169
170#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
171#[non_exhaustive]
172pub struct VideoIdReference {
173    pub id: String,
174    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
175    pub extra: Extra,
176}