Skip to main content

gproxy_protocol/protocol/gemini/common/
grounding.rs

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}