gproxy_protocol/protocol/gemini/generate_content/
mod.rs1use 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}