openai_tools/realtime/events/
client.rs1use serde::Serialize;
4
5use crate::realtime::conversation::ConversationItem;
6use crate::realtime::session::{ResponseCreateConfig, SessionConfig};
7
8#[derive(Debug, Clone, Serialize)]
10#[serde(tag = "type")]
11pub enum ClientEvent {
12 #[serde(rename = "session.update")]
15 SessionUpdate {
16 #[serde(skip_serializing_if = "Option::is_none")]
18 event_id: Option<String>,
19 session: SessionConfig,
21 },
22
23 #[serde(rename = "input_audio_buffer.append")]
26 InputAudioBufferAppend {
27 #[serde(skip_serializing_if = "Option::is_none")]
29 event_id: Option<String>,
30 audio: String,
32 },
33
34 #[serde(rename = "input_audio_buffer.clear")]
36 InputAudioBufferClear {
37 #[serde(skip_serializing_if = "Option::is_none")]
39 event_id: Option<String>,
40 },
41
42 #[serde(rename = "input_audio_buffer.commit")]
44 InputAudioBufferCommit {
45 #[serde(skip_serializing_if = "Option::is_none")]
47 event_id: Option<String>,
48 },
49
50 #[serde(rename = "output_audio_buffer.clear")]
53 OutputAudioBufferClear {
54 #[serde(skip_serializing_if = "Option::is_none")]
56 event_id: Option<String>,
57 },
58
59 #[serde(rename = "conversation.item.create")]
62 ConversationItemCreate {
63 #[serde(skip_serializing_if = "Option::is_none")]
65 event_id: Option<String>,
66 #[serde(skip_serializing_if = "Option::is_none")]
68 previous_item_id: Option<String>,
69 item: ConversationItem,
71 },
72
73 #[serde(rename = "conversation.item.delete")]
75 ConversationItemDelete {
76 #[serde(skip_serializing_if = "Option::is_none")]
78 event_id: Option<String>,
79 item_id: String,
81 },
82
83 #[serde(rename = "conversation.item.retrieve")]
85 ConversationItemRetrieve {
86 #[serde(skip_serializing_if = "Option::is_none")]
88 event_id: Option<String>,
89 item_id: String,
91 },
92
93 #[serde(rename = "conversation.item.truncate")]
95 ConversationItemTruncate {
96 #[serde(skip_serializing_if = "Option::is_none")]
98 event_id: Option<String>,
99 item_id: String,
101 content_index: u32,
103 audio_end_ms: u32,
105 },
106
107 #[serde(rename = "response.create")]
110 ResponseCreate {
111 #[serde(skip_serializing_if = "Option::is_none")]
113 event_id: Option<String>,
114 #[serde(skip_serializing_if = "Option::is_none")]
116 response: Option<ResponseCreateConfig>,
117 },
118
119 #[serde(rename = "response.cancel")]
121 ResponseCancel {
122 #[serde(skip_serializing_if = "Option::is_none")]
124 event_id: Option<String>,
125 },
126}
127
128impl ClientEvent {
129 pub fn session_update(config: SessionConfig) -> Self {
131 Self::SessionUpdate { event_id: None, session: config }
132 }
133
134 pub fn append_audio(audio_base64: impl Into<String>) -> Self {
136 Self::InputAudioBufferAppend { event_id: None, audio: audio_base64.into() }
137 }
138
139 pub fn clear_audio() -> Self {
141 Self::InputAudioBufferClear { event_id: None }
142 }
143
144 pub fn commit_audio() -> Self {
146 Self::InputAudioBufferCommit { event_id: None }
147 }
148
149 pub fn create_item(item: ConversationItem) -> Self {
151 Self::ConversationItemCreate { event_id: None, previous_item_id: None, item }
152 }
153
154 pub fn create_item_after(item: ConversationItem, previous_item_id: impl Into<String>) -> Self {
156 Self::ConversationItemCreate { event_id: None, previous_item_id: Some(previous_item_id.into()), item }
157 }
158
159 pub fn delete_item(item_id: impl Into<String>) -> Self {
161 Self::ConversationItemDelete { event_id: None, item_id: item_id.into() }
162 }
163
164 pub fn create_response(config: Option<ResponseCreateConfig>) -> Self {
166 Self::ResponseCreate { event_id: None, response: config }
167 }
168
169 pub fn cancel_response() -> Self {
171 Self::ResponseCancel { event_id: None }
172 }
173
174 pub fn with_event_id(mut self, id: impl Into<String>) -> Self {
176 let id = Some(id.into());
177 match &mut self {
178 Self::SessionUpdate { event_id, .. } => *event_id = id,
179 Self::InputAudioBufferAppend { event_id, .. } => *event_id = id,
180 Self::InputAudioBufferClear { event_id } => *event_id = id,
181 Self::InputAudioBufferCommit { event_id } => *event_id = id,
182 Self::OutputAudioBufferClear { event_id } => *event_id = id,
183 Self::ConversationItemCreate { event_id, .. } => *event_id = id,
184 Self::ConversationItemDelete { event_id, .. } => *event_id = id,
185 Self::ConversationItemRetrieve { event_id, .. } => *event_id = id,
186 Self::ConversationItemTruncate { event_id, .. } => *event_id = id,
187 Self::ResponseCreate { event_id, .. } => *event_id = id,
188 Self::ResponseCancel { event_id } => *event_id = id,
189 }
190 self
191 }
192}