openai_api_rs/realtime/
client_event.rs1use serde::{Deserialize, Serialize};
2use tokio_tungstenite::tungstenite::Message;
3
4use crate::realtime::types::{Item, Session};
5
6#[derive(Debug, Serialize, Deserialize, Clone, Default)]
7pub struct SessionUpdate {
8 #[serde(skip_serializing_if = "Option::is_none")]
9 pub event_id: Option<String>,
10 pub session: Session,
11}
12
13#[derive(Debug, Serialize, Deserialize, Clone, Default)]
14pub struct InputAudioBufferAppend {
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub event_id: Option<String>,
17 pub audio: String,
18}
19
20#[derive(Debug, Serialize, Deserialize, Clone, Default)]
21pub struct InputAudioBufferCommit {
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub event_id: Option<String>,
24}
25
26#[derive(Debug, Serialize, Deserialize, Clone, Default)]
27pub struct InputAudioBufferClear {
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub event_id: Option<String>,
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone, Default)]
33pub struct ConversationItemCreate {
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub event_id: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub previous_item_id: Option<String>,
38 pub item: Item,
39}
40
41#[derive(Debug, Serialize, Deserialize, Clone, Default)]
42pub struct ConversationItemTruncate {
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub event_id: Option<String>,
45 pub item_id: String,
46 pub content_index: u32,
47 pub audio_end_ms: u32,
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, Default)]
51pub struct ConversationItemDelete {
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub event_id: Option<String>,
54 pub item_id: String,
55}
56
57#[derive(Debug, Serialize, Deserialize, Clone, Default)]
58pub struct ResponseCreate {
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub event_id: Option<String>,
61 pub response: Option<Session>,
62}
63
64#[derive(Debug, Serialize, Deserialize, Clone, Default)]
65pub struct ResponseCancel {
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub event_id: Option<String>,
68}
69
70#[derive(Debug, Serialize, Deserialize)]
71#[serde(tag = "type")]
72pub enum ClientEvent {
73 #[serde(rename = "session.update")]
74 SessionUpdate(SessionUpdate),
75 #[serde(rename = "input_audio_buffer.append")]
76 InputAudioBufferAppend(InputAudioBufferAppend),
77 #[serde(rename = "input_audio_buffer.commit")]
78 InputAudioBufferCommit(InputAudioBufferCommit),
79 #[serde(rename = "input_audio_buffer.clear")]
80 InputAudioBufferClear(InputAudioBufferClear),
81 #[serde(rename = "conversation.item.create")]
82 ConversationItemCreate(ConversationItemCreate),
83 #[serde(rename = "conversation.item.truncate")]
84 ConversationItemTruncate(ConversationItemTruncate),
85 #[serde(rename = "conversation.item.delete")]
86 ConversationItemDelete(ConversationItemDelete),
87 #[serde(rename = "response.create")]
88 ResponseCreate(ResponseCreate),
89 #[serde(rename = "response.cancel")]
90 ResponseCancel(ResponseCancel),
91}
92
93impl From<ClientEvent> for Message {
94 fn from(value: ClientEvent) -> Self {
95 Message::Text(String::from(&value))
96 }
97}
98
99impl From<&ClientEvent> for String {
100 fn from(value: &ClientEvent) -> Self {
101 serde_json::to_string(value).unwrap()
102 }
103}
104
105impl From<ConversationItemCreate> for Message {
106 fn from(value: ConversationItemCreate) -> Self {
107 Self::from(ClientEvent::ConversationItemCreate(value))
108 }
109}
110
111impl From<InputAudioBufferAppend> for Message {
112 fn from(value: InputAudioBufferAppend) -> Self {
113 Self::from(ClientEvent::InputAudioBufferAppend(value))
114 }
115}
116
117impl From<InputAudioBufferCommit> for Message {
118 fn from(value: InputAudioBufferCommit) -> Self {
119 Self::from(ClientEvent::InputAudioBufferCommit(value))
120 }
121}
122
123impl From<InputAudioBufferClear> for Message {
124 fn from(value: InputAudioBufferClear) -> Self {
125 Self::from(ClientEvent::InputAudioBufferClear(value))
126 }
127}
128
129impl From<SessionUpdate> for Message {
130 fn from(value: SessionUpdate) -> Self {
131 Self::from(ClientEvent::SessionUpdate(value))
132 }
133}
134
135impl From<ConversationItemTruncate> for Message {
136 fn from(value: ConversationItemTruncate) -> Self {
137 Self::from(ClientEvent::ConversationItemTruncate(value))
138 }
139}
140
141impl From<ConversationItemDelete> for Message {
142 fn from(value: ConversationItemDelete) -> Self {
143 Self::from(ClientEvent::ConversationItemDelete(value))
144 }
145}
146
147impl From<ResponseCreate> for Message {
148 fn from(value: ResponseCreate) -> Self {
149 Self::from(ClientEvent::ResponseCreate(value))
150 }
151}
152
153impl From<ResponseCancel> for Message {
154 fn from(value: ResponseCancel) -> Self {
155 Self::from(ClientEvent::ResponseCancel(value))
156 }
157}