Skip to main content

gproxy_protocol/gemini/common/
grounding.rs

1use serde::{Deserialize, Serialize};
2
3use super::UrlRetrievalStatus;
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
6#[serde(rename_all = "camelCase")]
7#[derive(gproxy_protocol_macros::WireBuilder)]
8#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
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 = "serde_json::Map::is_empty", flatten)]
25    pub rest: serde_json::Map<String, serde_json::Value>,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
29#[serde(rename_all = "camelCase")]
30#[derive(gproxy_protocol_macros::WireBuilder)]
31#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
32pub struct SearchEntryPoint {
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub rendered_content: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub sdk_blob: Option<String>,
37    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
38    pub rest: serde_json::Map<String, serde_json::Value>,
39}
40
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
42#[serde(rename_all = "camelCase")]
43#[derive(gproxy_protocol_macros::WireBuilder)]
44#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
45pub struct GroundingChunk {
46    #[serde(flatten, skip_serializing_if = "Option::is_none")]
47    pub source: Option<GroundingChunkSource>,
48    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
49    pub rest: serde_json::Map<String, serde_json::Value>,
50}
51
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
53#[serde(untagged)]
54#[non_exhaustive]
55pub enum GroundingChunkSource {
56    Web {
57        web: WebChunk,
58        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
59        rest: serde_json::Map<String, serde_json::Value>,
60    },
61    Image {
62        image: ImageChunk,
63        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
64        rest: serde_json::Map<String, serde_json::Value>,
65    },
66    RetrievedContext {
67        #[serde(rename = "retrievedContext")]
68        retrieved_context: RetrievedContext,
69        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
70        rest: serde_json::Map<String, serde_json::Value>,
71    },
72    Maps {
73        maps: MapsChunk,
74        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
75        rest: serde_json::Map<String, serde_json::Value>,
76    },
77    Raw(serde_json::Value),
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
81#[serde(rename_all = "camelCase")]
82#[derive(gproxy_protocol_macros::WireBuilder)]
83#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
84pub struct WebChunk {
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub uri: Option<String>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub title: Option<String>,
89    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
90    pub rest: serde_json::Map<String, serde_json::Value>,
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
94#[serde(rename_all = "camelCase")]
95#[derive(gproxy_protocol_macros::WireBuilder)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97pub struct ImageChunk {
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub source_uri: Option<String>,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub image_uri: Option<String>,
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub title: Option<String>,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub domain: Option<String>,
106    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
107    pub rest: serde_json::Map<String, serde_json::Value>,
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
111#[serde(rename_all = "camelCase")]
112#[derive(gproxy_protocol_macros::WireBuilder)]
113#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
114pub struct RetrievedContext {
115    #[serde(default, skip_serializing_if = "Vec::is_empty")]
116    pub custom_metadata: Vec<CustomMetadata>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub uri: Option<String>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub title: Option<String>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub text: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub file_search_store: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub page_number: Option<i32>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub media_id: Option<String>,
129    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
130    pub rest: serde_json::Map<String, serde_json::Value>,
131}
132
133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
134#[serde(rename_all = "camelCase")]
135#[derive(gproxy_protocol_macros::WireBuilder)]
136#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
137pub struct CustomMetadata {
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub key: Option<String>,
140    #[serde(flatten, skip_serializing_if = "Option::is_none")]
141    pub value: Option<CustomMetadataValue>,
142    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
143    pub rest: serde_json::Map<String, serde_json::Value>,
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
147#[serde(untagged)]
148#[non_exhaustive]
149pub enum CustomMetadataValue {
150    StringValue {
151        #[serde(rename = "stringValue")]
152        string_value: String,
153        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
154        rest: serde_json::Map<String, serde_json::Value>,
155    },
156    StringListValue {
157        #[serde(rename = "stringListValue")]
158        string_list_value: StringList,
159        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
160        rest: serde_json::Map<String, serde_json::Value>,
161    },
162    NumericValue {
163        #[serde(rename = "numericValue")]
164        numeric_value: f64,
165        #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
166        rest: serde_json::Map<String, serde_json::Value>,
167    },
168    Raw(serde_json::Value),
169}
170
171#[derive(
172    Debug, Clone, PartialEq, Serialize, Deserialize, Default, gproxy_protocol_macros::WireBuilder,
173)]
174#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
175pub struct StringList {
176    #[serde(default, skip_serializing_if = "Vec::is_empty")]
177    pub values: Vec<String>,
178    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
179    pub rest: serde_json::Map<String, serde_json::Value>,
180}
181
182#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
183#[serde(rename_all = "camelCase")]
184#[derive(gproxy_protocol_macros::WireBuilder)]
185#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
186pub struct MapsChunk {
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub uri: Option<String>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub title: Option<String>,
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub text: Option<String>,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub place_id: Option<String>,
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub place_answer_sources: Option<PlaceAnswerSources>,
197    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
198    pub rest: serde_json::Map<String, serde_json::Value>,
199}
200
201#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
202#[serde(rename_all = "camelCase")]
203#[derive(gproxy_protocol_macros::WireBuilder)]
204#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
205pub struct PlaceAnswerSources {
206    #[serde(default, skip_serializing_if = "Vec::is_empty")]
207    pub review_snippets: Vec<ReviewSnippet>,
208    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
209    pub rest: serde_json::Map<String, serde_json::Value>,
210}
211
212#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
213#[serde(rename_all = "camelCase")]
214#[derive(gproxy_protocol_macros::WireBuilder)]
215#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
216pub struct ReviewSnippet {
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub review_id: Option<String>,
219    #[serde(skip_serializing_if = "Option::is_none")]
220    pub google_maps_uri: Option<String>,
221    #[serde(skip_serializing_if = "Option::is_none")]
222    pub title: Option<String>,
223    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
224    pub rest: serde_json::Map<String, serde_json::Value>,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
228#[serde(rename_all = "camelCase")]
229#[derive(gproxy_protocol_macros::WireBuilder)]
230#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
231pub struct GroundingSupport {
232    #[serde(default, skip_serializing_if = "Vec::is_empty")]
233    pub grounding_chunk_indices: Vec<i32>,
234    #[serde(default, skip_serializing_if = "Vec::is_empty")]
235    pub confidence_scores: Vec<f64>,
236    #[serde(default, skip_serializing_if = "Vec::is_empty")]
237    pub rendered_parts: Vec<i32>,
238    #[serde(skip_serializing_if = "Option::is_none")]
239    pub segment: Option<Segment>,
240    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
241    pub rest: serde_json::Map<String, serde_json::Value>,
242}
243
244#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
245#[serde(rename_all = "camelCase")]
246#[derive(gproxy_protocol_macros::WireBuilder)]
247#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
248pub struct Segment {
249    #[serde(skip_serializing_if = "Option::is_none")]
250    pub part_index: Option<i32>,
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub start_index: Option<i32>,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub end_index: Option<i32>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub text: Option<String>,
257    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
258    pub rest: serde_json::Map<String, serde_json::Value>,
259}
260
261#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
262#[serde(rename_all = "camelCase")]
263#[derive(gproxy_protocol_macros::WireBuilder)]
264#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
265pub struct RetrievalMetadata {
266    #[serde(skip_serializing_if = "Option::is_none")]
267    pub google_search_dynamic_retrieval_score: Option<f64>,
268    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
269    pub rest: serde_json::Map<String, serde_json::Value>,
270}
271
272#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
273#[serde(rename_all = "camelCase")]
274#[derive(gproxy_protocol_macros::WireBuilder)]
275#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
276pub struct UrlContextMetadata {
277    #[serde(default, skip_serializing_if = "Vec::is_empty")]
278    pub url_metadata: Vec<UrlMetadata>,
279    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
280    pub rest: serde_json::Map<String, serde_json::Value>,
281}
282
283#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
284#[serde(rename_all = "camelCase")]
285#[derive(gproxy_protocol_macros::WireBuilder)]
286#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
287pub struct UrlMetadata {
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub retrieved_url: Option<String>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub url_retrieval_status: Option<UrlRetrievalStatus>,
292    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
293    pub rest: serde_json::Map<String, serde_json::Value>,
294}