Skip to main content

gproxy_protocol/wire/gemini/live/
content.rs

1//! Live content extends the current shared Part with Developer API audio
2//! transcription and media processing fields, confirmed by _Part_to_mldev.
3use super::realtime::LiveBlob;
4use super::server::BidiGenerateContentTranscription;
5use crate::Rest;
6use crate::gemini::content::*;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
10#[serde(rename_all = "camelCase")]
11#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
12#[derive(gproxy_protocol_macros::DeclaredFields)]
13#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
14pub struct LiveContent {
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub parts: Option<Vec<LivePart>>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub role: Option<String>,
19    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
20    pub rest: Rest,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
24#[serde(rename_all = "camelCase")]
25#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
26#[derive(gproxy_protocol_macros::DeclaredFields)]
27#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
28pub struct LivePart {
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub thought: Option<bool>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    #[serde(alias = "thought_signature")]
33    pub thought_signature: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    #[serde(alias = "part_metadata")]
36    pub part_metadata: Option<Rest>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    #[serde(alias = "media_resolution")]
39    pub media_resolution: Option<MediaResolution>,
40    #[serde(alias = "speech_metadata", skip_serializing_if = "Option::is_none")]
41    pub speech_metadata: Option<crate::gemini::audio::SpeechMetadata>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub text: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    #[serde(alias = "inline_data")]
46    pub inline_data: Option<LiveBlob>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    #[serde(alias = "function_call")]
49    pub function_call: Option<FunctionCall>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    #[serde(alias = "function_response")]
52    pub function_response: Option<FunctionResponse>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    #[serde(alias = "file_data")]
55    pub file_data: Option<FileData>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    #[serde(alias = "executable_code")]
58    pub executable_code: Option<ExecutableCode>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    #[serde(alias = "code_execution_result")]
61    pub code_execution_result: Option<CodeExecutionResult>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    #[serde(alias = "tool_call")]
64    pub tool_call: Option<ToolCall>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    #[serde(alias = "tool_response")]
67    pub tool_response: Option<ToolResponse>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    #[serde(alias = "video_metadata")]
70    pub video_metadata: Option<VideoMetadata>,
71    #[serde(
72        alias = "audio_transcription",
73        default,
74        skip_serializing_if = "Option::is_none"
75    )]
76    pub audio_transcription: Option<BidiGenerateContentTranscription>,
77    #[serde(
78        alias = "media_processing",
79        default,
80        skip_serializing_if = "Option::is_none"
81    )]
82    pub media_processing: Option<LiveMediaProcessing>,
83    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
84    pub rest: Rest,
85}
86
87pub use crate::gemini::content::MediaProcessing as LiveMediaProcessing;