1use super::wire::present_nullable;
6use super::{
7 RealtimeMcpApprovalRequest, RealtimeMcpApprovalResponse, RealtimeMcpListTools,
8 RealtimeMcpToolCall,
9};
10use crate::Rest;
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
16#[serde(untagged)]
17#[derive(gproxy_protocol_macros::DeclaredFields)]
18pub enum ConversationItem {
19 RealtimeConversationItemSystemMessage(RealtimeConversationItemSystemMessage),
20 RealtimeConversationItemUserMessage(RealtimeConversationItemUserMessage),
21 RealtimeConversationItemAssistantMessage(RealtimeConversationItemAssistantMessage),
22 RealtimeConversationItemFunctionCall(RealtimeConversationItemFunctionCall),
23 RealtimeConversationItemFunctionCallOutput(RealtimeConversationItemFunctionCallOutput),
24 RealtimeMcpApprovalResponse(RealtimeMcpApprovalResponse),
25 RealtimeMcpListTools(RealtimeMcpListTools),
26 RealtimeMcpToolCall(RealtimeMcpToolCall),
27 RealtimeMcpApprovalRequest(RealtimeMcpApprovalRequest),
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
32#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
33#[derive(gproxy_protocol_macros::DeclaredFields)]
34pub struct RealtimeConversationItemSystemMessage {
35 pub content: Vec<RealtimeConversationItemSystemMessageContent>,
36 pub role: RealtimeConversationItemSystemMessageRole,
37 #[serde(rename = "type")]
38 pub type_: RealtimeConversationItemSystemMessageType,
39 #[serde(
40 default,
41 deserialize_with = "present_nullable",
42 skip_serializing_if = "Option::is_none"
43 )]
44 pub id: Option<Option<String>>,
45 #[serde(
46 default,
47 deserialize_with = "present_nullable",
48 skip_serializing_if = "Option::is_none"
49 )]
50 pub object: Option<Option<RealtimeConversationItemSystemMessageObject>>,
51 #[serde(
52 default,
53 deserialize_with = "present_nullable",
54 skip_serializing_if = "Option::is_none"
55 )]
56 pub status: Option<Option<RealtimeConversationItemSystemMessageStatus>>,
57 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
58 pub rest: Rest,
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
63#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
64#[derive(gproxy_protocol_macros::DeclaredFields)]
65pub struct RealtimeConversationItemUserMessage {
66 pub content: Vec<RealtimeConversationItemUserMessageContent>,
67 pub role: RealtimeConversationItemUserMessageRole,
68 #[serde(rename = "type")]
69 pub type_: RealtimeConversationItemUserMessageType,
70 #[serde(
71 default,
72 deserialize_with = "present_nullable",
73 skip_serializing_if = "Option::is_none"
74 )]
75 pub id: Option<Option<String>>,
76 #[serde(
77 default,
78 deserialize_with = "present_nullable",
79 skip_serializing_if = "Option::is_none"
80 )]
81 pub object: Option<Option<RealtimeConversationItemUserMessageObject>>,
82 #[serde(
83 default,
84 deserialize_with = "present_nullable",
85 skip_serializing_if = "Option::is_none"
86 )]
87 pub status: Option<Option<RealtimeConversationItemUserMessageStatus>>,
88 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
89 pub rest: Rest,
90}
91
92#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
94#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
95#[derive(gproxy_protocol_macros::DeclaredFields)]
96pub struct RealtimeConversationItemAssistantMessage {
97 pub content: Vec<RealtimeConversationItemAssistantMessageContent>,
98 pub role: RealtimeConversationItemAssistantMessageRole,
99 #[serde(rename = "type")]
100 pub type_: RealtimeConversationItemAssistantMessageType,
101 #[serde(
102 default,
103 deserialize_with = "present_nullable",
104 skip_serializing_if = "Option::is_none"
105 )]
106 pub id: Option<Option<String>>,
107 #[serde(
108 default,
109 deserialize_with = "present_nullable",
110 skip_serializing_if = "Option::is_none"
111 )]
112 pub object: Option<Option<RealtimeConversationItemAssistantMessageObject>>,
113 #[serde(
114 default,
115 deserialize_with = "present_nullable",
116 skip_serializing_if = "Option::is_none"
117 )]
118 pub status: Option<Option<RealtimeConversationItemAssistantMessageStatus>>,
119 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
120 pub rest: Rest,
121}
122
123#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
125#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
126#[derive(gproxy_protocol_macros::DeclaredFields)]
127pub struct RealtimeConversationItemFunctionCall {
128 pub arguments: String,
129 pub name: String,
130 #[serde(rename = "type")]
131 pub type_: RealtimeConversationItemFunctionCallType,
132 #[serde(
133 default,
134 deserialize_with = "present_nullable",
135 skip_serializing_if = "Option::is_none"
136 )]
137 pub id: Option<Option<String>>,
138 #[serde(
139 default,
140 deserialize_with = "present_nullable",
141 skip_serializing_if = "Option::is_none"
142 )]
143 pub call_id: Option<Option<String>>,
144 #[serde(
145 default,
146 deserialize_with = "present_nullable",
147 skip_serializing_if = "Option::is_none"
148 )]
149 pub object: Option<Option<RealtimeConversationItemFunctionCallObject>>,
150 #[serde(
151 default,
152 deserialize_with = "present_nullable",
153 skip_serializing_if = "Option::is_none"
154 )]
155 pub status: Option<Option<RealtimeConversationItemFunctionCallStatus>>,
156 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
157 pub rest: Rest,
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
162#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
163#[derive(gproxy_protocol_macros::DeclaredFields)]
164pub struct RealtimeConversationItemFunctionCallOutput {
165 pub call_id: String,
166 pub output: String,
167 #[serde(rename = "type")]
168 pub type_: RealtimeConversationItemFunctionCallOutputType,
169 #[serde(
170 default,
171 deserialize_with = "present_nullable",
172 skip_serializing_if = "Option::is_none"
173 )]
174 pub id: Option<Option<String>>,
175 #[serde(
176 default,
177 deserialize_with = "present_nullable",
178 skip_serializing_if = "Option::is_none"
179 )]
180 pub object: Option<Option<RealtimeConversationItemFunctionCallOutputObject>>,
181 #[serde(
182 default,
183 deserialize_with = "present_nullable",
184 skip_serializing_if = "Option::is_none"
185 )]
186 pub status: Option<Option<RealtimeConversationItemFunctionCallOutputStatus>>,
187 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
188 pub rest: Rest,
189}
190
191#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
193#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
194#[derive(gproxy_protocol_macros::DeclaredFields)]
195pub struct RealtimeConversationItemSystemMessageContent {
196 #[serde(
197 default,
198 deserialize_with = "present_nullable",
199 skip_serializing_if = "Option::is_none"
200 )]
201 pub text: Option<Option<String>>,
202 #[serde(rename = "type")]
203 #[serde(
204 default,
205 deserialize_with = "present_nullable",
206 skip_serializing_if = "Option::is_none"
207 )]
208 pub type_: Option<Option<RealtimeConversationItemSystemMessageContentType>>,
209 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
210 pub rest: Rest,
211}
212
213#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
215#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
216#[derive(gproxy_protocol_macros::DeclaredFields)]
217pub struct RealtimeConversationItemUserMessageContent {
218 #[serde(
219 default,
220 deserialize_with = "present_nullable",
221 skip_serializing_if = "Option::is_none"
222 )]
223 pub audio: Option<Option<String>>,
224 #[serde(
225 default,
226 deserialize_with = "present_nullable",
227 skip_serializing_if = "Option::is_none"
228 )]
229 pub detail: Option<Option<RealtimeConversationItemUserMessageContentDetail>>,
230 #[serde(
231 default,
232 deserialize_with = "present_nullable",
233 skip_serializing_if = "Option::is_none"
234 )]
235 pub image_url: Option<Option<String>>,
236 #[serde(
237 default,
238 deserialize_with = "present_nullable",
239 skip_serializing_if = "Option::is_none"
240 )]
241 pub text: Option<Option<String>>,
242 #[serde(
243 default,
244 deserialize_with = "present_nullable",
245 skip_serializing_if = "Option::is_none"
246 )]
247 pub transcript: Option<Option<String>>,
248 #[serde(rename = "type")]
249 #[serde(
250 default,
251 deserialize_with = "present_nullable",
252 skip_serializing_if = "Option::is_none"
253 )]
254 pub type_: Option<Option<RealtimeConversationItemUserMessageContentType>>,
255 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
256 pub rest: Rest,
257}
258
259#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
261#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
262#[derive(gproxy_protocol_macros::DeclaredFields)]
263pub struct RealtimeConversationItemAssistantMessageContent {
264 #[serde(
265 default,
266 deserialize_with = "present_nullable",
267 skip_serializing_if = "Option::is_none"
268 )]
269 pub audio: Option<Option<String>>,
270 #[serde(
271 default,
272 deserialize_with = "present_nullable",
273 skip_serializing_if = "Option::is_none"
274 )]
275 pub text: Option<Option<String>>,
276 #[serde(
277 default,
278 deserialize_with = "present_nullable",
279 skip_serializing_if = "Option::is_none"
280 )]
281 pub transcript: Option<Option<String>>,
282 #[serde(rename = "type")]
283 #[serde(
284 default,
285 deserialize_with = "present_nullable",
286 skip_serializing_if = "Option::is_none"
287 )]
288 pub type_: Option<Option<RealtimeConversationItemAssistantMessageContentType>>,
289 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
290 pub rest: Rest,
291}
292
293#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
294#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
295#[derive(gproxy_protocol_macros::DeclaredFields)]
296pub enum RealtimeConversationItemSystemMessageRole {
297 #[serde(rename = "system")]
298 System,
299}
300
301#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
302#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
303#[derive(gproxy_protocol_macros::DeclaredFields)]
304pub enum RealtimeConversationItemSystemMessageType {
305 #[serde(rename = "message")]
306 Message,
307}
308
309#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
310#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
311#[derive(gproxy_protocol_macros::DeclaredFields)]
312pub enum RealtimeConversationItemSystemMessageObject {
313 #[serde(rename = "realtime.item")]
314 RealtimeItem,
315}
316
317#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
318#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
319#[derive(gproxy_protocol_macros::DeclaredFields)]
320pub enum RealtimeConversationItemSystemMessageStatus {
321 #[serde(rename = "completed")]
322 Completed,
323 #[serde(rename = "incomplete")]
324 Incomplete,
325 #[serde(rename = "in_progress")]
326 InProgress,
327}
328
329#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
330#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
331#[derive(gproxy_protocol_macros::DeclaredFields)]
332pub enum RealtimeConversationItemUserMessageRole {
333 #[serde(rename = "user")]
334 User,
335}
336
337#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
338#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
339#[derive(gproxy_protocol_macros::DeclaredFields)]
340pub enum RealtimeConversationItemUserMessageType {
341 #[serde(rename = "message")]
342 Message,
343}
344
345#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
346#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
347#[derive(gproxy_protocol_macros::DeclaredFields)]
348pub enum RealtimeConversationItemUserMessageObject {
349 #[serde(rename = "realtime.item")]
350 RealtimeItem,
351}
352
353#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
354#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
355#[derive(gproxy_protocol_macros::DeclaredFields)]
356pub enum RealtimeConversationItemUserMessageStatus {
357 #[serde(rename = "completed")]
358 Completed,
359 #[serde(rename = "incomplete")]
360 Incomplete,
361 #[serde(rename = "in_progress")]
362 InProgress,
363}
364
365#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
366#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
367#[derive(gproxy_protocol_macros::DeclaredFields)]
368pub enum RealtimeConversationItemAssistantMessageRole {
369 #[serde(rename = "assistant")]
370 Assistant,
371}
372
373#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
374#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
375#[derive(gproxy_protocol_macros::DeclaredFields)]
376pub enum RealtimeConversationItemAssistantMessageType {
377 #[serde(rename = "message")]
378 Message,
379}
380
381#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
382#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
383#[derive(gproxy_protocol_macros::DeclaredFields)]
384pub enum RealtimeConversationItemAssistantMessageObject {
385 #[serde(rename = "realtime.item")]
386 RealtimeItem,
387}
388
389#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
390#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
391#[derive(gproxy_protocol_macros::DeclaredFields)]
392pub enum RealtimeConversationItemAssistantMessageStatus {
393 #[serde(rename = "completed")]
394 Completed,
395 #[serde(rename = "incomplete")]
396 Incomplete,
397 #[serde(rename = "in_progress")]
398 InProgress,
399}
400
401#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
402#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
403#[derive(gproxy_protocol_macros::DeclaredFields)]
404pub enum RealtimeConversationItemFunctionCallType {
405 #[serde(rename = "function_call")]
406 FunctionCall,
407}
408
409#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
410#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
411#[derive(gproxy_protocol_macros::DeclaredFields)]
412pub enum RealtimeConversationItemFunctionCallObject {
413 #[serde(rename = "realtime.item")]
414 RealtimeItem,
415}
416
417#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
418#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
419#[derive(gproxy_protocol_macros::DeclaredFields)]
420pub enum RealtimeConversationItemFunctionCallStatus {
421 #[serde(rename = "completed")]
422 Completed,
423 #[serde(rename = "incomplete")]
424 Incomplete,
425 #[serde(rename = "in_progress")]
426 InProgress,
427}
428
429#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
430#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
431#[derive(gproxy_protocol_macros::DeclaredFields)]
432pub enum RealtimeConversationItemFunctionCallOutputType {
433 #[serde(rename = "function_call_output")]
434 FunctionCallOutput,
435}
436
437#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
438#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
439#[derive(gproxy_protocol_macros::DeclaredFields)]
440pub enum RealtimeConversationItemFunctionCallOutputObject {
441 #[serde(rename = "realtime.item")]
442 RealtimeItem,
443}
444
445#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
446#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
447#[derive(gproxy_protocol_macros::DeclaredFields)]
448pub enum RealtimeConversationItemFunctionCallOutputStatus {
449 #[serde(rename = "completed")]
450 Completed,
451 #[serde(rename = "incomplete")]
452 Incomplete,
453 #[serde(rename = "in_progress")]
454 InProgress,
455}
456
457#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
458#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
459#[derive(gproxy_protocol_macros::DeclaredFields)]
460pub enum RealtimeConversationItemSystemMessageContentType {
461 #[serde(rename = "input_text")]
462 InputText,
463}
464
465#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
466#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
467#[derive(gproxy_protocol_macros::DeclaredFields)]
468pub enum RealtimeConversationItemUserMessageContentDetail {
469 #[serde(rename = "auto")]
470 Auto,
471 #[serde(rename = "low")]
472 Low,
473 #[serde(rename = "high")]
474 High,
475}
476
477#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
478#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
479#[derive(gproxy_protocol_macros::DeclaredFields)]
480pub enum RealtimeConversationItemUserMessageContentType {
481 #[serde(rename = "input_text")]
482 InputText,
483 #[serde(rename = "input_audio")]
484 InputAudio,
485 #[serde(rename = "input_image")]
486 InputImage,
487}
488
489#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
490#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
491#[derive(gproxy_protocol_macros::DeclaredFields)]
492pub enum RealtimeConversationItemAssistantMessageContentType {
493 #[serde(rename = "output_text")]
494 OutputText,
495 #[serde(rename = "output_audio")]
496 OutputAudio,
497}