Skip to main content

gproxy_protocol/protocol/gemini/
images.rs

1//! Imagen native image generation wire models (Gemini API `:predict`).
2//!
3//! Imagen models (`imagen-*`) use this dedicated endpoint; `gemini-*-image`
4//! models generate through `generateContent` instead and are covered by the
5//! content-generation models.
6
7use std::collections::BTreeMap;
8
9use serde::{Deserialize, Serialize};
10
11use super::common::ExtraFields;
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
14#[serde(rename_all = "camelCase")]
15#[derive(gproxy_protocol_macros::WireBuilder)]
16#[non_exhaustive]
17pub struct ImagenPredictRequest {
18    #[serde(default, skip_serializing_if = "Vec::is_empty")]
19    pub instances: Vec<ImagenInstance>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub parameters: Option<ImagenParameters>,
22    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
23    pub extra: ExtraFields,
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
27#[serde(rename_all = "camelCase")]
28#[derive(gproxy_protocol_macros::WireBuilder)]
29#[non_exhaustive]
30pub struct ImagenInstance {
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub prompt: Option<String>,
33    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
34    pub extra: ExtraFields,
35}
36
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
38#[serde(rename_all = "camelCase")]
39#[derive(gproxy_protocol_macros::WireBuilder)]
40#[non_exhaustive]
41pub struct ImagenParameters {
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub sample_count: Option<u32>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub aspect_ratio: Option<String>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub image_size: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub person_generation: Option<String>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub negative_prompt: Option<String>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub seed: Option<i64>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub output_options: Option<ImagenOutputOptions>,
56    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
57    pub extra: ExtraFields,
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
61#[serde(rename_all = "camelCase")]
62#[derive(gproxy_protocol_macros::WireBuilder)]
63#[non_exhaustive]
64pub struct ImagenOutputOptions {
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub mime_type: Option<String>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub compression_quality: Option<u32>,
69    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
70    pub extra: ExtraFields,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
74#[serde(rename_all = "camelCase")]
75#[derive(gproxy_protocol_macros::WireBuilder)]
76#[non_exhaustive]
77pub struct ImagenPredictResponse {
78    #[serde(default, skip_serializing_if = "Vec::is_empty")]
79    pub predictions: Vec<ImagenPrediction>,
80    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
81    pub extra: ExtraFields,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
85#[serde(rename_all = "camelCase")]
86#[derive(gproxy_protocol_macros::WireBuilder)]
87#[non_exhaustive]
88pub struct ImagenPrediction {
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub bytes_base64_encoded: Option<String>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub mime_type: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub rai_filtered_reason: Option<String>,
95    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
96    pub extra: ExtraFields,
97}