use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RealtimeAudioFormat {
pub mime_type: String,
pub sample_rate_hz: u32,
pub channels: u8,
}
impl RealtimeAudioFormat {
#[must_use]
pub fn pcm(sample_rate_hz: u32, channels: u8) -> Self {
Self {
mime_type: "audio/pcm".to_string(),
sample_rate_hz,
channels,
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum RealtimeTurningMode {
ProviderManaged,
ExplicitCommit,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum RealtimeInputKind {
Text,
Audio,
Video,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum RealtimeOutputKind {
Text,
Audio,
Video,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RealtimeCapabilities {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub input_kinds: Vec<RealtimeInputKind>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub output_kinds: Vec<RealtimeOutputKind>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub turning_modes: Vec<RealtimeTurningMode>,
pub interrupt_supported: bool,
pub transcript_supported: bool,
pub tool_lifecycle_events_supported: bool,
pub video_supported: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub audio_input_format: Option<RealtimeAudioFormat>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub audio_output_format: Option<RealtimeAudioFormat>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RealtimeTextChunk {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RealtimeAudioChunk {
pub mime_type: String,
pub sample_rate_hz: u32,
pub channels: u8,
pub data: String,
}
impl RealtimeAudioChunk {
#[must_use]
pub fn format(&self) -> RealtimeAudioFormat {
RealtimeAudioFormat {
mime_type: self.mime_type.clone(),
sample_rate_hz: self.sample_rate_hz,
channels: self.channels,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RealtimeVideoChunk {
pub mime_type: String,
pub data: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum RealtimeInputChunk {
TextChunk(RealtimeTextChunk),
AudioChunk(RealtimeAudioChunk),
VideoChunk(RealtimeVideoChunk),
}