1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::openai::common::Rest;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
7#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
8pub struct RealtimeAudio {
9 #[serde(skip_serializing_if = "Option::is_none")]
10 pub input: Option<RealtimeAudioInput>,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub output: Option<RealtimeAudioOutput>,
13 #[serde(default, flatten)]
14 pub rest: Rest,
15}
16
17pub type RealtimeAudioConfig = RealtimeAudio;
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
20#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
21pub struct RealtimeAudioInput {
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub format: Option<RealtimeAudioFormat>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub noise_reduction: Option<RealtimeNoiseReduction>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub transcription: Option<RealtimeTranscription>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub turn_detection: Option<RealtimeTurnDetectionSetting>,
30 #[serde(default, flatten)]
31 pub rest: Rest,
32}
33
34pub type RealtimeAudioInputConfig = RealtimeAudioInput;
35
36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
37#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
38pub struct RealtimeAudioOutput {
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub format: Option<RealtimeAudioFormat>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub voice: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub speed: Option<f64>,
45 #[serde(default, flatten)]
46 pub rest: Rest,
47}
48
49pub type RealtimeAudioOutputConfig = RealtimeAudioOutput;
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52#[serde(untagged)]
53#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
54pub enum RealtimeAudioFormat {
55 Pcm(RealtimePcmFormat),
56 Pcmu(RealtimePcmuFormat),
57 Pcma(RealtimePcmaFormat),
58 Raw(Value),
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
62#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
63pub struct RealtimePcmFormat {
64 #[serde(rename = "type")]
65 pub type_: RealtimePcmFormatType,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub rate: Option<u32>,
68 #[serde(default, flatten)]
69 pub rest: Rest,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
74pub enum RealtimePcmFormatType {
75 #[serde(rename = "audio/pcm")]
76 Pcm,
77}
78
79#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
80#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
81pub struct RealtimePcmuFormat {
82 #[serde(rename = "type")]
83 pub type_: RealtimePcmuFormatType,
84 #[serde(default, flatten)]
85 pub rest: Rest,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
89#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
90pub enum RealtimePcmuFormatType {
91 #[serde(rename = "audio/pcmu")]
92 Pcmu,
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97pub struct RealtimePcmaFormat {
98 #[serde(rename = "type")]
99 pub type_: RealtimePcmaFormatType,
100 #[serde(default, flatten)]
101 pub rest: Rest,
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
105#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
106pub enum RealtimePcmaFormatType {
107 #[serde(rename = "audio/pcma")]
108 Pcma,
109}
110
111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
112#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
113pub struct RealtimeNoiseReduction {
114 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
115 pub type_: Option<RealtimeNoiseReductionType>,
116 #[serde(default, flatten)]
117 pub rest: Rest,
118}
119
120pub type NoiseReduction = RealtimeNoiseReduction;
121
122#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
123#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
124pub struct RealtimeTranscription {
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub model: Option<String>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub language: Option<String>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub prompt: Option<String>,
131 #[serde(default, flatten)]
132 pub rest: Rest,
133}
134
135pub type RealtimeTranscriptionConfig = RealtimeTranscription;
136
137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
138#[serde(untagged)]
139#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
140pub enum RealtimeTurnDetectionSetting {
141 Disabled(()),
142 Vad(RealtimeTurnDetection),
143 Raw(Value),
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
147#[serde(untagged)]
148#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
149pub enum RealtimeTurnDetection {
150 Server(RealtimeServerVad),
151 Semantic(RealtimeSemanticVad),
152 Raw(Value),
153}
154
155#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
156#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
157pub struct RealtimeServerVad {
158 #[serde(rename = "type")]
159 pub type_: RealtimeServerVadType,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub threshold: Option<f64>,
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub prefix_padding_ms: Option<u32>,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub silence_duration_ms: Option<u32>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub idle_timeout_ms: Option<u32>,
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub create_response: Option<bool>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub interrupt_response: Option<bool>,
172 #[serde(default, flatten)]
173 pub rest: Rest,
174}
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
177#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
178pub enum RealtimeServerVadType {
179 #[serde(rename = "server_vad")]
180 ServerVad,
181}
182
183#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
184#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
185pub struct RealtimeSemanticVad {
186 #[serde(rename = "type")]
187 pub type_: RealtimeSemanticVadType,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub eagerness: Option<RealtimeVadEagerness>,
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub create_response: Option<bool>,
192 #[serde(skip_serializing_if = "Option::is_none")]
193 pub interrupt_response: Option<bool>,
194 #[serde(default, flatten)]
195 pub rest: Rest,
196}
197
198#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
199#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
200pub enum RealtimeSemanticVadType {
201 #[serde(rename = "semantic_vad")]
202 SemanticVad,
203}
204
205extensible_string!(RealtimeNoiseReductionType, KnownRealtimeNoiseReductionType {
206 NearField => "near_field", FarField => "far_field",
207});
208extensible_string!(RealtimeVadEagerness, KnownRealtimeVadEagerness {
209 Low => "low", Medium => "medium", High => "high", Auto => "auto",
210});