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}