pub use async_openai::types::realtime::*;
pub trait EventType {
fn event_type(&self) -> &'static str;
}
impl EventType for RealtimeClientEvent {
fn event_type(&self) -> &'static str {
match self {
RealtimeClientEvent::SessionUpdate(_) => "session.update",
RealtimeClientEvent::InputAudioBufferAppend(_) => "input_audio_buffer.append",
RealtimeClientEvent::InputAudioBufferCommit(_) => "input_audio_buffer.commit",
RealtimeClientEvent::InputAudioBufferClear(_) => "input_audio_buffer.clear",
RealtimeClientEvent::ConversationItemCreate(_) => "conversation.item.create",
RealtimeClientEvent::ConversationItemRetrieve(_) => "conversation.item.retrieve",
RealtimeClientEvent::ConversationItemTruncate(_) => "conversation.item.truncate",
RealtimeClientEvent::ConversationItemDelete(_) => "conversation.item.delete",
RealtimeClientEvent::ResponseCreate(_) => "response.create",
RealtimeClientEvent::ResponseCancel(_) => "response.cancel",
RealtimeClientEvent::OutputAudioBufferClear(_) => "output_audio_buffer.clear",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn session_update_accepts_null_turn_detection() {
let event: RealtimeClientEvent = serde_json::from_value(serde_json::json!({
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"format": { "type": "audio/pcm", "rate": 24000 },
"transcription": { "model": "whisper-1" },
"turn_detection": null
}
}
}
}))
.expect("null turn_detection should be accepted");
let RealtimeClientEvent::SessionUpdate(update) = event else {
panic!("expected session.update");
};
let Session::RealtimeTranscriptionSession(session) = update.session else {
panic!("expected transcription session");
};
assert!(session.audio.input.turn_detection.is_none());
}
}