use serde::Serialize;
use crate::realtime::conversation::ConversationItem;
use crate::realtime::session::{ResponseCreateConfig, SessionConfig};
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type")]
pub enum ClientEvent {
#[serde(rename = "session.update")]
SessionUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
session: SessionConfig,
},
#[serde(rename = "input_audio_buffer.append")]
InputAudioBufferAppend {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
audio: String,
},
#[serde(rename = "input_audio_buffer.clear")]
InputAudioBufferClear {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "input_audio_buffer.commit")]
InputAudioBufferCommit {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "output_audio_buffer.clear")]
OutputAudioBufferClear {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
#[serde(rename = "conversation.item.create")]
ConversationItemCreate {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
previous_item_id: Option<String>,
item: ConversationItem,
},
#[serde(rename = "conversation.item.delete")]
ConversationItemDelete {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
item_id: String,
},
#[serde(rename = "conversation.item.retrieve")]
ConversationItemRetrieve {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
item_id: String,
},
#[serde(rename = "conversation.item.truncate")]
ConversationItemTruncate {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
item_id: String,
content_index: u32,
audio_end_ms: u32,
},
#[serde(rename = "response.create")]
ResponseCreate {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
response: Option<ResponseCreateConfig>,
},
#[serde(rename = "response.cancel")]
ResponseCancel {
#[serde(skip_serializing_if = "Option::is_none")]
event_id: Option<String>,
},
}
impl ClientEvent {
pub fn session_update(config: SessionConfig) -> Self {
Self::SessionUpdate { event_id: None, session: config }
}
pub fn append_audio(audio_base64: impl Into<String>) -> Self {
Self::InputAudioBufferAppend { event_id: None, audio: audio_base64.into() }
}
pub fn clear_audio() -> Self {
Self::InputAudioBufferClear { event_id: None }
}
pub fn commit_audio() -> Self {
Self::InputAudioBufferCommit { event_id: None }
}
pub fn create_item(item: ConversationItem) -> Self {
Self::ConversationItemCreate { event_id: None, previous_item_id: None, item }
}
pub fn create_item_after(item: ConversationItem, previous_item_id: impl Into<String>) -> Self {
Self::ConversationItemCreate { event_id: None, previous_item_id: Some(previous_item_id.into()), item }
}
pub fn delete_item(item_id: impl Into<String>) -> Self {
Self::ConversationItemDelete { event_id: None, item_id: item_id.into() }
}
pub fn create_response(config: Option<ResponseCreateConfig>) -> Self {
Self::ResponseCreate { event_id: None, response: config }
}
pub fn cancel_response() -> Self {
Self::ResponseCancel { event_id: None }
}
pub fn with_event_id(mut self, id: impl Into<String>) -> Self {
let id = Some(id.into());
match &mut self {
Self::SessionUpdate { event_id, .. } => *event_id = id,
Self::InputAudioBufferAppend { event_id, .. } => *event_id = id,
Self::InputAudioBufferClear { event_id } => *event_id = id,
Self::InputAudioBufferCommit { event_id } => *event_id = id,
Self::OutputAudioBufferClear { event_id } => *event_id = id,
Self::ConversationItemCreate { event_id, .. } => *event_id = id,
Self::ConversationItemDelete { event_id, .. } => *event_id = id,
Self::ConversationItemRetrieve { event_id, .. } => *event_id = id,
Self::ConversationItemTruncate { event_id, .. } => *event_id = id,
Self::ResponseCreate { event_id, .. } => *event_id = id,
Self::ResponseCancel { event_id } => *event_id = id,
}
self
}
}