openai_api_rs/realtime/
client_event.rs

1use 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}