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)]
13pub struct LiveContent {
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub parts: Option<Vec<LivePart>>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub role: Option<String>,
18    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
19    pub rest: Rest,
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
23#[serde(rename_all = "camelCase")]
24#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
25#[derive(gproxy_protocol_macros::DeclaredFields)]
26pub struct LivePart {
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub thought: Option<bool>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    #[serde(alias = "thought_signature")]
31    pub thought_signature: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    #[serde(alias = "part_metadata")]
34    pub part_metadata: Option<Rest>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    #[serde(alias = "media_resolution")]
37    pub media_resolution: Option<MediaResolution>,
38    #[serde(alias = "speech_metadata", skip_serializing_if = "Option::is_none")]
39    pub speech_metadata: Option<crate::gemini::audio::SpeechMetadata>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub text: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    #[serde(alias = "inline_data")]
44    pub inline_data: Option<LiveBlob>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    #[serde(alias = "function_call")]
47    pub function_call: Option<FunctionCall>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    #[serde(alias = "function_response")]
50    pub function_response: Option<FunctionResponse>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    #[serde(alias = "file_data")]
53    pub file_data: Option<FileData>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    #[serde(alias = "executable_code")]
56    pub executable_code: Option<ExecutableCode>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    #[serde(alias = "code_execution_result")]
59    pub code_execution_result: Option<CodeExecutionResult>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    #[serde(alias = "tool_call")]
62    pub tool_call: Option<ToolCall>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    #[serde(alias = "tool_response")]
65    pub tool_response: Option<ToolResponse>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    #[serde(alias = "video_metadata")]
68    pub video_metadata: Option<VideoMetadata>,
69    #[serde(
70        alias = "audio_transcription",
71        default,
72        skip_serializing_if = "Option::is_none"
73    )]
74    pub audio_transcription: Option<BidiGenerateContentTranscription>,
75    #[serde(
76        alias = "media_processing",
77        default,
78        skip_serializing_if = "Option::is_none"
79    )]
80    pub media_processing: Option<LiveMediaProcessing>,
81    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
82    pub rest: Rest,
83}
84
85pub use crate::gemini::content::MediaProcessing as LiveMediaProcessing;