Skip to main content

gproxy_protocol/wire/gemini/live/
server.rs

1use super::LiveContent;
2use super::LiveInt64;
3use crate::Rest;
4use crate::gemini::FunctionCall;
5use crate::gemini::count_tokens::ModalityTokenCount;
6use crate::gemini::generation::ServiceTier;
7use serde::{Deserialize, Serialize};
8
9// The Developer API grounding and URL-context definitions are the same as
10// GenerateContent. SDK retrieval_queries/source_flagging_uris are Vertex-only.
11pub type LiveGroundingMetadata = crate::gemini::generate_content::GroundingMetadata;
12pub type LiveUrlContextMetadata = crate::gemini::generate_content::UrlContextMetadata;
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
15#[serde(rename_all = "camelCase")]
16#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
17#[derive(gproxy_protocol_macros::DeclaredFields)]
18#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
19pub struct BidiGenerateContentServerContent {
20    #[serde(alias = "model_turn")]
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub model_turn: Option<LiveContent>,
23    #[serde(alias = "generation_complete")]
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub generation_complete: Option<bool>,
26    #[serde(alias = "turn_complete")]
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub turn_complete: Option<bool>,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub interrupted: Option<bool>,
31    #[serde(alias = "grounding_metadata")]
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub grounding_metadata: Option<LiveGroundingMetadata>,
34    #[serde(alias = "input_transcription")]
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub input_transcription: Option<BidiGenerateContentTranscription>,
37    #[serde(alias = "output_transcription")]
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub output_transcription: Option<BidiGenerateContentTranscription>,
40    #[serde(alias = "interim_input_transcription")]
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub interim_input_transcription: Option<BidiGenerateContentTranscription>,
43    #[serde(alias = "url_context_metadata")]
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub url_context_metadata: Option<LiveUrlContextMetadata>,
46    #[serde(alias = "waiting_for_input")]
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub waiting_for_input: Option<bool>,
49    #[serde(alias = "turn_complete_reason")]
50    #[serde(default, skip_serializing_if = "Option::is_none")]
51    pub turn_complete_reason: Option<TurnCompleteReason>,
52    #[serde(alias = "interaction_status")]
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub interaction_status: Option<InteractionStatus>,
55    #[serde(alias = "speech_state")]
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub speech_state: Option<SpeechState>,
58    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
59    pub rest: Rest,
60}
61
62#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
63#[serde(rename_all = "camelCase")]
64#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
65#[derive(gproxy_protocol_macros::DeclaredFields)]
66#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
67pub struct BidiGenerateContentToolCall {
68    #[serde(alias = "function_calls")]
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub function_calls: Option<Vec<FunctionCall>>,
71    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
72    pub rest: Rest,
73}
74
75#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
76#[serde(rename_all = "camelCase")]
77#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
78#[derive(gproxy_protocol_macros::DeclaredFields)]
79#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
80pub struct BidiGenerateContentToolCallCancellation {
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub ids: Option<Vec<String>>,
83    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
84    pub rest: Rest,
85}
86
87#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
88#[serde(rename_all = "camelCase")]
89#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
90#[derive(gproxy_protocol_macros::DeclaredFields)]
91#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
92pub struct GoAway {
93    #[serde(alias = "time_left")]
94    #[serde(default, skip_serializing_if = "Option::is_none")]
95    pub time_left: Option<String>,
96    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
97    pub rest: Rest,
98}
99
100#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
101#[serde(rename_all = "camelCase")]
102#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
103#[derive(gproxy_protocol_macros::DeclaredFields)]
104#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
105pub struct SessionResumptionUpdate {
106    #[serde(alias = "new_handle")]
107    #[serde(default, skip_serializing_if = "Option::is_none")]
108    pub new_handle: Option<String>,
109    #[serde(default, skip_serializing_if = "Option::is_none")]
110    pub resumable: Option<bool>,
111    #[serde(alias = "last_consumed_client_message_index")]
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub last_consumed_client_message_index: Option<LiveInt64>,
114    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
115    pub rest: Rest,
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
119#[serde(rename_all = "camelCase")]
120#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
121#[derive(gproxy_protocol_macros::DeclaredFields)]
122#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
123pub struct BidiGenerateContentTranscription {
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub text: Option<String>,
126    #[serde(default, skip_serializing_if = "Option::is_none")]
127    pub finished: Option<bool>,
128    #[serde(alias = "language_code")]
129    #[serde(default, skip_serializing_if = "Option::is_none")]
130    pub language_code: Option<String>,
131    #[serde(alias = "speaker_label")]
132    #[serde(default, skip_serializing_if = "Option::is_none")]
133    pub speaker_label: Option<String>,
134    #[serde(default, skip_serializing_if = "Option::is_none")]
135    pub words: Option<Vec<WordInfo>>,
136    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
137    pub rest: Rest,
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
141#[serde(rename_all = "camelCase")]
142#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
143#[derive(gproxy_protocol_macros::DeclaredFields)]
144#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
145pub struct WordInfo {
146    #[serde(default, skip_serializing_if = "Option::is_none")]
147    pub word: Option<String>,
148    #[serde(alias = "start_offset")]
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    pub start_offset: Option<String>,
151    #[serde(alias = "end_offset")]
152    #[serde(default, skip_serializing_if = "Option::is_none")]
153    pub end_offset: Option<String>,
154    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
155    pub rest: Rest,
156}
157
158#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
159#[serde(rename_all = "camelCase")]
160#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
161#[derive(gproxy_protocol_macros::DeclaredFields)]
162#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
163pub struct LiveUsageMetadata {
164    #[serde(alias = "prompt_token_count")]
165    #[serde(default, skip_serializing_if = "Option::is_none")]
166    pub prompt_token_count: Option<i64>,
167    #[serde(alias = "cached_content_token_count")]
168    #[serde(default, skip_serializing_if = "Option::is_none")]
169    pub cached_content_token_count: Option<i64>,
170    #[serde(alias = "response_token_count")]
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub response_token_count: Option<i64>,
173    #[serde(alias = "tool_use_prompt_token_count")]
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub tool_use_prompt_token_count: Option<i64>,
176    #[serde(alias = "thoughts_token_count")]
177    #[serde(default, skip_serializing_if = "Option::is_none")]
178    pub thoughts_token_count: Option<i64>,
179    #[serde(alias = "total_token_count")]
180    #[serde(default, skip_serializing_if = "Option::is_none")]
181    pub total_token_count: Option<i64>,
182    #[serde(alias = "prompt_tokens_details")]
183    #[serde(default, skip_serializing_if = "Option::is_none")]
184    pub prompt_tokens_details: Option<Vec<ModalityTokenCount>>,
185    #[serde(alias = "cache_tokens_details")]
186    #[serde(default, skip_serializing_if = "Option::is_none")]
187    pub cache_tokens_details: Option<Vec<ModalityTokenCount>>,
188    #[serde(alias = "response_tokens_details")]
189    #[serde(default, skip_serializing_if = "Option::is_none")]
190    pub response_tokens_details: Option<Vec<ModalityTokenCount>>,
191    #[serde(alias = "tool_use_prompt_tokens_details")]
192    #[serde(default, skip_serializing_if = "Option::is_none")]
193    pub tool_use_prompt_tokens_details: Option<Vec<ModalityTokenCount>>,
194    #[serde(alias = "service_tier")]
195    #[serde(default, skip_serializing_if = "Option::is_none")]
196    pub service_tier: Option<ServiceTier>,
197    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
198    pub rest: Rest,
199}
200
201#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
202#[serde(rename_all = "camelCase")]
203#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
204#[derive(gproxy_protocol_macros::DeclaredFields)]
205#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
206pub struct VoiceActivityDetectionSignal {
207    #[serde(alias = "vad_signal_type")]
208    #[serde(default, skip_serializing_if = "Option::is_none")]
209    pub vad_signal_type: Option<VadSignalType>,
210    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
211    pub rest: Rest,
212}
213
214#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
215#[serde(rename_all = "camelCase")]
216#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
217#[derive(gproxy_protocol_macros::DeclaredFields)]
218#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
219pub struct VoiceActivity {
220    #[serde(rename = "type")]
221    #[serde(default, skip_serializing_if = "Option::is_none")]
222    pub type_: Option<VoiceActivityType>,
223    #[serde(alias = "audio_offset")]
224    #[serde(default, skip_serializing_if = "Option::is_none")]
225    pub audio_offset: Option<String>,
226    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
227    pub rest: Rest,
228}
229
230#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
231#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
232#[derive(gproxy_protocol_macros::DeclaredFields)]
233#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
234pub enum TurnCompleteReason {
235    #[serde(rename = "TURN_COMPLETE_REASON_UNSPECIFIED")]
236    TurnCompleteReasonUnspecified,
237    #[serde(rename = "MALFORMED_FUNCTION_CALL")]
238    MalformedFunctionCall,
239    #[serde(rename = "RESPONSE_REJECTED")]
240    ResponseRejected,
241    #[serde(rename = "NEED_MORE_INPUT")]
242    NeedMoreInput,
243    #[serde(rename = "PROHIBITED_INPUT_CONTENT")]
244    ProhibitedInputContent,
245    #[serde(rename = "IMAGE_PROHIBITED_INPUT_CONTENT")]
246    ImageProhibitedInputContent,
247    #[serde(rename = "INPUT_TEXT_CONTAIN_PROMINENT_PERSON_PROHIBITED")]
248    InputTextContainProminentPersonProhibited,
249    #[serde(rename = "INPUT_IMAGE_CELEBRITY")]
250    InputImageCelebrity,
251    #[serde(rename = "INPUT_IMAGE_PHOTO_REALISTIC_CHILD_PROHIBITED")]
252    InputImagePhotoRealisticChildProhibited,
253    #[serde(rename = "INPUT_TEXT_NCII_PROHIBITED")]
254    InputTextNciiProhibited,
255    #[serde(rename = "INPUT_OTHER")]
256    InputOther,
257    #[serde(rename = "INPUT_IP_PROHIBITED")]
258    InputIpProhibited,
259    #[serde(rename = "BLOCKLIST")]
260    Blocklist,
261    #[serde(rename = "UNSAFE_PROMPT_FOR_IMAGE_GENERATION")]
262    UnsafePromptForImageGeneration,
263    #[serde(rename = "GENERATED_IMAGE_SAFETY")]
264    GeneratedImageSafety,
265    #[serde(rename = "GENERATED_CONTENT_SAFETY")]
266    GeneratedContentSafety,
267    #[serde(rename = "GENERATED_AUDIO_SAFETY")]
268    GeneratedAudioSafety,
269    #[serde(rename = "GENERATED_VIDEO_SAFETY")]
270    GeneratedVideoSafety,
271    #[serde(rename = "GENERATED_CONTENT_PROHIBITED")]
272    GeneratedContentProhibited,
273    #[serde(rename = "GENERATED_CONTENT_BLOCKLIST")]
274    GeneratedContentBlocklist,
275    #[serde(rename = "GENERATED_IMAGE_PROHIBITED")]
276    GeneratedImageProhibited,
277    #[serde(rename = "GENERATED_IMAGE_CELEBRITY")]
278    GeneratedImageCelebrity,
279    #[serde(rename = "GENERATED_IMAGE_PROMINENT_PEOPLE_DETECTED_BY_REWRITER")]
280    GeneratedImageProminentPeopleDetectedByRewriter,
281    #[serde(rename = "GENERATED_IMAGE_IDENTIFIABLE_PEOPLE")]
282    GeneratedImageIdentifiablePeople,
283    #[serde(rename = "GENERATED_IMAGE_MINORS")]
284    GeneratedImageMinors,
285    #[serde(rename = "OUTPUT_IMAGE_IP_PROHIBITED")]
286    OutputImageIpProhibited,
287    #[serde(rename = "GENERATED_OTHER")]
288    GeneratedOther,
289    #[serde(rename = "MAX_REGENERATION_REACHED")]
290    MaxRegenerationReached,
291}
292
293#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
294#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
295#[derive(gproxy_protocol_macros::DeclaredFields)]
296#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
297pub enum InteractionStatus {
298    #[serde(rename = "INTERACTION_STATUS_UNSPECIFIED")]
299    InteractionStatusUnspecified,
300    #[serde(rename = "IN_PROGRESS")]
301    InProgress,
302    #[serde(rename = "REQUIRES_ACTION")]
303    RequiresAction,
304    #[serde(rename = "IDLE")]
305    Idle,
306}
307
308#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
309#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
310#[derive(gproxy_protocol_macros::DeclaredFields)]
311#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
312pub enum VadSignalType {
313    #[serde(rename = "VAD_SIGNAL_TYPE_UNSPECIFIED")]
314    VadSignalTypeUnspecified,
315    #[serde(rename = "VAD_SIGNAL_TYPE_SOS")]
316    VadSignalTypeSos,
317    #[serde(rename = "VAD_SIGNAL_TYPE_EOS")]
318    VadSignalTypeEos,
319}
320
321#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
322#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
323#[derive(gproxy_protocol_macros::DeclaredFields)]
324#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
325pub enum VoiceActivityType {
326    #[serde(rename = "TYPE_UNSPECIFIED")]
327    TypeUnspecified,
328    #[serde(rename = "ACTIVITY_START")]
329    ActivityStart,
330    #[serde(rename = "ACTIVITY_END")]
331    ActivityEnd,
332}
333
334/// ai.google.dev/api/live exposes deprecated speechState but provides no value
335/// table; current public proto/SDK omit its declaration. Preserve the named enum
336/// representation without inventing constants. ProtoJSON enums can be names/ints.
337#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
338#[serde(untagged)]
339#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
340#[derive(gproxy_protocol_macros::DeclaredFields)]
341#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
342pub enum SpeechState {
343    Name(String),
344    Number(i32),
345}