Skip to main content

gproxy_protocol/wire/openai/realtime/
items.rs

1//! Native Realtime wire DTOs. Source definitions are cited on each object.
2//! Verified with Realtime.md and openai-python snapshot
3//! e12b81d3bbf644ec7045e152d69bc4b68d69cd48 (2026-09-13).
4//! https://github.com/openai/openai-python/tree/e12b81d3bbf644ec7045e152d69bc4b68d69cd48/src/openai/types/realtime
5use super::wire::present_nullable;
6use super::{
7    RealtimeMcpApprovalRequest, RealtimeMcpApprovalResponse, RealtimeMcpListTools,
8    RealtimeMcpToolCall,
9};
10use crate::Rest;
11use serde::{Deserialize, Serialize};
12
13/// Source: `openai/types/realtime/conversation_item.py`, `ConversationItem`.
14#[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/// Source: `openai/types/realtime/realtime_conversation_item_system_message.py`, `RealtimeConversationItemSystemMessage`.
31#[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/// Source: `openai/types/realtime/realtime_conversation_item_user_message.py`, `RealtimeConversationItemUserMessage`.
62#[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/// Source: `openai/types/realtime/realtime_conversation_item_assistant_message.py`, `RealtimeConversationItemAssistantMessage`.
93#[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/// Source: `openai/types/realtime/realtime_conversation_item_function_call.py`, `RealtimeConversationItemFunctionCall`.
124#[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/// Source: `openai/types/realtime/realtime_conversation_item_function_call_output.py`, `RealtimeConversationItemFunctionCallOutput`.
161#[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/// Source: `openai/types/realtime/realtime_conversation_item_system_message.py`, `Content`.
192#[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/// Source: `openai/types/realtime/realtime_conversation_item_user_message.py`, `Content`.
214#[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/// Source: `openai/types/realtime/realtime_conversation_item_assistant_message.py`, `Content`.
260#[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}