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}