Skip to main content

gproxy_protocol/gemini/generate_content/
mod.rs

1use serde::{Deserialize, Serialize};
2
3pub mod config;
4
5pub use config::*;
6
7use super::common::{
8    BlockReason, CitationMetadata, Content, FinishReason, GroundingMetadata, ModalityTokenCount,
9    ModelStage, SafetyRating, SafetySetting, ServiceTier, Tool, ToolConfig, UrlContextMetadata,
10};
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14#[derive(gproxy_protocol_macros::WireBuilder)]
15#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
16pub struct GenerateContentRequest {
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub model: Option<String>,
19    pub contents: Vec<Content>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub tools: Option<Vec<Tool>>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub tool_config: Option<ToolConfig>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub safety_settings: Option<Vec<SafetySetting>>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub system_instruction: Option<Content>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub generation_config: Option<GenerationConfig>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub cached_content: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub service_tier: Option<ServiceTier>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub store: Option<bool>,
36    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
37    pub rest: serde_json::Map<String, serde_json::Value>,
38}
39
40pub type StreamGenerateContentRequest = GenerateContentRequest;
41pub type StreamGenerateContentChunk = GenerateContentResponse;
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
44#[serde(rename_all = "camelCase")]
45#[derive(gproxy_protocol_macros::WireBuilder)]
46#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
47pub struct GenerateContentResponse {
48    #[serde(default, skip_serializing_if = "Vec::is_empty")]
49    pub candidates: Vec<Candidate>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub prompt_feedback: Option<PromptFeedback>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub usage_metadata: Option<UsageMetadata>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub model_version: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub response_id: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub model_status: Option<ModelStatus>,
60    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
61    pub rest: serde_json::Map<String, serde_json::Value>,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
65#[serde(rename_all = "camelCase")]
66#[derive(gproxy_protocol_macros::WireBuilder)]
67#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
68pub struct Candidate {
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub content: Option<Content>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub finish_reason: Option<FinishReason>,
73    #[serde(default, skip_serializing_if = "Vec::is_empty")]
74    pub safety_ratings: Vec<SafetyRating>,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub citation_metadata: Option<CitationMetadata>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub token_count: Option<i32>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub grounding_metadata: Option<GroundingMetadata>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub avg_logprobs: Option<f64>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub logprobs_result: Option<LogprobsResult>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub url_context_metadata: Option<UrlContextMetadata>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub index: Option<i32>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub finish_message: Option<String>,
91    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
92    pub rest: serde_json::Map<String, serde_json::Value>,
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
96#[serde(rename_all = "camelCase")]
97#[derive(gproxy_protocol_macros::WireBuilder)]
98#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
99pub struct PromptFeedback {
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub block_reason: Option<BlockReason>,
102    #[serde(default, skip_serializing_if = "Vec::is_empty")]
103    pub safety_ratings: Vec<SafetyRating>,
104    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
105    pub rest: serde_json::Map<String, serde_json::Value>,
106}
107
108#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
109#[serde(rename_all = "camelCase")]
110#[derive(gproxy_protocol_macros::WireBuilder)]
111#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
112pub struct UsageMetadata {
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub prompt_token_count: Option<i32>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub cached_content_token_count: Option<i32>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub candidates_token_count: Option<i32>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub tool_use_prompt_token_count: Option<i32>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub thoughts_token_count: Option<i32>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub total_token_count: Option<i32>,
125    #[serde(default, skip_serializing_if = "Vec::is_empty")]
126    pub prompt_tokens_details: Vec<ModalityTokenCount>,
127    #[serde(default, skip_serializing_if = "Vec::is_empty")]
128    pub cache_tokens_details: Vec<ModalityTokenCount>,
129    #[serde(default, skip_serializing_if = "Vec::is_empty")]
130    pub candidates_tokens_details: Vec<ModalityTokenCount>,
131    #[serde(default, skip_serializing_if = "Vec::is_empty")]
132    pub tool_use_prompt_tokens_details: Vec<ModalityTokenCount>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub service_tier: Option<ServiceTier>,
135    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
136    pub rest: serde_json::Map<String, serde_json::Value>,
137}
138
139#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
140#[serde(rename_all = "camelCase")]
141#[derive(gproxy_protocol_macros::WireBuilder)]
142#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
143pub struct ModelStatus {
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub model_stage: Option<ModelStage>,
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub retirement_time: Option<String>,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub message: Option<String>,
150    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
151    pub rest: serde_json::Map<String, serde_json::Value>,
152}
153
154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
155#[serde(rename_all = "camelCase")]
156#[derive(gproxy_protocol_macros::WireBuilder)]
157#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
158pub struct LogprobsResult {
159    #[serde(default, skip_serializing_if = "Vec::is_empty")]
160    pub top_candidates: Vec<TopCandidates>,
161    #[serde(default, skip_serializing_if = "Vec::is_empty")]
162    pub chosen_candidates: Vec<LogprobCandidate>,
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub log_probability_sum: Option<f64>,
165    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
166    pub rest: serde_json::Map<String, serde_json::Value>,
167}
168
169#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
170#[serde(rename_all = "camelCase")]
171#[derive(gproxy_protocol_macros::WireBuilder)]
172#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
173pub struct TopCandidates {
174    #[serde(default, skip_serializing_if = "Vec::is_empty")]
175    pub candidates: Vec<LogprobCandidate>,
176    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
177    pub rest: serde_json::Map<String, serde_json::Value>,
178}
179
180#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
181#[serde(rename_all = "camelCase")]
182#[derive(gproxy_protocol_macros::WireBuilder)]
183#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
184pub struct LogprobCandidate {
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub token: Option<String>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub token_id: Option<i32>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub log_probability: Option<f64>,
191    #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
192    pub rest: serde_json::Map<String, serde_json::Value>,
193}