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