1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{ExtraFields, UrlRetrievalStatus};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
8#[serde(rename_all = "camelCase")]
9pub struct GroundingMetadata {
10 #[serde(default, skip_serializing_if = "Vec::is_empty")]
11 pub grounding_chunks: Vec<GroundingChunk>,
12 #[serde(default, skip_serializing_if = "Vec::is_empty")]
13 pub grounding_supports: Vec<GroundingSupport>,
14 #[serde(default, skip_serializing_if = "Vec::is_empty")]
15 pub web_search_queries: Vec<String>,
16 #[serde(default, skip_serializing_if = "Vec::is_empty")]
17 pub image_search_queries: Vec<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub search_entry_point: Option<SearchEntryPoint>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub retrieval_metadata: Option<RetrievalMetadata>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub google_maps_widget_context_token: Option<String>,
24 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
25 pub extra: ExtraFields,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
29#[serde(rename_all = "camelCase")]
30pub struct SearchEntryPoint {
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub rendered_content: Option<String>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub sdk_blob: Option<String>,
35 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
36 pub extra: ExtraFields,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
40#[serde(rename_all = "camelCase")]
41pub struct GroundingChunk {
42 #[serde(flatten, skip_serializing_if = "Option::is_none")]
43 pub source: Option<GroundingChunkSource>,
44 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
45 pub extra: ExtraFields,
46}
47
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49#[serde(untagged)]
50pub enum GroundingChunkSource {
51 Web {
52 web: WebChunk,
53 },
54 Image {
55 image: ImageChunk,
56 },
57 RetrievedContext {
58 #[serde(rename = "retrievedContext")]
59 retrieved_context: RetrievedContext,
60 },
61 Maps {
62 maps: MapsChunk,
63 },
64}
65
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
67#[serde(rename_all = "camelCase")]
68pub struct WebChunk {
69 pub uri: Option<String>,
70 pub title: Option<String>,
71 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
72 pub extra: ExtraFields,
73}
74
75#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
76#[serde(rename_all = "camelCase")]
77pub struct ImageChunk {
78 pub source_uri: Option<String>,
79 pub image_uri: Option<String>,
80 pub title: Option<String>,
81 pub domain: Option<String>,
82 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
83 pub extra: ExtraFields,
84}
85
86#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
87#[serde(rename_all = "camelCase")]
88pub struct RetrievedContext {
89 #[serde(default, skip_serializing_if = "Vec::is_empty")]
90 pub custom_metadata: Vec<CustomMetadata>,
91 pub uri: Option<String>,
92 pub title: Option<String>,
93 pub text: Option<String>,
94 pub file_search_store: Option<String>,
95 pub page_number: Option<i32>,
96 pub media_id: Option<String>,
97 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
98 pub extra: ExtraFields,
99}
100
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
102#[serde(rename_all = "camelCase")]
103pub struct CustomMetadata {
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub key: Option<String>,
106 #[serde(flatten, skip_serializing_if = "Option::is_none")]
107 pub value: Option<CustomMetadataValue>,
108 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
109 pub extra: ExtraFields,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
113#[serde(untagged)]
114pub enum CustomMetadataValue {
115 StringValue {
116 #[serde(rename = "stringValue")]
117 string_value: String,
118 },
119 StringListValue {
120 #[serde(rename = "stringListValue")]
121 string_list_value: StringList,
122 },
123 NumericValue {
124 #[serde(rename = "numericValue")]
125 numeric_value: f64,
126 },
127}
128
129#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
130pub struct StringList {
131 #[serde(default, skip_serializing_if = "Vec::is_empty")]
132 pub values: Vec<String>,
133}
134
135#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
136#[serde(rename_all = "camelCase")]
137pub struct MapsChunk {
138 pub uri: Option<String>,
139 pub title: Option<String>,
140 pub text: Option<String>,
141 pub place_id: Option<String>,
142 pub place_answer_sources: Option<PlaceAnswerSources>,
143 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
144 pub extra: ExtraFields,
145}
146
147#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
148#[serde(rename_all = "camelCase")]
149pub struct PlaceAnswerSources {
150 #[serde(default, skip_serializing_if = "Vec::is_empty")]
151 pub review_snippets: Vec<ReviewSnippet>,
152 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
153 pub extra: ExtraFields,
154}
155
156#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
157#[serde(rename_all = "camelCase")]
158pub struct ReviewSnippet {
159 pub review_id: Option<String>,
160 pub google_maps_uri: Option<String>,
161 pub title: Option<String>,
162 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
163 pub extra: ExtraFields,
164}
165
166#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
167#[serde(rename_all = "camelCase")]
168pub struct GroundingSupport {
169 #[serde(default, skip_serializing_if = "Vec::is_empty")]
170 pub grounding_chunk_indices: Vec<i32>,
171 #[serde(default, skip_serializing_if = "Vec::is_empty")]
172 pub confidence_scores: Vec<f64>,
173 #[serde(default, skip_serializing_if = "Vec::is_empty")]
174 pub rendered_parts: Vec<i32>,
175 pub segment: Option<Segment>,
176 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
177 pub extra: ExtraFields,
178}
179
180#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
181#[serde(rename_all = "camelCase")]
182pub struct Segment {
183 pub part_index: Option<i32>,
184 pub start_index: Option<i32>,
185 pub end_index: Option<i32>,
186 pub text: Option<String>,
187 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
188 pub extra: ExtraFields,
189}
190
191#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
192#[serde(rename_all = "camelCase")]
193pub struct RetrievalMetadata {
194 pub google_search_dynamic_retrieval_score: Option<f64>,
195 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
196 pub extra: ExtraFields,
197}
198
199#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
200#[serde(rename_all = "camelCase")]
201pub struct UrlContextMetadata {
202 #[serde(default, skip_serializing_if = "Vec::is_empty")]
203 pub url_metadata: Vec<UrlMetadata>,
204 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
205 pub extra: ExtraFields,
206}
207
208#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
209#[serde(rename_all = "camelCase")]
210pub struct UrlMetadata {
211 pub retrieved_url: Option<String>,
212 pub url_retrieval_status: Option<UrlRetrievalStatus>,
213 #[serde(default, skip_serializing_if = "BTreeMap::is_empty", flatten)]
214 pub extra: ExtraFields,
215}