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")]
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}