Skip to main content

google_gemini_rs/google/
response.rs

1//! Response types and wrappers for Google AI Models. See: https://ai.google.dev/api/generate-content
2
3use 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}