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