1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::openai::common::Rest;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7#[serde(untagged)]
8pub enum TranscriptionResponse {
9 Verbose(TranscriptionVerbose),
10 Diarized(TranscriptionDiarized),
11 Json(Transcription),
12 Text(String),
13 Raw(Value),
14}
15
16#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17#[serde(untagged)]
18pub enum TranslationResponse {
19 Verbose(TranslationVerbose),
20 Json(Translation),
21 Text(String),
22 Raw(Value),
23}
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
26#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
27pub struct Transcription {
28 pub text: String,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub languages: Option<Vec<TranscriptionLanguage>>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub logprobs: Option<Vec<TranscriptionLogprob>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub usage: Option<AudioUsage>,
35 #[serde(default, flatten)]
36 pub rest: Rest,
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
40#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
41pub struct TranscriptionVerbose {
42 pub duration: f64,
43 pub language: String,
44 pub text: String,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub task: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub segments: Option<Vec<TranscriptionSegment>>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub usage: Option<AudioDurationUsage>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub words: Option<Vec<TranscriptionWord>>,
53 #[serde(default, flatten)]
54 pub rest: Rest,
55}
56
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
58#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
59pub struct TranscriptionDiarized {
60 pub duration: f64,
61 pub segments: Vec<TranscriptionDiarizedSegment>,
62 pub task: String,
63 pub text: String,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub usage: Option<AudioUsage>,
66 #[serde(default, flatten)]
67 pub rest: Rest,
68}
69
70#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
71#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
72pub struct Translation {
73 pub text: String,
74 #[serde(default, flatten)]
75 pub rest: Rest,
76}
77
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
79#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
80pub struct TranslationVerbose {
81 pub duration: f64,
82 pub language: String,
83 pub text: String,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub segments: Option<Vec<TranscriptionSegment>>,
86 #[serde(default, flatten)]
87 pub rest: Rest,
88}
89
90#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
91#[serde(untagged)]
92pub enum AudioUsage {
93 Tokens(AudioTokenUsage),
94 Duration(AudioDurationUsage),
95 Raw(Value),
96}
97
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
99#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
100pub struct AudioTokenUsage {
101 pub input_tokens: u64,
102 pub output_tokens: u64,
103 pub total_tokens: u64,
104 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
105 pub type_: Option<AudioTokenUsageType>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub input_token_details: Option<AudioInputTokenDetails>,
108 #[serde(default, flatten)]
109 pub rest: Rest,
110}
111
112#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
113pub enum AudioTokenUsageType {
114 #[serde(rename = "tokens")]
115 Tokens,
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
119#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
120pub struct AudioDurationUsage {
121 pub seconds: f64,
122 #[serde(rename = "type")]
123 pub type_: AudioDurationUsageType,
124 #[serde(default, flatten)]
125 pub rest: Rest,
126}
127
128#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
129pub enum AudioDurationUsageType {
130 #[serde(rename = "duration")]
131 Duration,
132}
133
134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
135#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
136pub struct AudioInputTokenDetails {
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub audio_tokens: Option<u64>,
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub text_tokens: Option<u64>,
141 #[serde(default, flatten)]
142 pub rest: Rest,
143}
144
145#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
146#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
147pub struct TranscriptionLanguage {
148 pub code: String,
149 #[serde(default, flatten)]
150 pub rest: Rest,
151}
152
153#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
154#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
155pub struct TranscriptionLogprob {
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub token: Option<String>,
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub bytes: Option<Vec<u8>>,
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub logprob: Option<f64>,
162 #[serde(default, flatten)]
163 pub rest: Rest,
164}
165
166#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
167#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
168pub struct TranscriptionSegment {
169 pub id: u64,
170 pub avg_logprob: f64,
171 pub compression_ratio: f64,
172 pub end: f64,
173 pub no_speech_prob: f64,
174 pub seek: u64,
175 pub start: f64,
176 pub temperature: f64,
177 pub text: String,
178 pub tokens: Vec<u64>,
179 #[serde(default, flatten)]
180 pub rest: Rest,
181}
182
183#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
184#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
185pub struct TranscriptionWord {
186 pub end: f64,
187 pub start: f64,
188 pub word: String,
189 #[serde(default, flatten)]
190 pub rest: Rest,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
194#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
195pub struct TranscriptionDiarizedSegment {
196 pub id: String,
197 pub end: f64,
198 pub speaker: String,
199 pub start: f64,
200 pub text: String,
201 #[serde(rename = "type")]
202 pub type_: TranscriptionSegmentType,
203 #[serde(default, flatten)]
204 pub rest: Rest,
205}
206
207#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
208pub enum TranscriptionSegmentType {
209 #[serde(rename = "transcript.text.segment")]
210 TranscriptTextSegment,
211}