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