Skip to main content

gproxy_protocol/protocol/gemini/common/
content.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6    CodeExecutionOutcome, ContentRole, ExecutableCodeLanguage, ExtraFields,
7    FunctionResponseScheduling, JsonMap, MediaResolutionLevel, ServerToolType,
8};
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
11#[serde(rename_all = "camelCase")]
12pub struct Content {
13    #[serde(default, skip_serializing_if = "Vec::is_empty")]
14    pub parts: Vec<Part>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub role: Option<ContentRole>,
17    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
18    pub extra: ExtraFields,
19}
20
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
22#[serde(rename_all = "camelCase")]
23pub struct Part {
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub thought: Option<bool>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub thought_signature: Option<String>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub part_metadata: Option<JsonMap>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub media_resolution: Option<MediaResolution>,
32    #[serde(flatten, skip_serializing_if = "Option::is_none")]
33    pub data: Option<PartData>,
34    #[serde(flatten, skip_serializing_if = "Option::is_none")]
35    pub metadata: Option<PartMetadata>,
36    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
37    pub extra: ExtraFields,
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
41#[serde(untagged)]
42pub enum PartData {
43    Text {
44        text: String,
45    },
46    InlineData {
47        #[serde(rename = "inlineData")]
48        inline_data: Blob,
49    },
50    FunctionCall {
51        #[serde(rename = "functionCall")]
52        function_call: FunctionCall,
53    },
54    FunctionResponse {
55        #[serde(rename = "functionResponse")]
56        function_response: FunctionResponse,
57    },
58    FileData {
59        #[serde(rename = "fileData")]
60        file_data: FileData,
61    },
62    ExecutableCode {
63        #[serde(rename = "executableCode")]
64        executable_code: ExecutableCode,
65    },
66    CodeExecutionResult {
67        #[serde(rename = "codeExecutionResult")]
68        code_execution_result: CodeExecutionResult,
69    },
70    ToolCall {
71        #[serde(rename = "toolCall")]
72        tool_call: ToolCall,
73    },
74    ToolResponse {
75        #[serde(rename = "toolResponse")]
76        tool_response: ToolResponse,
77    },
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
81#[serde(untagged)]
82pub enum PartMetadata {
83    VideoMetadata {
84        #[serde(rename = "videoMetadata")]
85        video_metadata: VideoMetadata,
86    },
87}
88
89#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
90#[serde(rename_all = "camelCase")]
91pub struct Blob {
92    pub mime_type: String,
93    pub data: String,
94    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
95    pub extra: ExtraFields,
96}
97
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
99#[serde(rename_all = "camelCase")]
100pub struct FileData {
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub mime_type: Option<String>,
103    pub file_uri: String,
104    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
105    pub extra: ExtraFields,
106}
107
108#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
109#[serde(rename_all = "camelCase")]
110pub struct FunctionCall {
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub id: Option<String>,
113    pub name: String,
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub args: Option<JsonMap>,
116    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
117    pub extra: ExtraFields,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
121#[serde(rename_all = "camelCase")]
122pub struct FunctionResponse {
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub id: Option<String>,
125    pub name: String,
126    pub response: JsonMap,
127    #[serde(default, skip_serializing_if = "Vec::is_empty")]
128    pub parts: Vec<FunctionResponsePart>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub will_continue: Option<bool>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub scheduling: Option<FunctionResponseScheduling>,
133    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
134    pub extra: ExtraFields,
135}
136
137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
138#[serde(rename_all = "camelCase")]
139pub struct FunctionResponsePart {
140    #[serde(flatten, skip_serializing_if = "Option::is_none")]
141    pub data: Option<FunctionResponsePartData>,
142    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
143    pub extra: ExtraFields,
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
147#[serde(untagged)]
148pub enum FunctionResponsePartData {
149    InlineData {
150        #[serde(rename = "inlineData")]
151        inline_data: FunctionResponseBlob,
152    },
153}
154
155#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
156#[serde(rename_all = "camelCase")]
157pub struct FunctionResponseBlob {
158    pub mime_type: String,
159    pub data: String,
160    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
161    pub extra: ExtraFields,
162}
163
164#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
165#[serde(rename_all = "camelCase")]
166pub struct ExecutableCode {
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub id: Option<String>,
169    pub language: ExecutableCodeLanguage,
170    pub code: String,
171    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
172    pub extra: ExtraFields,
173}
174
175#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
176#[serde(rename_all = "camelCase")]
177pub struct CodeExecutionResult {
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub id: Option<String>,
180    pub outcome: CodeExecutionOutcome,
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub output: Option<String>,
183    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
184    pub extra: ExtraFields,
185}
186
187#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
188#[serde(rename_all = "camelCase")]
189pub struct ToolCall {
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub id: Option<String>,
192    pub tool_type: ServerToolType,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub args: Option<JsonMap>,
195    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
196    pub extra: ExtraFields,
197}
198
199#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
200#[serde(rename_all = "camelCase")]
201pub struct ToolResponse {
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub id: Option<String>,
204    pub tool_type: ServerToolType,
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub response: Option<JsonMap>,
207    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
208    pub extra: ExtraFields,
209}
210
211#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
212#[serde(rename_all = "camelCase")]
213pub struct VideoMetadata {
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub start_offset: Option<String>,
216    #[serde(skip_serializing_if = "Option::is_none")]
217    pub end_offset: Option<String>,
218    #[serde(skip_serializing_if = "Option::is_none")]
219    pub fps: Option<f64>,
220    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
221    pub extra: ExtraFields,
222}
223
224#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
225#[serde(rename_all = "camelCase")]
226pub struct MediaResolution {
227    #[serde(flatten, skip_serializing_if = "Option::is_none")]
228    pub value: Option<MediaResolutionValue>,
229    #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
230    pub extra: ExtraFields,
231}
232
233#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
234#[serde(untagged)]
235pub enum MediaResolutionValue {
236    Level { level: MediaResolutionLevel },
237}