Skip to main content

gproxy_protocol/wire/openai/realtime/
transcription.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::RealtimeAudioFormats;
6use super::wire::present_nullable;
7use crate::Rest;
8use serde::{Deserialize, Serialize};
9
10/// Source: `openai/types/audio/transcription_language.py`, `TranscriptionLanguage`.
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
12#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
13#[derive(gproxy_protocol_macros::DeclaredFields)]
14pub struct TranscriptionLanguage {
15    pub code: String,
16    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
17    pub rest: Rest,
18}
19
20/// Source: `openai/types/realtime/log_prob_properties.py`, `LogProbProperties`.
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
22#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
23#[derive(gproxy_protocol_macros::DeclaredFields)]
24pub struct LogProbProperties {
25    pub token: String,
26    pub bytes: Vec<i64>,
27    pub logprob: serde_json::Number,
28    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
29    pub rest: Rest,
30}
31
32/// Source: `openai/types/realtime/realtime_transcription_session_create_request.py`, `RealtimeTranscriptionSessionCreateRequest`.
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
34#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
35#[derive(gproxy_protocol_macros::DeclaredFields)]
36pub struct RealtimeTranscriptionSessionCreateRequest {
37    #[serde(rename = "type")]
38    pub type_: RealtimeTranscriptionSessionCreateRequestType,
39    #[serde(
40        default,
41        deserialize_with = "present_nullable",
42        skip_serializing_if = "Option::is_none"
43    )]
44    pub audio: Option<Option<RealtimeTranscriptionSessionAudio>>,
45    #[serde(
46        default,
47        deserialize_with = "present_nullable",
48        skip_serializing_if = "Option::is_none"
49    )]
50    pub include: Option<Option<Vec<RealtimeTranscriptionSessionCreateRequestIncludeItem>>>,
51    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
52    pub rest: Rest,
53}
54
55/// Source: `openai/types/realtime/audio_transcription.py`, `AudioTranscription`.
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
57#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
58#[derive(gproxy_protocol_macros::DeclaredFields)]
59pub struct AudioTranscription {
60    #[serde(
61        default,
62        deserialize_with = "present_nullable",
63        skip_serializing_if = "Option::is_none"
64    )]
65    pub delay: Option<Option<AudioTranscriptionDelay>>,
66    #[serde(
67        default,
68        deserialize_with = "present_nullable",
69        skip_serializing_if = "Option::is_none"
70    )]
71    pub keywords: Option<Option<Vec<String>>>,
72    #[serde(
73        default,
74        deserialize_with = "present_nullable",
75        skip_serializing_if = "Option::is_none"
76    )]
77    pub language: Option<Option<String>>,
78    #[serde(
79        default,
80        deserialize_with = "present_nullable",
81        skip_serializing_if = "Option::is_none"
82    )]
83    pub languages: Option<Option<Vec<String>>>,
84    #[serde(
85        default,
86        deserialize_with = "present_nullable",
87        skip_serializing_if = "Option::is_none"
88    )]
89    pub model: Option<Option<String>>,
90    #[serde(
91        default,
92        deserialize_with = "present_nullable",
93        skip_serializing_if = "Option::is_none"
94    )]
95    pub prompt: Option<Option<String>>,
96    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
97    pub rest: Rest,
98}
99
100/// Source: `openai/types/realtime/realtime_transcription_session_audio.py`, `RealtimeTranscriptionSessionAudio`.
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
102#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
103#[derive(gproxy_protocol_macros::DeclaredFields)]
104pub struct RealtimeTranscriptionSessionAudio {
105    #[serde(
106        default,
107        deserialize_with = "present_nullable",
108        skip_serializing_if = "Option::is_none"
109    )]
110    pub input: Option<Option<RealtimeTranscriptionSessionAudioInput>>,
111    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
112    pub rest: Rest,
113}
114
115/// Source: `openai/types/realtime/noise_reduction_type.py`, `NoiseReductionType`.
116#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
117#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
118#[derive(gproxy_protocol_macros::DeclaredFields)]
119pub enum NoiseReductionType {
120    #[serde(rename = "near_field")]
121    NearField,
122    #[serde(rename = "far_field")]
123    FarField,
124}
125
126/// Source: `openai/types/realtime/realtime_transcription_session_audio_input.py`, `RealtimeTranscriptionSessionAudioInput`.
127#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
128#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
129#[derive(gproxy_protocol_macros::DeclaredFields)]
130pub struct RealtimeTranscriptionSessionAudioInput {
131    #[serde(
132        default,
133        deserialize_with = "present_nullable",
134        skip_serializing_if = "Option::is_none"
135    )]
136    pub format: Option<Option<RealtimeAudioFormats>>,
137    #[serde(
138        default,
139        deserialize_with = "present_nullable",
140        skip_serializing_if = "Option::is_none"
141    )]
142    pub noise_reduction: Option<Option<RealtimeTranscriptionSessionAudioInputNoiseReduction>>,
143    #[serde(
144        default,
145        deserialize_with = "present_nullable",
146        skip_serializing_if = "Option::is_none"
147    )]
148    pub transcription: Option<Option<AudioTranscription>>,
149    #[serde(
150        default,
151        deserialize_with = "present_nullable",
152        skip_serializing_if = "Option::is_none"
153    )]
154    pub turn_detection: Option<Option<RealtimeTranscriptionSessionAudioInputTurnDetection>>,
155    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
156    pub rest: Rest,
157}
158
159/// Source: `openai/types/realtime/realtime_transcription_session_audio_input.py`, `NoiseReduction`.
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
161#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
162#[derive(gproxy_protocol_macros::DeclaredFields)]
163pub struct RealtimeTranscriptionSessionAudioInputNoiseReduction {
164    #[serde(rename = "type")]
165    #[serde(
166        default,
167        deserialize_with = "present_nullable",
168        skip_serializing_if = "Option::is_none"
169    )]
170    pub type_: Option<Option<NoiseReductionType>>,
171    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
172    pub rest: Rest,
173}
174
175/// Source: `openai/types/realtime/realtime_transcription_session_audio_input_turn_detection.py`, `RealtimeTranscriptionSessionAudioInputTurnDetection`.
176#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
177#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
178#[serde(untagged)]
179#[derive(gproxy_protocol_macros::DeclaredFields)]
180pub enum RealtimeTranscriptionSessionAudioInputTurnDetection {
181    RealtimeTranscriptionSessionAudioInputTurnDetectionServerVad(
182        RealtimeTranscriptionSessionAudioInputTurnDetectionServerVad,
183    ),
184    RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVad(
185        RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVad,
186    ),
187    Variant3(()),
188}
189
190/// Source: `openai/types/realtime/realtime_transcription_session_audio_input_turn_detection.py`, `ServerVad`.
191#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
192#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
193#[derive(gproxy_protocol_macros::DeclaredFields)]
194pub struct RealtimeTranscriptionSessionAudioInputTurnDetectionServerVad {
195    #[serde(rename = "type")]
196    pub type_: RealtimeTranscriptionSessionAudioInputTurnDetectionServerVadType,
197    #[serde(
198        default,
199        deserialize_with = "present_nullable",
200        skip_serializing_if = "Option::is_none"
201    )]
202    pub create_response: Option<Option<bool>>,
203    #[serde(
204        default,
205        deserialize_with = "present_nullable",
206        skip_serializing_if = "Option::is_none"
207    )]
208    pub idle_timeout_ms: Option<Option<i64>>,
209    #[serde(
210        default,
211        deserialize_with = "present_nullable",
212        skip_serializing_if = "Option::is_none"
213    )]
214    pub interrupt_response: Option<Option<bool>>,
215    #[serde(
216        default,
217        deserialize_with = "present_nullable",
218        skip_serializing_if = "Option::is_none"
219    )]
220    pub prefix_padding_ms: Option<Option<i64>>,
221    #[serde(
222        default,
223        deserialize_with = "present_nullable",
224        skip_serializing_if = "Option::is_none"
225    )]
226    pub silence_duration_ms: Option<Option<i64>>,
227    #[serde(
228        default,
229        deserialize_with = "present_nullable",
230        skip_serializing_if = "Option::is_none"
231    )]
232    pub threshold: Option<Option<serde_json::Number>>,
233    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
234    pub rest: Rest,
235}
236
237/// Source: `openai/types/realtime/realtime_transcription_session_audio_input_turn_detection.py`, `SemanticVad`.
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
239#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
240#[derive(gproxy_protocol_macros::DeclaredFields)]
241pub struct RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVad {
242    #[serde(rename = "type")]
243    pub type_: RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVadType,
244    #[serde(
245        default,
246        deserialize_with = "present_nullable",
247        skip_serializing_if = "Option::is_none"
248    )]
249    pub create_response: Option<Option<bool>>,
250    #[serde(
251        default,
252        deserialize_with = "present_nullable",
253        skip_serializing_if = "Option::is_none"
254    )]
255    pub eagerness:
256        Option<Option<RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVadEagerness>>,
257    #[serde(
258        default,
259        deserialize_with = "present_nullable",
260        skip_serializing_if = "Option::is_none"
261    )]
262    pub interrupt_response: Option<Option<bool>>,
263    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
264    pub rest: Rest,
265}
266
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
268#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
269#[derive(gproxy_protocol_macros::DeclaredFields)]
270pub enum RealtimeTranscriptionSessionCreateRequestType {
271    #[serde(rename = "transcription")]
272    Transcription,
273}
274
275#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
276#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
277#[derive(gproxy_protocol_macros::DeclaredFields)]
278pub enum RealtimeTranscriptionSessionCreateRequestIncludeItem {
279    #[serde(rename = "item.input_audio_transcription.logprobs")]
280    ItemInputAudioTranscriptionLogprobs,
281}
282
283#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
284#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
285#[derive(gproxy_protocol_macros::DeclaredFields)]
286pub enum AudioTranscriptionDelay {
287    #[serde(rename = "minimal")]
288    Minimal,
289    #[serde(rename = "low")]
290    Low,
291    #[serde(rename = "medium")]
292    Medium,
293    #[serde(rename = "high")]
294    High,
295    #[serde(rename = "xhigh")]
296    Xhigh,
297}
298
299#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
300#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
301#[derive(gproxy_protocol_macros::DeclaredFields)]
302pub enum RealtimeTranscriptionSessionAudioInputTurnDetectionServerVadType {
303    #[serde(rename = "server_vad")]
304    ServerVad,
305}
306
307#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
308#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
309#[derive(gproxy_protocol_macros::DeclaredFields)]
310pub enum RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVadType {
311    #[serde(rename = "semantic_vad")]
312    SemanticVad,
313}
314
315#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
316#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
317#[derive(gproxy_protocol_macros::DeclaredFields)]
318pub enum RealtimeTranscriptionSessionAudioInputTurnDetectionSemanticVadEagerness {
319    #[serde(rename = "low")]
320    Low,
321    #[serde(rename = "medium")]
322    Medium,
323    #[serde(rename = "high")]
324    High,
325    #[serde(rename = "auto")]
326    Auto,
327}