Skip to main content

gproxy_protocol/protocol/gemini/generate_content/
mod.rs

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