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