use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum RealTimeEvent {
#[serde(rename = "audio")]
Audio { data: Vec<u8>, format: AudioFormat },
#[serde(rename = "text")]
Text { content: String, is_final: bool },
#[serde(rename = "session_started")]
SessionStarted { session_id: String },
#[serde(rename = "session_ended")]
SessionEnded { reason: String },
#[serde(rename = "error")]
Error { code: u16, message: String },
#[serde(rename = "status")]
Status { state: SessionState },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AudioFormat {
#[serde(rename = "wav")]
Wav,
#[serde(rename = "mp3")]
Mp3,
#[serde(rename = "pcm")]
Pcm,
#[serde(rename = "opus")]
Opus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SessionState {
#[serde(rename = "connecting")]
Connecting,
#[serde(rename = "connected")]
Connected,
#[serde(rename = "listening")]
Listening,
#[serde(rename = "processing")]
Processing,
#[serde(rename = "speaking")]
Speaking,
#[serde(rename = "disconnected")]
Disconnected,
#[serde(rename = "error")]
Error,
}
#[derive(Debug, Clone, Serialize)]
pub struct SessionConfig {
pub audio_format: AudioFormat,
pub sample_rate: u32,
pub channels: u8,
pub enable_transcription: bool,
pub enable_vad: bool,
pub timeout_seconds: u32,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
audio_format: AudioFormat::Pcm,
sample_rate: 16000,
channels: 1,
enable_transcription: true,
enable_vad: true,
timeout_seconds: 300,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionStats {
pub duration_seconds: u64,
pub packets_sent: u64,
pub packets_received: u64,
pub bytes_sent: u64,
pub bytes_received: u64,
pub transcription_count: u64,
}