Skip to main content

gproxy_protocol/wire/gemini/
generation.rs

1pub use super::audio::{
2    AudioTranscriptionConfig, AudioTranscriptionMode, LanguageAuto, LanguageHints,
3    TranslationConfig,
4};
5use super::content::*;
6use crate::Rest;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
11#[derive(gproxy_protocol_macros::DeclaredFields)]
12pub enum ThinkingLevel {
13    #[serde(rename = "THINKING_LEVEL_UNSPECIFIED")]
14    Unspecified,
15    #[serde(rename = "MINIMAL")]
16    Minimal,
17    #[serde(rename = "LOW")]
18    Low,
19    #[serde(rename = "MEDIUM")]
20    Medium,
21    #[serde(rename = "HIGH")]
22    High,
23}
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
26#[derive(gproxy_protocol_macros::DeclaredFields)]
27pub enum GenerationMediaResolution {
28    #[serde(rename = "MEDIA_RESOLUTION_UNSPECIFIED")]
29    Unspecified,
30    #[serde(rename = "MEDIA_RESOLUTION_LOW")]
31    Low,
32    #[serde(rename = "MEDIA_RESOLUTION_MEDIUM")]
33    Medium,
34    #[serde(rename = "MEDIA_RESOLUTION_HIGH")]
35    High,
36}
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
39#[derive(gproxy_protocol_macros::DeclaredFields)]
40pub enum TextMimeType {
41    #[serde(rename = "MIME_TYPE_UNSPECIFIED")]
42    Unspecified,
43    #[serde(rename = "APPLICATION_JSON")]
44    ApplicationJson,
45    #[serde(rename = "TEXT_PLAIN")]
46    TextPlain,
47}
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
49#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
50#[derive(gproxy_protocol_macros::DeclaredFields)]
51pub enum AudioMimeType {
52    #[serde(rename = "MIME_TYPE_UNSPECIFIED")]
53    Unspecified,
54    #[serde(rename = "AUDIO_MP3")]
55    AudioMp3,
56    #[serde(rename = "AUDIO_OGG_OPUS")]
57    AudioOggOpus,
58    #[serde(rename = "AUDIO_L16")]
59    AudioL16,
60    #[serde(rename = "AUDIO_WAV")]
61    AudioWav,
62    #[serde(rename = "AUDIO_ALAW")]
63    AudioAlaw,
64    #[serde(rename = "AUDIO_MULAW")]
65    AudioMulaw,
66}
67#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
68#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
69#[derive(gproxy_protocol_macros::DeclaredFields)]
70pub enum Delivery {
71    #[serde(rename = "DELIVERY_UNSPECIFIED")]
72    Unspecified,
73    #[serde(rename = "INLINE")]
74    Inline,
75    #[serde(rename = "URI")]
76    Uri,
77}
78#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
79#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
80#[derive(gproxy_protocol_macros::DeclaredFields)]
81pub enum ImageMimeType {
82    #[serde(rename = "MIME_TYPE_UNSPECIFIED")]
83    Unspecified,
84    #[serde(rename = "IMAGE_JPEG")]
85    ImageJpeg,
86}
87#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
88#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
89#[derive(gproxy_protocol_macros::DeclaredFields)]
90pub enum AspectRatio {
91    #[serde(rename = "ASPECT_RATIO_UNSPECIFIED")]
92    Unspecified,
93    #[serde(rename = "ASPECT_RATIO_ONE_BY_ONE")]
94    OneByOne,
95    #[serde(rename = "ASPECT_RATIO_TWO_BY_THREE")]
96    TwoByThree,
97    #[serde(rename = "ASPECT_RATIO_THREE_BY_TWO")]
98    ThreeByTwo,
99    #[serde(rename = "ASPECT_RATIO_THREE_BY_FOUR")]
100    ThreeByFour,
101    #[serde(rename = "ASPECT_RATIO_FOUR_BY_THREE")]
102    FourByThree,
103    #[serde(rename = "ASPECT_RATIO_FOUR_BY_FIVE")]
104    FourByFive,
105    #[serde(rename = "ASPECT_RATIO_FIVE_BY_FOUR")]
106    FiveByFour,
107    #[serde(rename = "ASPECT_RATIO_NINE_BY_SIXTEEN")]
108    NineBySixteen,
109    #[serde(rename = "ASPECT_RATIO_SIXTEEN_BY_NINE")]
110    SixteenByNine,
111    #[serde(rename = "ASPECT_RATIO_TWENTY_ONE_BY_NINE")]
112    TwentyOneByNine,
113    #[serde(rename = "ASPECT_RATIO_ONE_BY_EIGHT")]
114    OneByEight,
115    #[serde(rename = "ASPECT_RATIO_EIGHT_BY_ONE")]
116    EightByOne,
117    #[serde(rename = "ASPECT_RATIO_ONE_BY_FOUR")]
118    OneByFour,
119    #[serde(rename = "ASPECT_RATIO_FOUR_BY_ONE")]
120    FourByOne,
121}
122#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
123#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
124#[derive(gproxy_protocol_macros::DeclaredFields)]
125pub enum ImageSize {
126    #[serde(rename = "IMAGE_SIZE_UNSPECIFIED")]
127    Unspecified,
128    #[serde(rename = "IMAGE_SIZE_FIVE_TWELVE")]
129    FiveTwelve,
130    #[serde(rename = "IMAGE_SIZE_ONE_K")]
131    OneK,
132    #[serde(rename = "IMAGE_SIZE_TWO_K")]
133    TwoK,
134    #[serde(rename = "IMAGE_SIZE_FOUR_K")]
135    FourK,
136}
137#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
138#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
139#[derive(gproxy_protocol_macros::DeclaredFields)]
140pub enum ServiceTier {
141    #[serde(rename = "unspecified")]
142    Unspecified,
143    #[serde(rename = "standard")]
144    Standard,
145    #[serde(rename = "flex")]
146    Flex,
147    #[serde(rename = "priority")]
148    Priority,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
152#[serde(rename_all = "camelCase")]
153#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
154#[derive(gproxy_protocol_macros::DeclaredFields)]
155pub struct SpeechConfig {
156    #[serde(skip_serializing_if = "Option::is_none")]
157    #[serde(alias = "voice_config")]
158    pub voice_config: Option<VoiceConfig>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    #[serde(alias = "multi_speaker_voice_config")]
161    pub multi_speaker_voice_config: Option<MultiSpeakerVoiceConfig>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    #[serde(alias = "language_code")]
164    pub language_code: Option<String>,
165    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
166    pub rest: Rest,
167}
168#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
169#[serde(rename_all = "camelCase")]
170#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
171#[derive(gproxy_protocol_macros::DeclaredFields)]
172pub struct VoiceConfig {
173    #[serde(alias = "prebuilt_voice_config")]
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub prebuilt_voice_config: Option<PrebuiltVoiceConfig>,
176    /// Prebuilt speaker name, stored `voice_...` ID, or client-managed `voicekey_...`.
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub voice: Option<String>,
179    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
180    pub rest: Rest,
181}
182#[derive(
183    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
184)]
185#[serde(rename_all = "camelCase")]
186#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
187#[derive(gproxy_protocol_macros::DeclaredFields)]
188pub struct PrebuiltVoiceConfig {
189    #[serde(alias = "voice_name")]
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub voice_name: Option<String>,
192    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
193    pub rest: Rest,
194}
195#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
196#[serde(rename_all = "camelCase")]
197#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
198#[derive(gproxy_protocol_macros::DeclaredFields)]
199pub struct MultiSpeakerVoiceConfig {
200    #[serde(alias = "speaker_voice_configs")]
201    pub speaker_voice_configs: Vec<SpeakerVoiceConfig>,
202    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
203    pub rest: Rest,
204}
205#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
206#[serde(rename_all = "camelCase")]
207#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
208#[derive(gproxy_protocol_macros::DeclaredFields)]
209pub struct SpeakerVoiceConfig {
210    pub speaker: String,
211    #[serde(alias = "voice_config")]
212    pub voice_config: VoiceConfig,
213    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
214    pub rest: Rest,
215}
216#[derive(
217    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
218)]
219#[serde(rename_all = "camelCase")]
220#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
221#[derive(gproxy_protocol_macros::DeclaredFields)]
222pub struct ThinkingConfig {
223    #[serde(skip_serializing_if = "Option::is_none")]
224    #[serde(alias = "thinking_budget")]
225    pub thinking_budget: Option<i64>,
226    #[serde(skip_serializing_if = "Option::is_none")]
227    #[serde(alias = "thinking_level")]
228    pub thinking_level: Option<ThinkingLevel>,
229    #[serde(skip_serializing_if = "Option::is_none")]
230    #[serde(alias = "include_thoughts")]
231    pub include_thoughts: Option<bool>,
232    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
233    pub rest: Rest,
234}
235#[derive(
236    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
237)]
238#[serde(rename_all = "camelCase")]
239#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
240#[derive(gproxy_protocol_macros::DeclaredFields)]
241pub struct ImageConfig {
242    #[serde(skip_serializing_if = "Option::is_none")]
243    #[serde(alias = "aspect_ratio")]
244    pub aspect_ratio: Option<String>,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    #[serde(alias = "image_size")]
247    pub image_size: Option<String>,
248    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
249    pub rest: Rest,
250}
251#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
252#[serde(rename_all = "camelCase")]
253#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
254#[derive(gproxy_protocol_macros::DeclaredFields)]
255pub struct ResponseFormatConfig {
256    #[serde(skip_serializing_if = "Option::is_none")]
257    pub text: Option<TextResponseFormat>,
258    #[serde(skip_serializing_if = "Option::is_none")]
259    pub audio: Option<AudioResponseFormat>,
260    #[serde(skip_serializing_if = "Option::is_none")]
261    pub image: Option<ImageResponseFormat>,
262    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
263    pub rest: Rest,
264}
265#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
266#[serde(rename_all = "camelCase")]
267#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
268#[derive(gproxy_protocol_macros::DeclaredFields)]
269pub struct TextResponseFormat {
270    #[serde(skip_serializing_if = "Option::is_none")]
271    #[serde(alias = "mime_type")]
272    pub mime_type: Option<TextMimeType>,
273    #[serde(skip_serializing_if = "Option::is_none")]
274    pub schema: Option<serde_json::Value>,
275    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
276    pub rest: Rest,
277}
278#[derive(
279    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
280)]
281#[serde(rename_all = "camelCase")]
282#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
283#[derive(gproxy_protocol_macros::DeclaredFields)]
284pub struct AudioResponseFormat {
285    #[serde(skip_serializing_if = "Option::is_none")]
286    #[serde(alias = "mime_type")]
287    pub mime_type: Option<AudioMimeType>,
288    #[serde(skip_serializing_if = "Option::is_none")]
289    pub delivery: Option<Delivery>,
290    #[serde(skip_serializing_if = "Option::is_none")]
291    #[serde(alias = "sample_rate")]
292    pub sample_rate: Option<i64>,
293    #[serde(skip_serializing_if = "Option::is_none")]
294    #[serde(alias = "bit_rate")]
295    pub bit_rate: Option<i64>,
296    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
297    pub rest: Rest,
298}
299#[derive(
300    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
301)]
302#[serde(rename_all = "camelCase")]
303#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
304#[derive(gproxy_protocol_macros::DeclaredFields)]
305pub struct ImageResponseFormat {
306    #[serde(skip_serializing_if = "Option::is_none")]
307    #[serde(alias = "mime_type")]
308    pub mime_type: Option<ImageMimeType>,
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub delivery: Option<Delivery>,
311    #[serde(skip_serializing_if = "Option::is_none")]
312    #[serde(alias = "aspect_ratio")]
313    pub aspect_ratio: Option<AspectRatio>,
314    #[serde(skip_serializing_if = "Option::is_none")]
315    #[serde(alias = "image_size")]
316    pub image_size: Option<ImageSize>,
317    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
318    pub rest: Rest,
319}
320
321#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
322#[serde(rename_all = "camelCase")]
323#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
324/// Full `GenerateContentRequest` object accepted inside CountTokens. Its
325/// `model` is part of this embedded Batch API object; standalone REST
326/// generation keeps model in its path.
327#[derive(gproxy_protocol_macros::DeclaredFields)]
328pub struct EmbeddedGenerateContentRequest {
329    /// Required by the Batch API `GenerateContentRequest` embedded in CountTokens.
330    pub model: String,
331    pub contents: Vec<Content>,
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub tools: Option<Vec<Tool>>,
334    #[serde(skip_serializing_if = "Option::is_none")]
335    #[serde(alias = "tool_config")]
336    pub tool_config: Option<ToolConfig>,
337    #[serde(skip_serializing_if = "Option::is_none")]
338    #[serde(alias = "safety_settings")]
339    pub safety_settings: Option<Vec<SafetySetting>>,
340    #[serde(skip_serializing_if = "Option::is_none")]
341    pub labels: Option<std::collections::BTreeMap<String, String>>,
342    #[serde(skip_serializing_if = "Option::is_none")]
343    #[serde(alias = "system_instruction")]
344    pub system_instruction: Option<Content>,
345    #[serde(skip_serializing_if = "Option::is_none")]
346    #[serde(alias = "generation_config")]
347    pub generation_config: Option<GenerationConfig>,
348    #[serde(skip_serializing_if = "Option::is_none")]
349    #[serde(alias = "cached_content")]
350    pub cached_content: Option<String>,
351    #[serde(skip_serializing_if = "Option::is_none")]
352    #[serde(alias = "service_tier")]
353    pub service_tier: Option<ServiceTier>,
354    #[serde(skip_serializing_if = "Option::is_none")]
355    pub store: Option<bool>,
356    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
357    pub rest: Rest,
358}
359
360#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
361#[serde(rename_all = "camelCase")]
362#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
363#[derive(gproxy_protocol_macros::DeclaredFields)]
364pub struct GenerationConfig {
365    #[serde(skip_serializing_if = "Option::is_none")]
366    #[serde(alias = "stop_sequences")]
367    pub stop_sequences: Option<Vec<String>>,
368    #[serde(skip_serializing_if = "Option::is_none")]
369    #[serde(alias = "response_mime_type")]
370    pub response_mime_type: Option<String>,
371    #[serde(skip_serializing_if = "Option::is_none")]
372    #[serde(alias = "response_schema")]
373    pub response_schema: Option<Schema>,
374    #[serde(
375        rename = "_responseJsonSchema",
376        skip_serializing_if = "Option::is_none"
377    )]
378    pub response_json_schema_internal: Option<serde_json::Value>,
379    #[serde(skip_serializing_if = "Option::is_none")]
380    #[serde(alias = "response_json_schema")]
381    pub response_json_schema: Option<serde_json::Value>,
382    #[serde(skip_serializing_if = "Option::is_none")]
383    #[serde(alias = "response_modalities")]
384    pub response_modalities: Option<Vec<Modality>>,
385    #[serde(skip_serializing_if = "Option::is_none")]
386    #[serde(alias = "candidate_count")]
387    pub candidate_count: Option<i64>,
388    #[serde(skip_serializing_if = "Option::is_none")]
389    #[serde(alias = "max_output_tokens")]
390    pub max_output_tokens: Option<i64>,
391    #[serde(skip_serializing_if = "Option::is_none")]
392    pub temperature: Option<f64>,
393    #[serde(skip_serializing_if = "Option::is_none")]
394    #[serde(alias = "top_p")]
395    pub top_p: Option<f64>,
396    #[serde(skip_serializing_if = "Option::is_none")]
397    #[serde(alias = "top_k")]
398    pub top_k: Option<i64>,
399    #[serde(skip_serializing_if = "Option::is_none")]
400    pub seed: Option<i64>,
401    #[serde(skip_serializing_if = "Option::is_none")]
402    #[serde(alias = "presence_penalty")]
403    pub presence_penalty: Option<f64>,
404    #[serde(skip_serializing_if = "Option::is_none")]
405    #[serde(alias = "frequency_penalty")]
406    pub frequency_penalty: Option<f64>,
407    #[serde(skip_serializing_if = "Option::is_none")]
408    #[serde(alias = "response_logprobs")]
409    pub response_logprobs: Option<bool>,
410    #[serde(skip_serializing_if = "Option::is_none")]
411    pub logprobs: Option<i64>,
412    #[serde(skip_serializing_if = "Option::is_none")]
413    #[serde(alias = "enable_enhanced_civic_answers")]
414    pub enable_enhanced_civic_answers: Option<bool>,
415    #[serde(skip_serializing_if = "Option::is_none")]
416    #[serde(alias = "speech_config")]
417    pub speech_config: Option<SpeechConfig>,
418    #[serde(skip_serializing_if = "Option::is_none")]
419    #[serde(alias = "thinking_config")]
420    pub thinking_config: Option<ThinkingConfig>,
421    #[serde(skip_serializing_if = "Option::is_none")]
422    #[serde(alias = "image_config")]
423    pub image_config: Option<ImageConfig>,
424    #[serde(skip_serializing_if = "Option::is_none")]
425    #[serde(alias = "media_resolution")]
426    pub media_resolution: Option<GenerationMediaResolution>,
427    #[serde(skip_serializing_if = "Option::is_none")]
428    #[serde(alias = "response_format")]
429    pub response_format: Option<ResponseFormatConfig>,
430    #[serde(
431        alias = "enable_affective_dialog",
432        skip_serializing_if = "Option::is_none"
433    )]
434    pub enable_affective_dialog: Option<bool>,
435    #[serde(alias = "translation_config", skip_serializing_if = "Option::is_none")]
436    pub translation_config: Option<TranslationConfig>,
437    #[serde(
438        alias = "audio_transcription_config",
439        skip_serializing_if = "Option::is_none"
440    )]
441    pub audio_transcription_config: Option<AudioTranscriptionConfig>,
442    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
443    pub rest: Rest,
444}