Skip to main content

gproxy_protocol/wire/gemini/
generate_content.rs

1//! Request and non-streaming response bodies for `models.generateContent`.
2//!
3//! `model` is the HTTP path resource, not a JSON body field. Response fields
4//! without a documented required constraint may be omitted by ProtoJSON;
5//! null is treated as unset, and serialization omits unset fields.
6
7use super::content::{Content, HarmCategory, SafetySetting, Tool, ToolConfig};
8use super::count_tokens::ModalityTokenCount;
9use super::generation::{GenerationConfig, ServiceTier};
10use crate::{Rest, WireRequest, WireResponse};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
14#[serde(rename_all = "camelCase")]
15#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
16#[derive(gproxy_protocol_macros::DeclaredFields)]
17pub struct GenerateContentRequestBody {
18    pub contents: Vec<Content>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub tools: Option<Vec<Tool>>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    #[serde(alias = "tool_config")]
23    pub tool_config: Option<ToolConfig>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    #[serde(alias = "safety_settings")]
26    pub safety_settings: Option<Vec<SafetySetting>>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub labels: Option<std::collections::BTreeMap<String, String>>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    #[serde(alias = "system_instruction")]
31    pub system_instruction: Option<Content>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    #[serde(alias = "generation_config")]
34    pub generation_config: Option<GenerationConfig>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    #[serde(alias = "cached_content")]
37    pub cached_content: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    #[serde(alias = "service_tier")]
40    pub service_tier: Option<ServiceTier>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub store: Option<bool>,
43    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
44    pub rest: Rest,
45}
46
47pub type GenerateContentRequest = WireRequest<GenerateContentRequestBody>;
48pub type GenerateContentResponse = WireResponse<GenerateContentResponseBody>;
49
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
51#[serde(rename_all = "camelCase")]
52#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
53#[derive(gproxy_protocol_macros::DeclaredFields)]
54pub struct GenerateContentResponseBody {
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub candidates: Option<Vec<Candidate>>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    #[serde(alias = "prompt_feedback")]
59    pub prompt_feedback: Option<PromptFeedback>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    #[serde(alias = "usage_metadata")]
62    pub usage_metadata: Option<UsageMetadata>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    #[serde(alias = "model_version")]
65    pub model_version: Option<String>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    #[serde(alias = "response_id")]
68    pub response_id: Option<String>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    #[serde(alias = "model_status")]
71    pub model_status: Option<ModelStatus>,
72    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
73    pub rest: Rest,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[serde(rename_all = "camelCase")]
78#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
79#[derive(gproxy_protocol_macros::DeclaredFields)]
80pub struct PromptFeedback {
81    #[serde(skip_serializing_if = "Option::is_none")]
82    #[serde(alias = "block_reason")]
83    pub block_reason: Option<BlockReason>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    #[serde(alias = "safety_ratings")]
86    pub safety_ratings: Option<Vec<SafetyRating>>,
87    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
88    pub rest: Rest,
89}
90
91#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
92#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
93#[derive(gproxy_protocol_macros::DeclaredFields)]
94pub enum BlockReason {
95    #[serde(rename = "BLOCK_REASON_UNSPECIFIED")]
96    Unspecified,
97    #[serde(rename = "SAFETY")]
98    Safety,
99    #[serde(rename = "OTHER")]
100    Other,
101    #[serde(rename = "BLOCKLIST")]
102    Blocklist,
103    #[serde(rename = "PROHIBITED_CONTENT")]
104    ProhibitedContent,
105    #[serde(rename = "IMAGE_SAFETY")]
106    ImageSafety,
107}
108
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
110#[serde(rename_all = "camelCase")]
111#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
112#[derive(gproxy_protocol_macros::DeclaredFields)]
113pub struct UsageMetadata {
114    #[serde(skip_serializing_if = "Option::is_none")]
115    #[serde(alias = "prompt_token_count")]
116    pub prompt_token_count: Option<i64>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    #[serde(alias = "cached_content_token_count")]
119    pub cached_content_token_count: Option<i64>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    #[serde(alias = "candidates_token_count")]
122    pub candidates_token_count: Option<i64>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    #[serde(alias = "tool_use_prompt_token_count")]
125    pub tool_use_prompt_token_count: Option<i64>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    #[serde(alias = "thoughts_token_count")]
128    pub thoughts_token_count: Option<i64>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    #[serde(alias = "total_token_count")]
131    pub total_token_count: Option<i64>,
132    #[serde(skip_serializing_if = "Option::is_none")]
133    #[serde(alias = "prompt_tokens_details")]
134    pub prompt_tokens_details: Option<Vec<ModalityTokenCount>>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    #[serde(alias = "cache_tokens_details")]
137    pub cache_tokens_details: Option<Vec<ModalityTokenCount>>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    #[serde(alias = "candidates_tokens_details")]
140    pub candidates_tokens_details: Option<Vec<ModalityTokenCount>>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    #[serde(alias = "tool_use_prompt_tokens_details")]
143    pub tool_use_prompt_tokens_details: Option<Vec<ModalityTokenCount>>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    #[serde(alias = "service_tier")]
146    pub service_tier: Option<ServiceTier>,
147    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
148    pub rest: Rest,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
152#[serde(rename_all = "camelCase")]
153#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
154#[derive(gproxy_protocol_macros::DeclaredFields)]
155pub struct ModelStatus {
156    #[serde(skip_serializing_if = "Option::is_none")]
157    #[serde(alias = "model_stage")]
158    pub model_stage: Option<ModelStage>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    #[serde(alias = "retirement_time")]
161    pub retirement_time: Option<String>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub message: Option<String>,
164    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
165    pub rest: Rest,
166}
167
168#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
169#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
170#[derive(gproxy_protocol_macros::DeclaredFields)]
171pub enum ModelStage {
172    #[serde(rename = "MODEL_STAGE_UNSPECIFIED")]
173    Unspecified,
174    #[serde(rename = "UNSTABLE_EXPERIMENTAL")]
175    UnstableExperimental,
176    #[serde(rename = "EXPERIMENTAL")]
177    Experimental,
178    #[serde(rename = "PREVIEW")]
179    Preview,
180    #[serde(rename = "STABLE")]
181    Stable,
182    #[serde(rename = "LEGACY")]
183    Legacy,
184    #[serde(rename = "DEPRECATED")]
185    Deprecated,
186    #[serde(rename = "RETIRED")]
187    Retired,
188}
189
190#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
191#[serde(rename_all = "camelCase")]
192#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
193#[derive(gproxy_protocol_macros::DeclaredFields)]
194pub struct Candidate {
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub content: Option<Content>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    #[serde(alias = "finish_reason")]
199    pub finish_reason: Option<FinishReason>,
200    #[serde(skip_serializing_if = "Option::is_none")]
201    #[serde(alias = "safety_ratings")]
202    pub safety_ratings: Option<Vec<SafetyRating>>,
203    #[serde(skip_serializing_if = "Option::is_none")]
204    #[serde(alias = "citation_metadata")]
205    pub citation_metadata: Option<CitationMetadata>,
206    #[serde(skip_serializing_if = "Option::is_none")]
207    #[serde(alias = "token_count")]
208    pub token_count: Option<i64>,
209    #[serde(skip_serializing_if = "Option::is_none")]
210    #[serde(alias = "grounding_attributions")]
211    pub grounding_attributions: Option<Vec<GroundingAttribution>>,
212    #[serde(skip_serializing_if = "Option::is_none")]
213    #[serde(alias = "grounding_metadata")]
214    pub grounding_metadata: Option<GroundingMetadata>,
215    #[serde(skip_serializing_if = "Option::is_none")]
216    #[serde(alias = "avg_logprobs")]
217    pub avg_logprobs: Option<f64>,
218    #[serde(skip_serializing_if = "Option::is_none")]
219    #[serde(alias = "logprobs_result")]
220    pub logprobs_result: Option<LogprobsResult>,
221    #[serde(skip_serializing_if = "Option::is_none")]
222    #[serde(alias = "url_context_metadata")]
223    pub url_context_metadata: Option<UrlContextMetadata>,
224    #[serde(skip_serializing_if = "Option::is_none")]
225    pub index: Option<i64>,
226    #[serde(skip_serializing_if = "Option::is_none")]
227    #[serde(alias = "finish_message")]
228    pub finish_message: Option<String>,
229    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
230    pub rest: Rest,
231}
232
233#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
234#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
235#[derive(gproxy_protocol_macros::DeclaredFields)]
236pub enum FinishReason {
237    #[serde(rename = "FINISH_REASON_UNSPECIFIED")]
238    Unspecified,
239    #[serde(rename = "STOP")]
240    Stop,
241    #[serde(rename = "MAX_TOKENS")]
242    MaxTokens,
243    #[serde(rename = "SAFETY")]
244    Safety,
245    #[serde(rename = "RECITATION")]
246    Recitation,
247    #[serde(rename = "LANGUAGE")]
248    Language,
249    #[serde(rename = "OTHER")]
250    Other,
251    #[serde(rename = "BLOCKLIST")]
252    Blocklist,
253    #[serde(rename = "PROHIBITED_CONTENT")]
254    ProhibitedContent,
255    #[serde(rename = "SPII")]
256    Spii,
257    #[serde(rename = "MALFORMED_FUNCTION_CALL")]
258    MalformedFunctionCall,
259    #[serde(rename = "IMAGE_SAFETY")]
260    ImageSafety,
261    #[serde(rename = "IMAGE_PROHIBITED_CONTENT")]
262    ImageProhibitedContent,
263    #[serde(rename = "IMAGE_OTHER")]
264    ImageOther,
265    #[serde(rename = "NO_IMAGE")]
266    NoImage,
267    #[serde(rename = "IMAGE_RECITATION")]
268    ImageRecitation,
269    #[serde(rename = "UNEXPECTED_TOOL_CALL")]
270    UnexpectedToolCall,
271    #[serde(rename = "TOO_MANY_TOOL_CALLS")]
272    TooManyToolCalls,
273    #[serde(rename = "MISSING_THOUGHT_SIGNATURE")]
274    MissingThoughtSignature,
275    #[serde(rename = "MALFORMED_RESPONSE")]
276    MalformedResponse,
277    #[serde(rename = "ESCALATION")]
278    Escalation,
279    #[serde(rename = "PUP_LIMITED_DISABLED")]
280    PupLimitedDisabled,
281}
282
283#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
284#[serde(rename_all = "camelCase")]
285#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
286#[derive(gproxy_protocol_macros::DeclaredFields)]
287pub struct SafetyRating {
288    pub category: HarmCategory,
289    pub probability: HarmProbability,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub blocked: Option<bool>,
292    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
293    pub rest: Rest,
294}
295
296#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
297#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
298#[derive(gproxy_protocol_macros::DeclaredFields)]
299pub enum HarmProbability {
300    #[serde(rename = "HARM_PROBABILITY_UNSPECIFIED")]
301    Unspecified,
302    #[serde(rename = "NEGLIGIBLE")]
303    Negligible,
304    #[serde(rename = "LOW")]
305    Low,
306    #[serde(rename = "MEDIUM")]
307    Medium,
308    #[serde(rename = "HIGH")]
309    High,
310}
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 GroundingAttribution {
317    #[serde(skip_serializing_if = "Option::is_none")]
318    #[serde(alias = "source_id")]
319    pub source_id: Option<AttributionSourceId>,
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub content: Option<Content>,
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 AttributionSourceId {
330    #[serde(skip_serializing_if = "Option::is_none")]
331    #[serde(alias = "grounding_passage")]
332    pub grounding_passage: Option<GroundingPassageId>,
333    #[serde(skip_serializing_if = "Option::is_none")]
334    #[serde(alias = "semantic_retriever_chunk")]
335    pub semantic_retriever_chunk: Option<SemanticRetrieverChunk>,
336    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
337    pub rest: Rest,
338}
339#[derive(
340    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
341)]
342#[serde(rename_all = "camelCase")]
343#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
344#[derive(gproxy_protocol_macros::DeclaredFields)]
345pub struct GroundingPassageId {
346    #[serde(skip_serializing_if = "Option::is_none")]
347    #[serde(alias = "passage_id")]
348    pub passage_id: Option<String>,
349    #[serde(skip_serializing_if = "Option::is_none")]
350    #[serde(alias = "part_index")]
351    pub part_index: Option<i64>,
352    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
353    pub rest: Rest,
354}
355#[derive(
356    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
357)]
358#[serde(rename_all = "camelCase")]
359#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
360#[derive(gproxy_protocol_macros::DeclaredFields)]
361pub struct SemanticRetrieverChunk {
362    #[serde(skip_serializing_if = "Option::is_none")]
363    pub source: Option<String>,
364    #[serde(skip_serializing_if = "Option::is_none")]
365    pub chunk: Option<String>,
366    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
367    pub rest: Rest,
368}
369
370#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
371#[serde(rename_all = "camelCase")]
372#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
373#[derive(gproxy_protocol_macros::DeclaredFields)]
374pub struct GroundingMetadata {
375    #[serde(skip_serializing_if = "Option::is_none")]
376    #[serde(alias = "grounding_chunks")]
377    pub grounding_chunks: Option<Vec<GroundingChunk>>,
378    #[serde(skip_serializing_if = "Option::is_none")]
379    #[serde(alias = "grounding_supports")]
380    pub grounding_supports: Option<Vec<GroundingSupport>>,
381    #[serde(skip_serializing_if = "Option::is_none")]
382    #[serde(alias = "web_search_queries")]
383    pub web_search_queries: Option<Vec<String>>,
384    #[serde(skip_serializing_if = "Option::is_none")]
385    #[serde(alias = "image_search_queries")]
386    pub image_search_queries: Option<Vec<String>>,
387    #[serde(skip_serializing_if = "Option::is_none")]
388    #[serde(alias = "search_entry_point")]
389    pub search_entry_point: Option<SearchEntryPoint>,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    #[serde(alias = "retrieval_metadata")]
392    pub retrieval_metadata: Option<RetrievalMetadata>,
393    #[serde(skip_serializing_if = "Option::is_none")]
394    #[serde(alias = "google_maps_widget_context_token")]
395    pub google_maps_widget_context_token: Option<String>,
396    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
397    pub rest: Rest,
398}
399#[derive(
400    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
401)]
402#[serde(rename_all = "camelCase")]
403#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
404#[derive(gproxy_protocol_macros::DeclaredFields)]
405pub struct SearchEntryPoint {
406    #[serde(skip_serializing_if = "Option::is_none")]
407    #[serde(alias = "rendered_content")]
408    pub rendered_content: Option<String>,
409    #[serde(skip_serializing_if = "Option::is_none")]
410    #[serde(alias = "sdk_blob")]
411    pub sdk_blob: Option<String>,
412    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
413    pub rest: Rest,
414}
415#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
416#[serde(rename_all = "camelCase")]
417#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
418#[derive(gproxy_protocol_macros::DeclaredFields)]
419pub struct GroundingChunk {
420    #[serde(skip_serializing_if = "Option::is_none")]
421    pub web: Option<Web>,
422    #[serde(skip_serializing_if = "Option::is_none")]
423    pub image: Option<Image>,
424    #[serde(skip_serializing_if = "Option::is_none")]
425    #[serde(alias = "retrieved_context")]
426    pub retrieved_context: Option<RetrievedContext>,
427    #[serde(skip_serializing_if = "Option::is_none")]
428    pub maps: Option<Maps>,
429    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
430    pub rest: Rest,
431}
432#[derive(
433    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
434)]
435#[serde(rename_all = "camelCase")]
436#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
437#[derive(gproxy_protocol_macros::DeclaredFields)]
438pub struct Web {
439    #[serde(skip_serializing_if = "Option::is_none")]
440    pub uri: Option<String>,
441    #[serde(skip_serializing_if = "Option::is_none")]
442    pub title: Option<String>,
443    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
444    pub rest: Rest,
445}
446#[derive(
447    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
448)]
449#[serde(rename_all = "camelCase")]
450#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
451#[derive(gproxy_protocol_macros::DeclaredFields)]
452pub struct Image {
453    #[serde(skip_serializing_if = "Option::is_none")]
454    #[serde(alias = "source_uri")]
455    pub source_uri: Option<String>,
456    #[serde(skip_serializing_if = "Option::is_none")]
457    #[serde(alias = "image_uri")]
458    pub image_uri: Option<String>,
459    #[serde(skip_serializing_if = "Option::is_none")]
460    pub title: Option<String>,
461    #[serde(skip_serializing_if = "Option::is_none")]
462    pub domain: Option<String>,
463    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
464    pub rest: Rest,
465}
466#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
467#[serde(rename_all = "camelCase")]
468#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
469#[derive(gproxy_protocol_macros::DeclaredFields)]
470pub struct RetrievedContext {
471    #[serde(skip_serializing_if = "Option::is_none")]
472    #[serde(alias = "custom_metadata")]
473    pub custom_metadata: Option<Vec<CustomMetadata>>,
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub uri: Option<String>,
476    #[serde(skip_serializing_if = "Option::is_none")]
477    pub title: Option<String>,
478    #[serde(skip_serializing_if = "Option::is_none")]
479    pub text: Option<String>,
480    #[serde(skip_serializing_if = "Option::is_none")]
481    #[serde(alias = "file_search_store")]
482    pub file_search_store: Option<String>,
483    #[serde(skip_serializing_if = "Option::is_none")]
484    #[serde(alias = "page_number")]
485    pub page_number: Option<i64>,
486    #[serde(skip_serializing_if = "Option::is_none")]
487    #[serde(alias = "media_id")]
488    pub media_id: Option<String>,
489    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
490    pub rest: Rest,
491}
492#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
493#[serde(rename_all = "camelCase")]
494#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
495#[derive(gproxy_protocol_macros::DeclaredFields)]
496pub struct CustomMetadata {
497    #[serde(skip_serializing_if = "Option::is_none")]
498    pub key: Option<String>,
499    #[serde(skip_serializing_if = "Option::is_none")]
500    #[serde(alias = "string_value")]
501    pub string_value: Option<String>,
502    #[serde(skip_serializing_if = "Option::is_none")]
503    #[serde(alias = "string_list_value")]
504    pub string_list_value: Option<StringList>,
505    #[serde(skip_serializing_if = "Option::is_none")]
506    #[serde(alias = "numeric_value")]
507    pub numeric_value: Option<f64>,
508    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
509    pub rest: Rest,
510}
511#[derive(
512    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
513)]
514#[serde(rename_all = "camelCase")]
515#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
516#[derive(gproxy_protocol_macros::DeclaredFields)]
517pub struct StringList {
518    #[serde(skip_serializing_if = "Option::is_none")]
519    pub values: Option<Vec<String>>,
520    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
521    pub rest: Rest,
522}
523#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
524#[serde(rename_all = "camelCase")]
525#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
526#[derive(gproxy_protocol_macros::DeclaredFields)]
527pub struct Maps {
528    #[serde(skip_serializing_if = "Option::is_none")]
529    pub uri: Option<String>,
530    #[serde(skip_serializing_if = "Option::is_none")]
531    pub title: Option<String>,
532    #[serde(skip_serializing_if = "Option::is_none")]
533    pub text: Option<String>,
534    #[serde(skip_serializing_if = "Option::is_none")]
535    #[serde(alias = "place_id")]
536    pub place_id: Option<String>,
537    #[serde(skip_serializing_if = "Option::is_none")]
538    #[serde(alias = "place_answer_sources")]
539    pub place_answer_sources: Option<PlaceAnswerSources>,
540    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
541    pub rest: Rest,
542}
543#[derive(
544    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
545)]
546#[serde(rename_all = "camelCase")]
547#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
548#[derive(gproxy_protocol_macros::DeclaredFields)]
549pub struct PlaceAnswerSources {
550    #[serde(skip_serializing_if = "Option::is_none")]
551    #[serde(alias = "review_snippets")]
552    pub review_snippets: Option<Vec<ReviewSnippet>>,
553    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
554    pub rest: Rest,
555}
556#[derive(
557    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
558)]
559#[serde(rename_all = "camelCase")]
560#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
561#[derive(gproxy_protocol_macros::DeclaredFields)]
562pub struct ReviewSnippet {
563    #[serde(skip_serializing_if = "Option::is_none")]
564    #[serde(alias = "review_id")]
565    pub review_id: Option<String>,
566    #[serde(skip_serializing_if = "Option::is_none")]
567    #[serde(alias = "google_maps_uri")]
568    pub google_maps_uri: Option<String>,
569    #[serde(skip_serializing_if = "Option::is_none")]
570    pub title: Option<String>,
571    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
572    pub rest: Rest,
573}
574
575#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
576#[serde(rename_all = "camelCase")]
577#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
578#[derive(gproxy_protocol_macros::DeclaredFields)]
579pub struct GroundingSupport {
580    #[serde(skip_serializing_if = "Option::is_none")]
581    #[serde(alias = "grounding_chunk_indices")]
582    pub grounding_chunk_indices: Option<Vec<i64>>,
583    #[serde(skip_serializing_if = "Option::is_none")]
584    #[serde(alias = "confidence_scores")]
585    pub confidence_scores: Option<Vec<f64>>,
586    #[serde(skip_serializing_if = "Option::is_none")]
587    #[serde(alias = "rendered_parts")]
588    pub rendered_parts: Option<Vec<i64>>,
589    #[serde(skip_serializing_if = "Option::is_none")]
590    pub segment: Option<Segment>,
591    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
592    pub rest: Rest,
593}
594#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
595#[serde(rename_all = "camelCase")]
596#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
597#[derive(gproxy_protocol_macros::DeclaredFields)]
598pub struct Segment {
599    #[serde(skip_serializing_if = "Option::is_none")]
600    #[serde(alias = "part_index")]
601    pub part_index: Option<i64>,
602    #[serde(skip_serializing_if = "Option::is_none")]
603    #[serde(alias = "start_index")]
604    pub start_index: Option<i64>,
605    #[serde(skip_serializing_if = "Option::is_none")]
606    #[serde(alias = "end_index")]
607    pub end_index: Option<i64>,
608    #[serde(skip_serializing_if = "Option::is_none")]
609    pub text: Option<String>,
610    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
611    pub rest: Rest,
612}
613#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
614#[serde(rename_all = "camelCase")]
615#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
616#[derive(gproxy_protocol_macros::DeclaredFields)]
617pub struct RetrievalMetadata {
618    #[serde(skip_serializing_if = "Option::is_none")]
619    #[serde(alias = "google_search_dynamic_retrieval_score")]
620    pub google_search_dynamic_retrieval_score: Option<f64>,
621    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
622    pub rest: Rest,
623}
624
625#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
626#[serde(rename_all = "camelCase")]
627#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
628#[derive(gproxy_protocol_macros::DeclaredFields)]
629pub struct LogprobsResult {
630    #[serde(skip_serializing_if = "Option::is_none")]
631    #[serde(alias = "top_candidates")]
632    pub top_candidates: Option<Vec<TopCandidates>>,
633    #[serde(skip_serializing_if = "Option::is_none")]
634    #[serde(alias = "chosen_candidates")]
635    pub chosen_candidates: Option<Vec<LogprobCandidate>>,
636    #[serde(skip_serializing_if = "Option::is_none")]
637    #[serde(alias = "log_probability_sum")]
638    pub log_probability_sum: Option<f64>,
639    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
640    pub rest: Rest,
641}
642#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
643#[serde(rename_all = "camelCase")]
644#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
645#[derive(gproxy_protocol_macros::DeclaredFields)]
646pub struct TopCandidates {
647    #[serde(skip_serializing_if = "Option::is_none")]
648    pub candidates: Option<Vec<LogprobCandidate>>,
649    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
650    pub rest: Rest,
651}
652#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
653#[serde(rename_all = "camelCase")]
654#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
655#[derive(gproxy_protocol_macros::DeclaredFields)]
656pub struct LogprobCandidate {
657    #[serde(skip_serializing_if = "Option::is_none")]
658    pub token: Option<String>,
659    #[serde(skip_serializing_if = "Option::is_none")]
660    #[serde(alias = "token_id")]
661    pub token_id: Option<i64>,
662    #[serde(skip_serializing_if = "Option::is_none")]
663    #[serde(alias = "log_probability")]
664    pub log_probability: Option<f64>,
665    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
666    pub rest: Rest,
667}
668#[derive(
669    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
670)]
671#[serde(rename_all = "camelCase")]
672#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
673#[derive(gproxy_protocol_macros::DeclaredFields)]
674pub struct UrlContextMetadata {
675    #[serde(skip_serializing_if = "Option::is_none")]
676    #[serde(alias = "url_metadata")]
677    pub url_metadata: Option<Vec<UrlMetadata>>,
678    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
679    pub rest: Rest,
680}
681#[derive(
682    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
683)]
684#[serde(rename_all = "camelCase")]
685#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
686#[derive(gproxy_protocol_macros::DeclaredFields)]
687pub struct UrlMetadata {
688    #[serde(skip_serializing_if = "Option::is_none")]
689    #[serde(alias = "retrieved_url")]
690    pub retrieved_url: Option<String>,
691    #[serde(skip_serializing_if = "Option::is_none")]
692    #[serde(alias = "url_retrieval_status")]
693    pub url_retrieval_status: Option<UrlRetrievalStatus>,
694    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
695    pub rest: Rest,
696}
697#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
698#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
699#[derive(gproxy_protocol_macros::DeclaredFields)]
700pub enum UrlRetrievalStatus {
701    #[serde(rename = "URL_RETRIEVAL_STATUS_UNSPECIFIED")]
702    Unspecified,
703    #[serde(rename = "URL_RETRIEVAL_STATUS_SUCCESS")]
704    Success,
705    #[serde(rename = "URL_RETRIEVAL_STATUS_ERROR")]
706    Error,
707    #[serde(rename = "URL_RETRIEVAL_STATUS_PAYWALL")]
708    Paywall,
709    #[serde(rename = "URL_RETRIEVAL_STATUS_UNSAFE")]
710    Unsafe,
711}
712
713#[derive(
714    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
715)]
716#[serde(rename_all = "camelCase")]
717#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
718#[derive(gproxy_protocol_macros::DeclaredFields)]
719pub struct CitationMetadata {
720    #[serde(skip_serializing_if = "Option::is_none")]
721    #[serde(alias = "citation_sources")]
722    pub citation_sources: Option<Vec<CitationSource>>,
723    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
724    pub rest: Rest,
725}
726#[derive(
727    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
728)]
729#[serde(rename_all = "camelCase")]
730#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
731#[derive(gproxy_protocol_macros::DeclaredFields)]
732pub struct CitationSource {
733    #[serde(skip_serializing_if = "Option::is_none")]
734    #[serde(alias = "start_index")]
735    pub start_index: Option<i64>,
736    #[serde(skip_serializing_if = "Option::is_none")]
737    #[serde(alias = "end_index")]
738    pub end_index: Option<i64>,
739    #[serde(skip_serializing_if = "Option::is_none")]
740    pub uri: Option<String>,
741    #[serde(skip_serializing_if = "Option::is_none")]
742    pub license: Option<String>,
743    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
744    pub rest: Rest,
745}