1use 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}