Skip to main content

gproxy_protocol/wire/gemini/
voices.rs

1//! Gemini Voices API (`/v1beta/voices`), audited 2026-10-01.
2//! Source: upstream_docs/gemini/docs/Voices.md and the official Interactions OpenAPI.
3//! Bodies and query parameters use snake_case. Voice IDs stay in the URL path.
4//! These wire types do not provision voices or implement gateway routing.
5use crate::{Rest, WireRequest, WireResponse};
6use serde::{Deserialize, Serialize};
7
8pub type CreateVoiceRequest = WireRequest<CreateVoiceRequestBody>;
9pub type CreateVoiceResponse = WireResponse<Voice>;
10pub type ListVoicesRequest = WireRequest<()>;
11pub type ListVoicesResponse = WireResponse<ListVoicesResponseBody>;
12pub type GetVoiceRequest = WireRequest<()>;
13pub type GetVoiceResponse = WireResponse<Voice>;
14pub type DeleteVoiceRequest = WireRequest<()>;
15pub type DeleteVoiceResponse = WireResponse<DeleteVoiceResponseBody>;
16
17#[derive(
18    Debug,
19    Clone,
20    PartialEq,
21    Serialize,
22    Deserialize,
23    gproxy_protocol_macros::WireBuilder,
24    gproxy_protocol_macros::DeclaredFields,
25)]
26#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
27pub struct CreateVoiceRequestBody {
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub store: Option<bool>,
30    pub voice: Voice,
31    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
32    pub rest: Rest,
33}
34
35#[derive(
36    Debug,
37    Clone,
38    PartialEq,
39    Serialize,
40    Deserialize,
41    gproxy_protocol_macros::WireBuilder,
42    gproxy_protocol_macros::DeclaredFields,
43)]
44#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
45pub struct ListVoicesResponseBody {
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub next_page_token: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub voices: Option<Vec<Voice>>,
50    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
51    pub rest: Rest,
52}
53
54#[derive(
55    Debug,
56    Clone,
57    PartialEq,
58    Serialize,
59    Deserialize,
60    gproxy_protocol_macros::WireBuilder,
61    gproxy_protocol_macros::DeclaredFields,
62)]
63#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
64pub struct DeleteVoiceResponseBody {
65    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
66    pub rest: Rest,
67}
68
69#[derive(
70    Debug,
71    Clone,
72    PartialEq,
73    Serialize,
74    Deserialize,
75    gproxy_protocol_macros::WireBuilder,
76    gproxy_protocol_macros::DeclaredFields,
77)]
78#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
79pub struct Voice {
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub accent: Option<String>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub context: Option<String>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub description: Option<String>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub display_name: Option<String>,
88    /// Output only.
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub expire_time: Option<String>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub gender: Option<String>,
93    /// Output only.
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub id: Option<String>,
96    /// Output only.
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub key: Option<String>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub language_code: Option<String>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub model: Option<String>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub persona: Option<String>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub pitch: Option<Pitch>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub prompted: Option<PromptedVoice>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub region_code: Option<String>,
111    /// Input only; the server does not return consent or reference recordings.
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub replicated: Option<ReplicatedVoice>,
114    /// Output only.
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub sample_audio: Option<AudioData>,
117    #[serde(rename = "type")]
118    pub type_: VoiceType,
119    /// Output only.
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub usage: Option<Usage>,
122    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
123    pub rest: Rest,
124}
125
126#[derive(
127    Debug,
128    Clone,
129    Copy,
130    PartialEq,
131    Eq,
132    Serialize,
133    Deserialize,
134    gproxy_protocol_macros::DeclaredFields,
135)]
136#[serde(rename_all = "snake_case")]
137#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
138pub enum Pitch {
139    Low,
140    Medium,
141    High,
142}
143
144#[derive(
145    Debug,
146    Clone,
147    PartialEq,
148    Serialize,
149    Deserialize,
150    gproxy_protocol_macros::WireBuilder,
151    gproxy_protocol_macros::DeclaredFields,
152)]
153#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
154pub struct PromptedVoice {
155    pub input: String,
156    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
157    pub rest: Rest,
158}
159
160#[derive(
161    Debug,
162    Clone,
163    PartialEq,
164    Serialize,
165    Deserialize,
166    gproxy_protocol_macros::WireBuilder,
167    gproxy_protocol_macros::DeclaredFields,
168)]
169#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
170pub struct ReplicatedVoice {
171    pub consent_audio: AudioData,
172    pub source_audio: AudioData,
173    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
174    pub rest: Rest,
175}
176
177#[derive(
178    Debug,
179    Clone,
180    PartialEq,
181    Serialize,
182    Deserialize,
183    gproxy_protocol_macros::WireBuilder,
184    gproxy_protocol_macros::DeclaredFields,
185)]
186#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
187pub struct AudioData {
188    pub data: String,
189    pub mime_type: String,
190    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
191    pub rest: Rest,
192}
193
194#[derive(
195    Debug,
196    Clone,
197    Copy,
198    PartialEq,
199    Eq,
200    Serialize,
201    Deserialize,
202    gproxy_protocol_macros::DeclaredFields,
203)]
204#[serde(rename_all = "snake_case")]
205#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
206pub enum VoiceType {
207    Replicated,
208    Prompted,
209    Prebuilt,
210}
211
212#[derive(
213    Debug,
214    Clone,
215    PartialEq,
216    Serialize,
217    Deserialize,
218    gproxy_protocol_macros::WireBuilder,
219    gproxy_protocol_macros::DeclaredFields,
220)]
221#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
222pub struct Usage {
223    #[serde(skip_serializing_if = "Option::is_none")]
224    pub cached_tokens_by_modality: Option<Vec<ModalityTokens>>,
225    #[serde(skip_serializing_if = "Option::is_none")]
226    pub grounding_tool_count: Option<Vec<GroundingToolCount>>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub input_tokens_by_modality: Option<Vec<ModalityTokens>>,
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub output_tokens_by_modality: Option<Vec<ModalityTokens>>,
231    #[serde(skip_serializing_if = "Option::is_none")]
232    pub tool_use_tokens_by_modality: Option<Vec<ModalityTokens>>,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub total_cached_tokens: Option<i64>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub total_input_tokens: Option<i64>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub total_output_tokens: Option<i64>,
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub total_thought_tokens: Option<i64>,
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub total_tokens: Option<i64>,
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub total_tool_use_tokens: Option<i64>,
245    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
246    pub rest: Rest,
247}
248
249#[derive(
250    Debug,
251    Clone,
252    PartialEq,
253    Serialize,
254    Deserialize,
255    gproxy_protocol_macros::WireBuilder,
256    gproxy_protocol_macros::DeclaredFields,
257)]
258#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
259pub struct ModalityTokens {
260    #[serde(skip_serializing_if = "Option::is_none")]
261    pub modality: Option<ResponseModality>,
262    #[serde(skip_serializing_if = "Option::is_none")]
263    pub tokens: Option<i64>,
264    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
265    pub rest: Rest,
266}
267
268#[derive(
269    Debug,
270    Clone,
271    PartialEq,
272    Serialize,
273    Deserialize,
274    gproxy_protocol_macros::WireBuilder,
275    gproxy_protocol_macros::DeclaredFields,
276)]
277#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
278pub struct GroundingToolCount {
279    #[serde(skip_serializing_if = "Option::is_none")]
280    pub count: Option<i64>,
281    #[serde(skip_serializing_if = "Option::is_none")]
282    #[serde(rename = "type")]
283    pub type_: Option<GroundingToolType>,
284    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
285    pub rest: Rest,
286}
287
288#[derive(
289    Debug,
290    Clone,
291    Copy,
292    PartialEq,
293    Eq,
294    Serialize,
295    Deserialize,
296    gproxy_protocol_macros::DeclaredFields,
297)]
298#[serde(rename_all = "snake_case")]
299#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
300pub enum ResponseModality {
301    Text,
302    Image,
303    Audio,
304    Video,
305    Document,
306}
307
308#[derive(
309    Debug,
310    Clone,
311    Copy,
312    PartialEq,
313    Eq,
314    Serialize,
315    Deserialize,
316    gproxy_protocol_macros::DeclaredFields,
317)]
318#[serde(rename_all = "snake_case")]
319#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
320pub enum GroundingToolType {
321    GoogleSearch,
322    GoogleMaps,
323    Retrieval,
324}
325
326#[derive(
327    Debug,
328    Clone,
329    PartialEq,
330    Serialize,
331    Deserialize,
332    gproxy_protocol_macros::WireBuilder,
333    gproxy_protocol_macros::DeclaredFields,
334)]
335#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
336pub struct ListVoicesQuery {
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub accent: Option<Vec<String>>,
339    #[serde(skip_serializing_if = "Option::is_none")]
340    pub context: Option<Vec<String>>,
341    #[serde(skip_serializing_if = "Option::is_none")]
342    pub gender: Option<Vec<String>>,
343    #[serde(skip_serializing_if = "Option::is_none")]
344    pub language_code: Option<Vec<String>>,
345    #[serde(skip_serializing_if = "Option::is_none")]
346    pub page_size: Option<i64>,
347    #[serde(skip_serializing_if = "Option::is_none")]
348    pub page_token: Option<String>,
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub persona: Option<Vec<String>>,
351    #[serde(skip_serializing_if = "Option::is_none")]
352    pub pitch: Option<Vec<String>>,
353    #[serde(skip_serializing_if = "Option::is_none")]
354    pub region_code: Option<Vec<String>>,
355    #[serde(skip_serializing_if = "Option::is_none")]
356    pub search: Option<String>,
357    #[serde(skip_serializing_if = "Option::is_none")]
358    #[serde(rename = "type")]
359    pub type_: Option<Vec<String>>,
360    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
361    pub rest: Rest,
362}