1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::common::{Content, HarmCategory, HarmProbability, Modality};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
10pub enum FinishReason {
11 FinishReasonUnspecified,
12 Stop,
13 MaxTokens,
14 Safety,
15 Recitation,
16 Language,
17 Other,
18 BlockList,
19 ProhibitedContent,
20 Spii,
21 MalformedFunctionCall,
22 ImageSafety,
23}
24
25#[derive(Clone, Debug, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct SafetyRating {
28 pub category: HarmCategory,
29 pub probability: HarmProbability,
30 #[serde(default)]
31 pub blocked: bool,
32}
33
34#[derive(Clone, Debug, Serialize, Deserialize)]
35#[serde(rename_all = "camelCase")]
36pub struct CitationSource {
37 #[serde(default)]
38 pub start_index: Option<u32>,
39 #[serde(default)]
40 pub end_index: Option<u32>,
41 #[serde(default)]
42 pub uri: Option<String>,
43 #[serde(default)]
44 pub license: Option<String>,
45}
46
47#[derive(Clone, Debug, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct CitationMetadata {
50 #[serde(default)]
51 pub citation_sources: Vec<CitationSource>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct GroundingPassageId {
57 pub passage_id: String,
58 pub part_index: i32,
59}
60
61#[derive(Clone, Debug, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63pub struct SemanticRetrieverChunk {
64 pub source: String,
65 pub chunk: String,
66}
67
68#[derive(Clone, Debug, Serialize, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct AttributionSourceId {
71 pub grounding_passage: GroundingPassageId,
72 pub semantic_retriever_chunk: SemanticRetrieverChunk,
73}
74
75#[derive(Clone, Debug, Serialize, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct GroundingAttribution {
78 pub source_id: AttributionSourceId,
79 pub content: Content,
80}
81
82#[derive(Clone, Debug, Serialize, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct Web {
85 pub uri: String,
86 pub title: String,
87}
88
89#[derive(Clone, Debug, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct GroundingChunk {
92 pub web: Web,
93}
94
95#[derive(Clone, Debug, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase")]
97pub struct Segment {
98 pub part_index: i32,
99 pub start_index: i32,
100 pub end_index: i32,
101 pub text: String,
102}
103
104#[derive(Clone, Debug, Serialize, Deserialize)]
105#[serde(rename_all = "camelCase")]
106pub struct GroundingSupport {
107 #[serde(default)]
108 pub grounding_chunk_indices: Vec<i32>,
109 #[serde(default)]
110 pub confidence_scores: Vec<f32>,
111 pub segment: Segment,
112}
113
114#[derive(Clone, Debug, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct SearchEntryPoint {
117 #[serde(default)]
118 pub rendered_content: Option<String>,
119 #[serde(default)]
120 pub sdk_blob: Option<String>,
121}
122
123#[derive(Clone, Debug, Serialize, Deserialize)]
124#[serde(rename_all = "camelCase")]
125pub struct RetrievalMetadata {
126 #[serde(default)]
127 pub google_search_dynamic_retrieval_score: Option<f32>,
128}
129
130#[derive(Clone, Debug, Serialize, Deserialize)]
131#[serde(rename_all = "camelCase")]
132pub struct GroundingMetadata {
133 #[serde(default)]
134 pub grounding_chunks: Vec<GroundingChunk>,
135 #[serde(default)]
136 pub grounding_supports: Vec<GroundingSupport>,
137 #[serde(default)]
138 pub web_search_queries: Vec<String>,
139 #[serde(default)]
140 pub search_entry_point: Option<SearchEntryPoint>,
141 pub retrieval_metadata: RetrievalMetadata,
142}
143
144#[derive(Clone, Debug, Serialize, Deserialize)]
145#[serde(rename = "candidate")]
146pub struct LogCandidate {
147 pub token: String,
148 pub token_id: i32,
149 pub log_probability: f32,
150}
151
152#[derive(Clone, Debug, Serialize, Deserialize)]
153#[serde(rename_all = "camelCase")]
154pub struct TopCandidates {
155 pub candidates: LogCandidate,
156}
157
158#[derive(Clone, Debug, Serialize, Deserialize)]
159#[serde(rename_all = "camelCase")]
160pub struct LogprobsResult {
161 #[serde(default)]
162 pub top_candidates: Vec<TopCandidates>,
163 #[serde(default)]
164 pub chosen_candidates: Vec<LogCandidate>,
165}
166
167#[derive(Clone, Debug, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct UrlRetrievalContext {
170 pub retrieved_url: String,
171}
172
173#[derive(Clone, Debug, Serialize, Deserialize)]
174#[serde(rename_all = "camelCase")]
175pub struct UrlRetrievalMetadata {
176 #[serde(default)]
177 pub url_retrieval_contexts: Vec<UrlRetrievalContext>,
178}
179
180#[derive(Clone, Debug, Serialize, Deserialize, Default)]
181#[serde(rename_all = "camelCase")]
182pub struct Candidate {
183 pub content: Content,
184 #[serde(default)]
185 pub finish_reason: Option<FinishReason>,
186 #[serde(default)]
187 pub safety_ratings: Vec<SafetyRating>,
188 #[serde(default)]
189 pub citation_metadata: Option<CitationMetadata>,
190 #[serde(default)]
191 pub grounding_attributions: Vec<GroundingAttribution>,
192 #[serde(default)]
193 pub grounding_metadata: Option<GroundingMetadata>,
194 #[serde(default)]
195 pub avg_logprobs: Option<f32>,
196 #[serde(default)]
197 pub logprobs_result: Option<LogprobsResult>,
198 #[serde(default)]
199 pub url_retrieval_metadata: Option<UrlRetrievalMetadata>,
200 #[serde(default)]
201 pub index: Option<i32>,
202 #[serde(default)]
203 pub token_count: Option<i32>,
204}
205
206#[derive(Clone, Debug, Serialize, Deserialize)]
207#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
208pub enum BlockReason {
209 BlockReasonUnspecified,
210 Safety,
211 Other,
212 BlockList,
213 ProhibitedContent,
214 ImageSafety,
215}
216
217#[derive(Clone, Debug, Serialize, Deserialize)]
218#[serde(rename_all = "camelCase")]
219pub struct PromptFeedBack {
220 #[serde(default)]
221 pub block_reason: Option<BlockReason>,
222 #[serde(default)]
223 pub safety_ratings: Vec<SafetyRating>,
224}
225
226#[derive(Clone, Debug, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct ModalityTokenCount {
229 pub modality: Modality,
230 pub token_count: i32,
231}
232
233#[derive(Clone, Debug, Serialize, Deserialize)]
234#[serde(rename_all = "camelCase")]
235pub struct UsageMetadata {
236 #[serde(default)]
237 pub prompt_token_count: Option<i32>,
238 #[serde(default)]
239 pub cached_content_token_count: Option<i32>,
240 #[serde(default)]
241 pub candidates_token_count: Option<i32>,
242 #[serde(default)]
243 pub tool_use_prompt_token_count: Option<i32>,
244 #[serde(default)]
245 pub thoughts_token_count: Option<i32>,
246 #[serde(default)]
247 pub total_token_count: Option<i32>,
248 #[serde(default)]
249 pub prompt_tokens_details: Vec<ModalityTokenCount>,
250 #[serde(default)]
251 pub cache_tokens_details: Vec<ModalityTokenCount>,
252 #[serde(default)]
253 pub candidates_tokens_details: Vec<ModalityTokenCount>,
254 #[serde(default)]
255 pub tool_use_prompt_tokens_details: Vec<ModalityTokenCount>,
256}
257
258#[derive(Clone, Debug, Serialize, Deserialize, Default)]
259#[serde(rename_all = "camelCase")]
260pub struct ContentResponse {
261 #[serde(default)]
262 pub candidates: Vec<Candidate>,
263 #[serde(default)]
264 pub prompt_feedback: Option<PromptFeedBack>,
265 #[serde(default)]
266 pub usage_metadata: Option<UsageMetadata>,
267 #[serde(default)]
268 pub model_version: Option<String>,
269 #[serde(default)]
270 pub error: Option<Value>,
271}