Skip to main content

gproxy_protocol/wire/gemini/
content.rs

1use crate::Rest;
2use serde::{Deserialize, Serialize};
3
4fn deserialize_present_value<'de, D>(deserializer: D) -> Result<Option<serde_json::Value>, D::Error>
5where
6    D: serde::Deserializer<'de>,
7{
8    Ok(Some(serde_json::Value::deserialize(deserializer)?))
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
13#[derive(gproxy_protocol_macros::DeclaredFields)]
14#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
15pub enum Modality {
16    #[serde(rename = "MODALITY_UNSPECIFIED")]
17    Unspecified,
18    #[serde(rename = "TEXT")]
19    Text,
20    #[serde(rename = "IMAGE")]
21    Image,
22    #[serde(rename = "VIDEO")]
23    Video,
24    #[serde(rename = "AUDIO")]
25    Audio,
26    #[serde(rename = "DOCUMENT")]
27    Document,
28}
29#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
31#[derive(gproxy_protocol_macros::DeclaredFields)]
32#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
33pub enum SchemaType {
34    #[serde(rename = "TYPE_UNSPECIFIED")]
35    Unspecified,
36    #[serde(rename = "STRING")]
37    String,
38    #[serde(rename = "NUMBER")]
39    Number,
40    #[serde(rename = "INTEGER")]
41    Integer,
42    #[serde(rename = "BOOLEAN")]
43    Boolean,
44    #[serde(rename = "ARRAY")]
45    Array,
46    #[serde(rename = "OBJECT")]
47    Object,
48    #[serde(rename = "NULL")]
49    Null,
50}
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
53#[derive(gproxy_protocol_macros::DeclaredFields)]
54#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
55pub enum HarmCategory {
56    #[serde(rename = "HARM_CATEGORY_UNSPECIFIED")]
57    Unspecified,
58    #[serde(rename = "HARM_CATEGORY_HARASSMENT")]
59    Harassment,
60    #[serde(rename = "HARM_CATEGORY_HATE_SPEECH")]
61    HateSpeech,
62    #[serde(rename = "HARM_CATEGORY_SEXUALLY_EXPLICIT")]
63    SexuallyExplicit,
64    #[serde(rename = "HARM_CATEGORY_DANGEROUS_CONTENT")]
65    DangerousContent,
66    #[serde(rename = "HARM_CATEGORY_CIVIC_INTEGRITY")]
67    CivicIntegrity,
68    #[serde(rename = "HARM_CATEGORY_DEROGATORY")]
69    Derogatory,
70    #[serde(rename = "HARM_CATEGORY_TOXICITY")]
71    Toxicity,
72    #[serde(rename = "HARM_CATEGORY_VIOLENCE")]
73    Violence,
74    #[serde(rename = "HARM_CATEGORY_SEXUAL")]
75    Sexual,
76    #[serde(rename = "HARM_CATEGORY_MEDICAL")]
77    Medical,
78    #[serde(rename = "HARM_CATEGORY_DANGEROUS")]
79    Dangerous,
80    #[serde(rename = "HARM_CATEGORY_JAILBREAK")]
81    Jailbreak,
82}
83#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
84#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
85#[derive(gproxy_protocol_macros::DeclaredFields)]
86#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
87pub enum HarmBlockThreshold {
88    #[serde(rename = "HARM_BLOCK_THRESHOLD_UNSPECIFIED")]
89    Unspecified,
90    #[serde(rename = "BLOCK_LOW_AND_ABOVE")]
91    BlockLowAndAbove,
92    #[serde(rename = "BLOCK_MEDIUM_AND_ABOVE")]
93    BlockMediumAndAbove,
94    #[serde(rename = "BLOCK_ONLY_HIGH")]
95    BlockOnlyHigh,
96    #[serde(rename = "BLOCK_NONE")]
97    BlockNone,
98    #[serde(rename = "OFF")]
99    Off,
100}
101#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
102#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
103#[derive(gproxy_protocol_macros::DeclaredFields)]
104#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
105pub enum FunctionCallingMode {
106    #[serde(rename = "MODE_UNSPECIFIED")]
107    Unspecified,
108    #[serde(rename = "AUTO")]
109    Auto,
110    #[serde(rename = "ANY")]
111    Any,
112    #[serde(rename = "NONE")]
113    None,
114    #[serde(rename = "VALIDATED")]
115    Validated,
116}
117#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
118#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
119#[derive(gproxy_protocol_macros::DeclaredFields)]
120#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
121pub enum Behavior {
122    #[serde(rename = "UNSPECIFIED")]
123    Unspecified,
124    #[serde(rename = "BLOCKING")]
125    Blocking,
126    #[serde(rename = "NON_BLOCKING")]
127    NonBlocking,
128}
129
130#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
131#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
132#[derive(gproxy_protocol_macros::DeclaredFields)]
133#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
134pub enum Scheduling {
135    #[serde(rename = "SCHEDULING_UNSPECIFIED")]
136    Unspecified,
137    #[serde(rename = "SILENT")]
138    Silent,
139    #[serde(rename = "WHEN_IDLE")]
140    WhenIdle,
141    #[serde(rename = "INTERRUPT")]
142    Interrupt,
143}
144#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
145#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
146#[derive(gproxy_protocol_macros::DeclaredFields)]
147#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
148pub enum Language {
149    #[serde(rename = "LANGUAGE_UNSPECIFIED")]
150    Unspecified,
151    #[serde(rename = "PYTHON")]
152    Python,
153}
154#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
155#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
156#[derive(gproxy_protocol_macros::DeclaredFields)]
157#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
158pub enum Outcome {
159    #[serde(rename = "OUTCOME_UNSPECIFIED")]
160    Unspecified,
161    #[serde(rename = "OUTCOME_OK")]
162    Ok,
163    #[serde(rename = "OUTCOME_FAILED")]
164    Failed,
165    #[serde(rename = "OUTCOME_DEADLINE_EXCEEDED")]
166    DeadlineExceeded,
167}
168#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
169#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
170#[derive(gproxy_protocol_macros::DeclaredFields)]
171#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
172pub enum ToolType {
173    #[serde(rename = "TOOL_TYPE_UNSPECIFIED")]
174    Unspecified,
175    #[serde(rename = "GOOGLE_SEARCH_WEB")]
176    GoogleSearchWeb,
177    #[serde(rename = "GOOGLE_SEARCH_IMAGE")]
178    GoogleSearchImage,
179    #[serde(rename = "URL_CONTEXT")]
180    UrlContext,
181    #[serde(rename = "GOOGLE_MAPS")]
182    GoogleMaps,
183    #[serde(rename = "FILE_SEARCH")]
184    FileSearch,
185}
186#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
187#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
188#[derive(gproxy_protocol_macros::DeclaredFields)]
189#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
190pub enum MediaResolutionLevel {
191    #[serde(rename = "MEDIA_RESOLUTION_UNSPECIFIED")]
192    Unspecified,
193    #[serde(rename = "MEDIA_RESOLUTION_LOW")]
194    Low,
195    #[serde(rename = "MEDIA_RESOLUTION_MEDIUM")]
196    Medium,
197    #[serde(rename = "MEDIA_RESOLUTION_HIGH")]
198    High,
199    #[serde(rename = "MEDIA_RESOLUTION_ULTRA_HIGH")]
200    UltraHigh,
201}
202#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
203#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
204#[derive(gproxy_protocol_macros::DeclaredFields)]
205#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
206pub enum RetrievalMode {
207    #[serde(rename = "MODE_UNSPECIFIED")]
208    Unspecified,
209    #[serde(rename = "MODE_DYNAMIC")]
210    Dynamic,
211}
212#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
213#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
214#[derive(gproxy_protocol_macros::DeclaredFields)]
215#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
216pub enum ComputerEnvironment {
217    #[serde(rename = "ENVIRONMENT_UNSPECIFIED")]
218    Unspecified,
219    #[serde(rename = "ENVIRONMENT_BROWSER")]
220    Browser,
221    #[serde(rename = "ENVIRONMENT_MOBILE")]
222    Mobile,
223    #[serde(rename = "ENVIRONMENT_DESKTOP")]
224    Desktop,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
228#[serde(rename_all = "camelCase")]
229#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
230#[derive(gproxy_protocol_macros::DeclaredFields)]
231#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
232pub struct Content {
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub parts: Option<Vec<Part>>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub role: Option<String>,
237    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
238    pub rest: Rest,
239}
240
241#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
242#[serde(rename_all = "camelCase")]
243#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
244#[derive(gproxy_protocol_macros::DeclaredFields)]
245#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
246pub struct Part {
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub thought: Option<bool>,
249    #[serde(skip_serializing_if = "Option::is_none")]
250    #[serde(alias = "thought_signature")]
251    pub thought_signature: Option<String>,
252    #[serde(skip_serializing_if = "Option::is_none")]
253    #[serde(alias = "part_metadata")]
254    pub part_metadata: Option<Rest>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    #[serde(alias = "media_resolution")]
257    pub media_resolution: Option<MediaResolution>,
258    #[serde(alias = "media_processing", skip_serializing_if = "Option::is_none")]
259    pub media_processing: Option<MediaProcessing>,
260    #[serde(alias = "audio_transcription", skip_serializing_if = "Option::is_none")]
261    pub audio_transcription: Option<super::audio::AudioTranscription>,
262    #[serde(alias = "speech_metadata", skip_serializing_if = "Option::is_none")]
263    pub speech_metadata: Option<super::audio::SpeechMetadata>,
264    #[serde(skip_serializing_if = "Option::is_none")]
265    pub text: Option<String>,
266    #[serde(skip_serializing_if = "Option::is_none")]
267    #[serde(alias = "inline_data")]
268    pub inline_data: Option<Blob>,
269    #[serde(skip_serializing_if = "Option::is_none")]
270    #[serde(alias = "function_call")]
271    pub function_call: Option<FunctionCall>,
272    #[serde(skip_serializing_if = "Option::is_none")]
273    #[serde(alias = "function_response")]
274    pub function_response: Option<FunctionResponse>,
275    #[serde(skip_serializing_if = "Option::is_none")]
276    #[serde(alias = "file_data")]
277    pub file_data: Option<FileData>,
278    #[serde(skip_serializing_if = "Option::is_none")]
279    #[serde(alias = "executable_code")]
280    pub executable_code: Option<ExecutableCode>,
281    #[serde(skip_serializing_if = "Option::is_none")]
282    #[serde(alias = "code_execution_result")]
283    pub code_execution_result: Option<CodeExecutionResult>,
284    #[serde(skip_serializing_if = "Option::is_none")]
285    #[serde(alias = "tool_call")]
286    pub tool_call: Option<ToolCall>,
287    #[serde(skip_serializing_if = "Option::is_none")]
288    #[serde(alias = "tool_response")]
289    pub tool_response: Option<ToolResponse>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    #[serde(alias = "video_metadata")]
292    pub video_metadata: Option<VideoMetadata>,
293    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
294    pub rest: Rest,
295}
296
297#[derive(
298    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
299)]
300#[serde(rename_all = "camelCase")]
301#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
302#[derive(gproxy_protocol_macros::DeclaredFields)]
303#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
304pub struct Blob {
305    #[serde(alias = "mime_type")]
306    pub mime_type: String,
307    pub data: String,
308    #[serde(alias = "display_name", skip_serializing_if = "Option::is_none")]
309    pub display_name: Option<String>,
310    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
311    pub rest: Rest,
312}
313#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
314#[serde(rename_all = "camelCase")]
315#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
316#[derive(gproxy_protocol_macros::DeclaredFields)]
317#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
318pub struct FileData {
319    #[serde(alias = "file_uri")]
320    pub file_uri: String,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    #[serde(alias = "mime_type")]
323    pub mime_type: Option<String>,
324    #[serde(alias = "display_name", skip_serializing_if = "Option::is_none")]
325    pub display_name: Option<String>,
326    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
327    pub rest: Rest,
328}
329#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
330#[serde(rename_all = "camelCase")]
331#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
332#[derive(gproxy_protocol_macros::DeclaredFields)]
333#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
334pub struct FunctionCall {
335    pub name: String,
336    #[serde(skip_serializing_if = "Option::is_none")]
337    pub id: Option<String>,
338    #[serde(skip_serializing_if = "Option::is_none")]
339    pub args: Option<Rest>,
340    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
341    pub rest: Rest,
342}
343#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
344#[serde(rename_all = "camelCase")]
345#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
346#[derive(gproxy_protocol_macros::DeclaredFields)]
347#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
348pub struct FunctionResponse {
349    pub name: String,
350    pub response: Rest,
351    #[serde(skip_serializing_if = "Option::is_none")]
352    pub id: Option<String>,
353    #[serde(skip_serializing_if = "Option::is_none")]
354    #[serde(alias = "parts")]
355    pub parts: Option<Vec<FunctionResponsePart>>,
356    #[serde(skip_serializing_if = "Option::is_none")]
357    #[serde(alias = "will_continue")]
358    pub will_continue: Option<bool>,
359    #[serde(skip_serializing_if = "Option::is_none")]
360    #[serde(alias = "scheduling")]
361    pub scheduling: Option<Scheduling>,
362    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
363    pub rest: Rest,
364}
365#[derive(
366    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
367)]
368#[serde(rename_all = "camelCase")]
369#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
370#[derive(gproxy_protocol_macros::DeclaredFields)]
371#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
372pub struct FunctionResponsePart {
373    #[serde(skip_serializing_if = "Option::is_none")]
374    #[serde(alias = "inline_data")]
375    pub inline_data: Option<Blob>,
376    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
377    pub rest: Rest,
378}
379#[derive(
380    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
381)]
382#[serde(rename_all = "camelCase")]
383#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
384#[derive(gproxy_protocol_macros::DeclaredFields)]
385#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
386pub struct ExecutableCode {
387    pub language: Language,
388    pub code: String,
389    #[serde(skip_serializing_if = "Option::is_none")]
390    pub id: Option<String>,
391    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
392    pub rest: Rest,
393}
394#[derive(
395    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
396)]
397#[serde(rename_all = "camelCase")]
398#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
399#[derive(gproxy_protocol_macros::DeclaredFields)]
400#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
401pub struct CodeExecutionResult {
402    pub outcome: Outcome,
403    #[serde(skip_serializing_if = "Option::is_none")]
404    pub id: Option<String>,
405    #[serde(skip_serializing_if = "Option::is_none")]
406    pub output: Option<String>,
407    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
408    pub rest: Rest,
409}
410#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
411#[serde(rename_all = "camelCase")]
412#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
413#[derive(gproxy_protocol_macros::DeclaredFields)]
414#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
415pub struct ToolCall {
416    #[serde(alias = "tool_type")]
417    pub tool_type: ToolType,
418    #[serde(skip_serializing_if = "Option::is_none")]
419    pub id: Option<String>,
420    #[serde(alias = "tool_name", skip_serializing_if = "Option::is_none")]
421    pub tool_name: Option<String>,
422    #[serde(skip_serializing_if = "Option::is_none")]
423    pub args: Option<Rest>,
424    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
425    pub rest: Rest,
426}
427#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
428#[serde(rename_all = "camelCase")]
429#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
430#[derive(gproxy_protocol_macros::DeclaredFields)]
431#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
432pub struct ToolResponse {
433    #[serde(alias = "tool_type")]
434    pub tool_type: ToolType,
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub id: Option<String>,
437    #[serde(skip_serializing_if = "Option::is_none")]
438    pub response: Option<Rest>,
439    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
440    pub rest: Rest,
441}
442#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
443#[serde(rename_all = "camelCase")]
444#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
445#[derive(gproxy_protocol_macros::DeclaredFields)]
446#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
447pub struct VideoMetadata {
448    #[serde(skip_serializing_if = "Option::is_none")]
449    #[serde(alias = "start_offset")]
450    pub start_offset: Option<String>,
451    #[serde(skip_serializing_if = "Option::is_none")]
452    #[serde(alias = "end_offset")]
453    pub end_offset: Option<String>,
454    #[serde(skip_serializing_if = "Option::is_none")]
455    pub fps: Option<f64>,
456    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
457    pub rest: Rest,
458}
459
460#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
461#[serde(rename_all = "camelCase")]
462#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
463#[derive(gproxy_protocol_macros::DeclaredFields)]
464#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
465pub struct MediaResolution {
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub level: Option<MediaResolutionLevel>,
468    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
469    pub rest: Rest,
470}
471
472#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
473#[serde(rename_all = "camelCase")]
474#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
475#[derive(gproxy_protocol_macros::DeclaredFields)]
476#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
477pub struct Schema {
478    #[serde(rename = "type")]
479    pub type_: SchemaType,
480    #[serde(skip_serializing_if = "Option::is_none")]
481    pub format: Option<String>,
482    #[serde(skip_serializing_if = "Option::is_none")]
483    pub title: Option<String>,
484    #[serde(skip_serializing_if = "Option::is_none")]
485    pub description: Option<String>,
486    #[serde(skip_serializing_if = "Option::is_none")]
487    pub nullable: Option<bool>,
488    #[serde(skip_serializing_if = "Option::is_none")]
489    pub r#enum: Option<Vec<String>>,
490    #[serde(skip_serializing_if = "Option::is_none")]
491    #[serde(alias = "max_items")]
492    pub max_items: Option<String>,
493    #[serde(skip_serializing_if = "Option::is_none")]
494    #[serde(alias = "min_items")]
495    pub min_items: Option<String>,
496    #[serde(skip_serializing_if = "Option::is_none")]
497    pub properties: Option<std::collections::BTreeMap<String, Box<Schema>>>,
498    #[serde(skip_serializing_if = "Option::is_none")]
499    pub required: Option<Vec<String>>,
500    #[serde(skip_serializing_if = "Option::is_none")]
501    #[serde(alias = "min_properties")]
502    pub min_properties: Option<String>,
503    #[serde(skip_serializing_if = "Option::is_none")]
504    #[serde(alias = "max_properties")]
505    pub max_properties: Option<String>,
506    #[serde(skip_serializing_if = "Option::is_none")]
507    #[serde(alias = "min_length")]
508    pub min_length: Option<String>,
509    #[serde(skip_serializing_if = "Option::is_none")]
510    #[serde(alias = "max_length")]
511    pub max_length: Option<String>,
512    #[serde(skip_serializing_if = "Option::is_none")]
513    pub pattern: Option<String>,
514    #[serde(skip_serializing_if = "Option::is_none")]
515    #[serde(default, deserialize_with = "deserialize_present_value")]
516    pub example: Option<serde_json::Value>,
517    #[serde(skip_serializing_if = "Option::is_none")]
518    #[serde(alias = "any_of")]
519    pub any_of: Option<Vec<Box<Schema>>>,
520    #[serde(skip_serializing_if = "Option::is_none")]
521    #[serde(alias = "property_ordering")]
522    pub property_ordering: Option<Vec<String>>,
523    #[serde(skip_serializing_if = "Option::is_none")]
524    #[serde(default, deserialize_with = "deserialize_present_value")]
525    pub default: Option<serde_json::Value>,
526    #[serde(skip_serializing_if = "Option::is_none")]
527    pub items: Option<Box<Schema>>,
528    #[serde(skip_serializing_if = "Option::is_none")]
529    pub minimum: Option<f64>,
530    #[serde(skip_serializing_if = "Option::is_none")]
531    pub maximum: Option<f64>,
532    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
533    pub rest: Rest,
534}
535
536#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
537#[serde(rename_all = "camelCase")]
538#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
539#[derive(gproxy_protocol_macros::DeclaredFields)]
540#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
541pub struct FunctionDeclaration {
542    pub name: String,
543    pub description: String,
544    #[serde(skip_serializing_if = "Option::is_none")]
545    pub behavior: Option<Behavior>,
546    #[serde(skip_serializing_if = "Option::is_none")]
547    pub parameters: Option<Schema>,
548    #[serde(skip_serializing_if = "Option::is_none")]
549    #[serde(alias = "parameters_json_schema")]
550    pub parameters_json_schema: Option<serde_json::Value>,
551    #[serde(skip_serializing_if = "Option::is_none")]
552    pub response: Option<Schema>,
553    #[serde(skip_serializing_if = "Option::is_none")]
554    #[serde(alias = "response_json_schema")]
555    pub response_json_schema: Option<serde_json::Value>,
556    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
557    pub rest: Rest,
558}
559#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
560#[serde(rename_all = "camelCase")]
561#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
562#[derive(gproxy_protocol_macros::DeclaredFields)]
563#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
564pub struct GoogleSearchRetrieval {
565    #[serde(skip_serializing_if = "Option::is_none")]
566    #[serde(alias = "dynamic_retrieval_config")]
567    pub dynamic_retrieval_config: Option<DynamicRetrievalConfig>,
568    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
569    pub rest: Rest,
570}
571#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
572#[serde(rename_all = "camelCase")]
573#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
574#[derive(gproxy_protocol_macros::DeclaredFields)]
575#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
576pub struct DynamicRetrievalConfig {
577    #[serde(skip_serializing_if = "Option::is_none")]
578    pub mode: Option<RetrievalMode>,
579    #[serde(skip_serializing_if = "Option::is_none")]
580    #[serde(alias = "dynamic_threshold")]
581    pub dynamic_threshold: Option<f64>,
582    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
583    pub rest: Rest,
584}
585#[derive(
586    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
587)]
588#[serde(rename_all = "camelCase")]
589#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
590#[derive(gproxy_protocol_macros::DeclaredFields)]
591#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
592pub struct CodeExecution {
593    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
594    pub rest: Rest,
595}
596#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
597#[serde(rename_all = "camelCase")]
598#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
599#[derive(gproxy_protocol_macros::DeclaredFields)]
600#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
601pub struct GoogleSearch {
602    #[serde(skip_serializing_if = "Option::is_none")]
603    #[serde(alias = "time_range_filter")]
604    pub time_range_filter: Option<Interval>,
605    #[serde(skip_serializing_if = "Option::is_none")]
606    #[serde(alias = "search_types")]
607    pub search_types: Option<SearchTypes>,
608    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
609    pub rest: Rest,
610}
611#[derive(
612    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
613)]
614#[serde(rename_all = "camelCase")]
615#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
616#[derive(gproxy_protocol_macros::DeclaredFields)]
617#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
618pub struct Interval {
619    #[serde(skip_serializing_if = "Option::is_none")]
620    #[serde(alias = "start_time")]
621    pub start_time: Option<String>,
622    #[serde(skip_serializing_if = "Option::is_none")]
623    #[serde(alias = "end_time")]
624    pub end_time: Option<String>,
625    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
626    pub rest: Rest,
627}
628#[derive(
629    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
630)]
631#[serde(rename_all = "camelCase")]
632#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
633#[derive(gproxy_protocol_macros::DeclaredFields)]
634#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
635pub struct SearchTypes {
636    #[serde(skip_serializing_if = "Option::is_none")]
637    #[serde(alias = "web_search")]
638    pub web_search: Option<WebSearch>,
639    #[serde(skip_serializing_if = "Option::is_none")]
640    #[serde(alias = "image_search")]
641    pub image_search: Option<ImageSearch>,
642    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
643    pub rest: Rest,
644}
645#[derive(
646    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
647)]
648#[serde(rename_all = "camelCase")]
649#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
650#[derive(gproxy_protocol_macros::DeclaredFields)]
651#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
652pub struct WebSearch {
653    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
654    pub rest: Rest,
655}
656#[derive(
657    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
658)]
659#[serde(rename_all = "camelCase")]
660#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
661#[derive(gproxy_protocol_macros::DeclaredFields)]
662#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
663pub struct ImageSearch {
664    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
665    pub rest: Rest,
666}
667#[derive(
668    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
669)]
670#[serde(rename_all = "camelCase")]
671#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
672#[derive(gproxy_protocol_macros::DeclaredFields)]
673#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
674pub struct UrlContext {
675    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
676    pub rest: Rest,
677}
678#[derive(
679    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
680)]
681#[serde(rename_all = "camelCase")]
682#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
683#[derive(gproxy_protocol_macros::DeclaredFields)]
684#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
685pub struct FileSearch {
686    #[serde(alias = "file_search_store_names")]
687    pub file_search_store_names: Vec<String>,
688    #[serde(skip_serializing_if = "Option::is_none")]
689    #[serde(alias = "metadata_filter")]
690    pub metadata_filter: Option<String>,
691    #[serde(skip_serializing_if = "Option::is_none")]
692    #[serde(alias = "top_k")]
693    pub top_k: Option<i64>,
694    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
695    pub rest: Rest,
696}
697#[derive(
698    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
699)]
700#[serde(rename_all = "camelCase")]
701#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
702#[derive(gproxy_protocol_macros::DeclaredFields)]
703#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
704pub struct McpServer {
705    pub name: String,
706    #[serde(skip_serializing_if = "Option::is_none")]
707    #[serde(alias = "streamable_http_transport")]
708    pub streamable_http_transport: Option<StreamableHttpTransport>,
709    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
710    pub rest: Rest,
711}
712#[derive(
713    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
714)]
715#[serde(rename_all = "camelCase")]
716#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
717#[derive(gproxy_protocol_macros::DeclaredFields)]
718#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
719pub struct StreamableHttpTransport {
720    pub url: String,
721    #[serde(skip_serializing_if = "Option::is_none")]
722    pub headers: Option<std::collections::BTreeMap<String, String>>,
723    #[serde(skip_serializing_if = "Option::is_none")]
724    pub timeout: Option<String>,
725    #[serde(skip_serializing_if = "Option::is_none")]
726    #[serde(alias = "sse_read_timeout")]
727    pub sse_read_timeout: Option<String>,
728    #[serde(skip_serializing_if = "Option::is_none")]
729    #[serde(alias = "terminate_on_close")]
730    pub terminate_on_close: Option<bool>,
731    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
732    pub rest: Rest,
733}
734#[derive(
735    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
736)]
737#[serde(rename_all = "camelCase")]
738#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
739#[derive(gproxy_protocol_macros::DeclaredFields)]
740#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
741pub struct ComputerUse {
742    pub environment: ComputerEnvironment,
743    #[serde(skip_serializing_if = "Option::is_none")]
744    #[serde(alias = "excluded_predefined_functions")]
745    pub excluded_predefined_functions: Option<Vec<String>>,
746    #[serde(
747        alias = "enable_prompt_injection_detection",
748        skip_serializing_if = "Option::is_none"
749    )]
750    pub enable_prompt_injection_detection: Option<bool>,
751    #[serde(
752        alias = "disabled_safety_policies",
753        skip_serializing_if = "Option::is_none"
754    )]
755    pub disabled_safety_policies: Option<Vec<ComputerUseSafetyPolicy>>,
756    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
757    pub rest: Rest,
758}
759#[derive(
760    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
761)]
762#[serde(rename_all = "camelCase")]
763#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
764#[derive(gproxy_protocol_macros::DeclaredFields)]
765#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
766pub struct GoogleMaps {
767    #[serde(skip_serializing_if = "Option::is_none")]
768    #[serde(alias = "enable_widget")]
769    pub enable_widget: Option<bool>,
770    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
771    pub rest: Rest,
772}
773#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
774#[serde(rename_all = "camelCase")]
775#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
776#[derive(gproxy_protocol_macros::DeclaredFields)]
777#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
778pub struct Tool {
779    #[serde(skip_serializing_if = "Option::is_none")]
780    #[serde(alias = "function_declarations")]
781    pub function_declarations: Option<Vec<FunctionDeclaration>>,
782    #[serde(skip_serializing_if = "Option::is_none")]
783    #[serde(alias = "google_search_retrieval")]
784    pub google_search_retrieval: Option<GoogleSearchRetrieval>,
785    #[serde(skip_serializing_if = "Option::is_none")]
786    #[serde(alias = "code_execution")]
787    pub code_execution: Option<CodeExecution>,
788    #[serde(skip_serializing_if = "Option::is_none")]
789    #[serde(alias = "google_search")]
790    pub google_search: Option<GoogleSearch>,
791    #[serde(skip_serializing_if = "Option::is_none")]
792    #[serde(alias = "computer_use")]
793    pub computer_use: Option<ComputerUse>,
794    #[serde(skip_serializing_if = "Option::is_none")]
795    #[serde(alias = "url_context")]
796    pub url_context: Option<UrlContext>,
797    #[serde(skip_serializing_if = "Option::is_none")]
798    #[serde(alias = "file_search")]
799    pub file_search: Option<FileSearch>,
800    #[serde(skip_serializing_if = "Option::is_none")]
801    #[serde(alias = "mcp_servers")]
802    pub mcp_servers: Option<Vec<McpServer>>,
803    #[serde(skip_serializing_if = "Option::is_none")]
804    #[serde(alias = "google_maps")]
805    pub google_maps: Option<GoogleMaps>,
806    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
807    pub rest: Rest,
808}
809#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
810#[serde(rename_all = "camelCase")]
811#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
812#[derive(gproxy_protocol_macros::DeclaredFields)]
813#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
814pub struct FunctionCallingConfig {
815    #[serde(skip_serializing_if = "Option::is_none")]
816    pub mode: Option<FunctionCallingMode>,
817    #[serde(skip_serializing_if = "Option::is_none")]
818    #[serde(alias = "allowed_function_names")]
819    pub allowed_function_names: Option<Vec<String>>,
820    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
821    pub rest: Rest,
822}
823#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
824#[serde(rename_all = "camelCase")]
825#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
826#[derive(gproxy_protocol_macros::DeclaredFields)]
827#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
828pub struct ToolConfig {
829    #[serde(skip_serializing_if = "Option::is_none")]
830    #[serde(alias = "function_calling_config")]
831    pub function_calling_config: Option<FunctionCallingConfig>,
832    #[serde(skip_serializing_if = "Option::is_none")]
833    #[serde(alias = "retrieval_config")]
834    pub retrieval_config: Option<RetrievalConfig>,
835    #[serde(skip_serializing_if = "Option::is_none")]
836    #[serde(alias = "include_server_side_tool_invocations")]
837    pub include_server_side_tool_invocations: Option<bool>,
838    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
839    pub rest: Rest,
840}
841#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
842#[serde(rename_all = "camelCase")]
843#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
844#[derive(gproxy_protocol_macros::DeclaredFields)]
845#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
846pub struct RetrievalConfig {
847    #[serde(skip_serializing_if = "Option::is_none")]
848    #[serde(alias = "lat_lng")]
849    pub lat_lng: Option<LatLng>,
850    #[serde(skip_serializing_if = "Option::is_none")]
851    #[serde(alias = "language_code")]
852    pub language_code: Option<String>,
853    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
854    pub rest: Rest,
855}
856#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
857#[serde(rename_all = "camelCase")]
858#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
859#[derive(gproxy_protocol_macros::DeclaredFields)]
860#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
861pub struct LatLng {
862    pub latitude: f64,
863    pub longitude: f64,
864    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
865    pub rest: Rest,
866}
867#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
868#[serde(rename_all = "camelCase")]
869#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
870#[derive(gproxy_protocol_macros::DeclaredFields)]
871#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
872pub struct SafetySetting {
873    pub category: HarmCategory,
874    pub threshold: HarmBlockThreshold,
875    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
876    pub rest: Rest,
877}
878
879#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
880#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
881#[derive(gproxy_protocol_macros::DeclaredFields)]
882#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
883pub enum MediaProcessing {
884    #[serde(rename = "MEDIA_PROCESSING_UNSPECIFIED")]
885    Unspecified,
886    #[serde(rename = "STATIC")]
887    Static,
888    #[serde(rename = "AGENTIC")]
889    Agentic,
890}
891
892#[derive(
893    Debug,
894    Clone,
895    Copy,
896    PartialEq,
897    Eq,
898    Serialize,
899    Deserialize,
900    gproxy_protocol_macros::DeclaredFields,
901)]
902#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
903#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
904pub enum ComputerUseSafetyPolicy {
905    #[serde(rename = "SAFETY_POLICY_UNSPECIFIED")]
906    Unspecified,
907    #[serde(rename = "FINANCIAL_TRANSACTIONS")]
908    FinancialTransactions,
909    #[serde(rename = "SENSITIVE_DATA_MODIFICATION")]
910    SensitiveDataModification,
911    #[serde(rename = "COMMUNICATION_TOOL")]
912    CommunicationTool,
913    #[serde(rename = "ACCOUNT_CREATION")]
914    AccountCreation,
915    #[serde(rename = "DATA_MODIFICATION")]
916    DataModification,
917    #[serde(rename = "USER_CONSENT_MANAGEMENT")]
918    UserConsentManagement,
919    #[serde(rename = "LEGAL_TERMS_AND_AGREEMENTS")]
920    LegalTermsAndAgreements,
921}