1use serde::{Deserialize, Serialize};
2
3macro_rules! extensible_string_enum {
4 ($outer:ident, $known:ident { $first_variant:ident => $first_wire:literal $(, $variant:ident => $wire:literal)* $(,)? }) => {
5 #[derive(Debug, Clone, PartialEq, Eq, Serialize)]
6 #[serde(untagged)]
7 pub enum $outer {
8 Known($known),
9 Unknown(String),
10 }
11
12 impl<'de> serde::Deserialize<'de> for $outer {
16 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
17 crate::protocol::extensible::deserialize_extensible(d, Self::Known, Self::Unknown)
18 }
19 }
20
21 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22 pub enum $known {
23 #[serde(rename = $first_wire)]
24 $first_variant,
25 $(
26 #[serde(rename = $wire)]
27 $variant,
28 )*
29 }
30
31 impl Default for $outer {
32 fn default() -> Self {
33 Self::Known($known::$first_variant)
34 }
35 }
36 };
37}
38
39extensible_string_enum!(ContentRole, ContentRoleKnown {
40 User => "user",
41 Model => "model",
42 System => "system",
43 Function => "function",
44});
45
46extensible_string_enum!(Modality, ModalityKnown {
47 ModalityUnspecified => "MODALITY_UNSPECIFIED",
48 Text => "TEXT",
49 Image => "IMAGE",
50 Video => "VIDEO",
51 Audio => "AUDIO",
52 Document => "DOCUMENT",
53});
54
55extensible_string_enum!(ResponseModality, ResponseModalityKnown {
56 ModalityUnspecified => "MODALITY_UNSPECIFIED",
57 Text => "TEXT",
58 Image => "IMAGE",
59 Audio => "AUDIO",
60});
61
62extensible_string_enum!(ResponseMimeType, ResponseMimeTypeKnown {
63 TextPlain => "text/plain",
64 ApplicationJson => "application/json",
65 TextXEnum => "text/x.enum",
66});
67
68extensible_string_enum!(HarmCategory, HarmCategoryKnown {
69 HarmCategoryUnspecified => "HARM_CATEGORY_UNSPECIFIED",
70 HarmCategoryDerogatory => "HARM_CATEGORY_DEROGATORY",
71 HarmCategoryToxicity => "HARM_CATEGORY_TOXICITY",
72 HarmCategoryViolence => "HARM_CATEGORY_VIOLENCE",
73 HarmCategorySexual => "HARM_CATEGORY_SEXUAL",
74 HarmCategoryMedical => "HARM_CATEGORY_MEDICAL",
75 HarmCategoryDangerous => "HARM_CATEGORY_DANGEROUS",
76 HarmCategoryHarassment => "HARM_CATEGORY_HARASSMENT",
77 HarmCategoryHateSpeech => "HARM_CATEGORY_HATE_SPEECH",
78 HarmCategorySexuallyExplicit => "HARM_CATEGORY_SEXUALLY_EXPLICIT",
79 HarmCategoryDangerousContent => "HARM_CATEGORY_DANGEROUS_CONTENT",
80 HarmCategoryCivicIntegrity => "HARM_CATEGORY_CIVIC_INTEGRITY",
81});
82
83extensible_string_enum!(HarmBlockThreshold, HarmBlockThresholdKnown {
84 HarmBlockThresholdUnspecified => "HARM_BLOCK_THRESHOLD_UNSPECIFIED",
85 BlockLowAndAbove => "BLOCK_LOW_AND_ABOVE",
86 BlockMediumAndAbove => "BLOCK_MEDIUM_AND_ABOVE",
87 BlockOnlyHigh => "BLOCK_ONLY_HIGH",
88 BlockNone => "BLOCK_NONE",
89 Off => "OFF",
90});
91
92extensible_string_enum!(HarmProbability, HarmProbabilityKnown {
93 HarmProbabilityUnspecified => "HARM_PROBABILITY_UNSPECIFIED",
94 Negligible => "NEGLIGIBLE",
95 Low => "LOW",
96 Medium => "MEDIUM",
97 High => "HIGH",
98});
99
100extensible_string_enum!(ServiceTier, ServiceTierKnown {
101 Unspecified => "unspecified",
102 Standard => "standard",
103 Flex => "flex",
104 Priority => "priority",
105});
106
107extensible_string_enum!(FinishReason, FinishReasonKnown {
108 FinishReasonUnspecified => "FINISH_REASON_UNSPECIFIED",
109 Stop => "STOP",
110 MaxTokens => "MAX_TOKENS",
111 Safety => "SAFETY",
112 Recitation => "RECITATION",
113 Language => "LANGUAGE",
114 Other => "OTHER",
115 Blocklist => "BLOCKLIST",
116 ProhibitedContent => "PROHIBITED_CONTENT",
117 Spii => "SPII",
118 MalformedFunctionCall => "MALFORMED_FUNCTION_CALL",
119 ImageSafety => "IMAGE_SAFETY",
120 ImageProhibitedContent => "IMAGE_PROHIBITED_CONTENT",
121 ImageOther => "IMAGE_OTHER",
122 NoImage => "NO_IMAGE",
123 ImageRecitation => "IMAGE_RECITATION",
124 UnexpectedToolCall => "UNEXPECTED_TOOL_CALL",
125 TooManyToolCalls => "TOO_MANY_TOOL_CALLS",
126 MissingThoughtSignature => "MISSING_THOUGHT_SIGNATURE",
127 MalformedResponse => "MALFORMED_RESPONSE",
128});
129
130extensible_string_enum!(BlockReason, BlockReasonKnown {
131 BlockReasonUnspecified => "BLOCK_REASON_UNSPECIFIED",
132 Safety => "SAFETY",
133 Other => "OTHER",
134 Blocklist => "BLOCKLIST",
135 ProhibitedContent => "PROHIBITED_CONTENT",
136 ImageSafety => "IMAGE_SAFETY",
137});
138
139extensible_string_enum!(ModelStage, ModelStageKnown {
140 ModelStageUnspecified => "MODEL_STAGE_UNSPECIFIED",
141 UnstableExperimental => "UNSTABLE_EXPERIMENTAL",
142 Experimental => "EXPERIMENTAL",
143 Preview => "PREVIEW",
144 Stable => "STABLE",
145 Legacy => "LEGACY",
146 Deprecated => "DEPRECATED",
147 Retired => "RETIRED",
148});
149
150extensible_string_enum!(TaskType, TaskTypeKnown {
151 TaskTypeUnspecified => "TASK_TYPE_UNSPECIFIED",
152 RetrievalQuery => "RETRIEVAL_QUERY",
153 RetrievalDocument => "RETRIEVAL_DOCUMENT",
154 SemanticSimilarity => "SEMANTIC_SIMILARITY",
155 Classification => "CLASSIFICATION",
156 Clustering => "CLUSTERING",
157 QuestionAnswering => "QUESTION_ANSWERING",
158 FactVerification => "FACT_VERIFICATION",
159 CodeRetrievalQuery => "CODE_RETRIEVAL_QUERY",
160});
161
162extensible_string_enum!(MediaResolutionLevel, MediaResolutionLevelKnown {
163 MediaResolutionUnspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
164 MediaResolutionLow => "MEDIA_RESOLUTION_LOW",
165 MediaResolutionMedium => "MEDIA_RESOLUTION_MEDIUM",
166 MediaResolutionHigh => "MEDIA_RESOLUTION_HIGH",
167 MediaResolutionUltraHigh => "MEDIA_RESOLUTION_ULTRA_HIGH",
168});
169
170extensible_string_enum!(GenerationMediaResolution, GenerationMediaResolutionKnown {
171 MediaResolutionUnspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
172 MediaResolutionLow => "MEDIA_RESOLUTION_LOW",
173 MediaResolutionMedium => "MEDIA_RESOLUTION_MEDIUM",
174 MediaResolutionHigh => "MEDIA_RESOLUTION_HIGH",
175});
176
177extensible_string_enum!(ThinkingLevel, ThinkingLevelKnown {
178 ThinkingLevelUnspecified => "THINKING_LEVEL_UNSPECIFIED",
179 Minimal => "MINIMAL",
180 Low => "LOW",
181 Medium => "MEDIUM",
182 High => "HIGH",
183});
184
185extensible_string_enum!(FunctionResponseScheduling, FunctionResponseSchedulingKnown {
186 SchedulingUnspecified => "SCHEDULING_UNSPECIFIED",
187 Silent => "SILENT",
188 WhenIdle => "WHEN_IDLE",
189 Interrupt => "INTERRUPT",
190});
191
192extensible_string_enum!(ExecutableCodeLanguage, ExecutableCodeLanguageKnown {
193 LanguageUnspecified => "LANGUAGE_UNSPECIFIED",
194 Python => "PYTHON",
195});
196
197extensible_string_enum!(CodeExecutionOutcome, CodeExecutionOutcomeKnown {
198 OutcomeUnspecified => "OUTCOME_UNSPECIFIED",
199 OutcomeOk => "OUTCOME_OK",
200 OutcomeFailed => "OUTCOME_FAILED",
201 OutcomeDeadlineExceeded => "OUTCOME_DEADLINE_EXCEEDED",
202});
203
204extensible_string_enum!(ServerToolType, ServerToolTypeKnown {
205 ToolTypeUnspecified => "TOOL_TYPE_UNSPECIFIED",
206 GoogleSearchWeb => "GOOGLE_SEARCH_WEB",
207 GoogleSearchImage => "GOOGLE_SEARCH_IMAGE",
208 UrlContext => "URL_CONTEXT",
209 GoogleMaps => "GOOGLE_MAPS",
210 FileSearch => "FILE_SEARCH",
211});
212
213extensible_string_enum!(SchemaType, SchemaTypeKnown {
214 TypeUnspecified => "TYPE_UNSPECIFIED",
215 String => "STRING",
216 Number => "NUMBER",
217 Integer => "INTEGER",
218 Boolean => "BOOLEAN",
219 Array => "ARRAY",
220 Object => "OBJECT",
221 Null => "NULL",
222});
223
224extensible_string_enum!(FunctionBehavior, FunctionBehaviorKnown {
225 Unspecified => "UNSPECIFIED",
226 Blocking => "BLOCKING",
227 NonBlocking => "NON_BLOCKING",
228});
229
230extensible_string_enum!(DynamicRetrievalMode, DynamicRetrievalModeKnown {
231 ModeUnspecified => "MODE_UNSPECIFIED",
232 ModeDynamic => "MODE_DYNAMIC",
233});
234
235extensible_string_enum!(FunctionCallingMode, FunctionCallingModeKnown {
236 ModeUnspecified => "MODE_UNSPECIFIED",
237 Auto => "AUTO",
238 Any => "ANY",
239 None => "NONE",
240 Validated => "VALIDATED",
241});
242
243extensible_string_enum!(ComputerUseEnvironment, ComputerUseEnvironmentKnown {
244 EnvironmentUnspecified => "ENVIRONMENT_UNSPECIFIED",
245 EnvironmentBrowser => "ENVIRONMENT_BROWSER",
246});
247
248extensible_string_enum!(UrlRetrievalStatus, UrlRetrievalStatusKnown {
249 UrlRetrievalStatusUnspecified => "URL_RETRIEVAL_STATUS_UNSPECIFIED",
250 UrlRetrievalStatusSuccess => "URL_RETRIEVAL_STATUS_SUCCESS",
251 UrlRetrievalStatusError => "URL_RETRIEVAL_STATUS_ERROR",
252 UrlRetrievalStatusPaywall => "URL_RETRIEVAL_STATUS_PAYWALL",
253 UrlRetrievalStatusUnsafe => "URL_RETRIEVAL_STATUS_UNSAFE",
254});
255
256extensible_string_enum!(SupportedGenerationMethod, SupportedGenerationMethodKnown {
257 GenerateMessage => "generateMessage",
258 GenerateContent => "generateContent",
259 StreamGenerateContent => "streamGenerateContent",
260 CountTokens => "countTokens",
261 EmbedContent => "embedContent",
262 BatchEmbedContents => "batchEmbedContents",
263});
264
265extensible_string_enum!(BatchState, BatchStateKnown {
266 BatchStateUnspecified => "BATCH_STATE_UNSPECIFIED",
267 BatchStatePending => "BATCH_STATE_PENDING",
268 BatchStateRunning => "BATCH_STATE_RUNNING",
269 BatchStateSucceeded => "BATCH_STATE_SUCCEEDED",
270 BatchStateFailed => "BATCH_STATE_FAILED",
271 BatchStateCancelled => "BATCH_STATE_CANCELLED",
272 BatchStateExpired => "BATCH_STATE_EXPIRED",
273});
274
275extensible_string_enum!(ImageAspectRatio, ImageAspectRatioKnown {
276 OneToOne => "1:1",
277 OneToFour => "1:4",
278 FourToOne => "4:1",
279 OneToEight => "1:8",
280 EightToOne => "8:1",
281 TwoToThree => "2:3",
282 ThreeToTwo => "3:2",
283 ThreeToFour => "3:4",
284 FourToThree => "4:3",
285 FourToFive => "4:5",
286 FiveToFour => "5:4",
287 NineToSixteen => "9:16",
288 SixteenToNine => "16:9",
289 TwentyOneToNine => "21:9",
290});
291
292extensible_string_enum!(ImageSize, ImageSizeKnown {
293 Size512 => "512",
294 Size1K => "1K",
295 Size2K => "2K",
296 Size4K => "4K",
297});
298
299extensible_string_enum!(TextResponseFormatMimeType, TextResponseFormatMimeTypeKnown {
300 MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
301 ApplicationJson => "APPLICATION_JSON",
302 TextPlain => "TEXT_PLAIN",
303});
304
305extensible_string_enum!(AudioResponseFormatMimeType, AudioResponseFormatMimeTypeKnown {
306 MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
307 AudioMp3 => "AUDIO_MP3",
308 AudioOggOpus => "AUDIO_OGG_OPUS",
309 AudioL16 => "AUDIO_L16",
310 AudioWav => "AUDIO_WAV",
311 AudioAlaw => "AUDIO_ALAW",
312 AudioMulaw => "AUDIO_MULAW",
313});
314
315extensible_string_enum!(AudioResponseDelivery, AudioResponseDeliveryKnown {
316 DeliveryUnspecified => "DELIVERY_UNSPECIFIED",
317 Inline => "INLINE",
318 Uri => "URI",
319});
320
321extensible_string_enum!(ImageResponseFormatMimeType, ImageResponseFormatMimeTypeKnown {
322 MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
323 ImageJpeg => "IMAGE_JPEG",
324});
325
326extensible_string_enum!(ImageResponseDelivery, ImageResponseDeliveryKnown {
327 DeliveryUnspecified => "DELIVERY_UNSPECIFIED",
328 Inline => "INLINE",
329 Uri => "URI",
330});
331
332extensible_string_enum!(ImageResponseAspectRatio, ImageResponseAspectRatioKnown {
333 AspectRatioUnspecified => "ASPECT_RATIO_UNSPECIFIED",
334 AspectRatioOneByOne => "ASPECT_RATIO_ONE_BY_ONE",
335 AspectRatioTwoByThree => "ASPECT_RATIO_TWO_BY_THREE",
336 AspectRatioThreeByTwo => "ASPECT_RATIO_THREE_BY_TWO",
337 AspectRatioThreeByFour => "ASPECT_RATIO_THREE_BY_FOUR",
338 AspectRatioFourByThree => "ASPECT_RATIO_FOUR_BY_THREE",
339 AspectRatioFourByFive => "ASPECT_RATIO_FOUR_BY_FIVE",
340 AspectRatioFiveByFour => "ASPECT_RATIO_FIVE_BY_FOUR",
341 AspectRatioNineBySixteen => "ASPECT_RATIO_NINE_BY_SIXTEEN",
342 AspectRatioSixteenByNine => "ASPECT_RATIO_SIXTEEN_BY_NINE",
343 AspectRatioTwentyOneByNine => "ASPECT_RATIO_TWENTY_ONE_BY_NINE",
344 AspectRatioOneByEight => "ASPECT_RATIO_ONE_BY_EIGHT",
345 AspectRatioEightByOne => "ASPECT_RATIO_EIGHT_BY_ONE",
346 AspectRatioOneByFour => "ASPECT_RATIO_ONE_BY_FOUR",
347 AspectRatioFourByOne => "ASPECT_RATIO_FOUR_BY_ONE",
348});
349
350extensible_string_enum!(ImageResponseSize, ImageResponseSizeKnown {
351 ImageSizeUnspecified => "IMAGE_SIZE_UNSPECIFIED",
352 ImageSizeFiveTwelve => "IMAGE_SIZE_FIVE_TWELVE",
353 ImageSizeOneK => "IMAGE_SIZE_ONE_K",
354 ImageSizeTwoK => "IMAGE_SIZE_TWO_K",
355 ImageSizeFourK => "IMAGE_SIZE_FOUR_K",
356});
357
358extensible_string_enum!(SpeechLanguageCode, SpeechLanguageCodeKnown {
359 DeDe => "de-DE",
360 EnAu => "en-AU",
361 EnGb => "en-GB",
362 EnIn => "en-IN",
363 EnUs => "en-US",
364 EsUs => "es-US",
365 FrFr => "fr-FR",
366 HiIn => "hi-IN",
367 PtBr => "pt-BR",
368 ArXa => "ar-XA",
369 EsEs => "es-ES",
370 FrCa => "fr-CA",
371 IdId => "id-ID",
372 ItIt => "it-IT",
373 JaJp => "ja-JP",
374 TrTr => "tr-TR",
375 ViVn => "vi-VN",
376 BnIn => "bn-IN",
377 GuIn => "gu-IN",
378 KnIn => "kn-IN",
379 MlIn => "ml-IN",
380 MrIn => "mr-IN",
381 TaIn => "ta-IN",
382 TeIn => "te-IN",
383 NlNl => "nl-NL",
384 KoKr => "ko-KR",
385 CmnCn => "cmn-CN",
386 PlPl => "pl-PL",
387 RuRu => "ru-RU",
388 ThTh => "th-TH",
389});