use crate::connection::{HttpBody, MultipartPart};
use crate::{Rest, WireRequest, WireResponse};
use serde::{Deserialize, Serialize};
fn optional<'de, D, T>(d: D) -> Result<Option<T>, D::Error>
where
D: serde::Deserializer<'de>,
T: Deserialize<'de>,
{
T::deserialize(d).map(Some)
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CreateSpeechRequestBody {
pub model: String,
pub input: String,
pub voice: SpeechVoice,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub instructions: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub response_format: Option<AudioResponseFormat>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub speed: Option<serde_json::Number>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub stream_format: Option<SpeechStreamFormat>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum SpeechVoice {
Name(String),
Custom(CustomVoice),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CustomVoice {
pub id: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum AudioResponseFormat {
#[serde(rename = "mp3")]
Mp3,
#[serde(rename = "opus")]
Opus,
#[serde(rename = "aac")]
Aac,
#[serde(rename = "flac")]
Flac,
#[serde(rename = "wav")]
Wav,
#[serde(rename = "pcm")]
Pcm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum SpeechStreamFormat {
#[serde(rename = "sse")]
Sse,
#[serde(rename = "audio")]
Audio,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum SpeechAudioEvent {
#[serde(rename = "speech.audio.delta")]
Delta(SpeechAudioDelta),
#[serde(rename = "speech.audio.done")]
Done(SpeechAudioDone),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct SpeechAudioDelta {
pub audio: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct SpeechAudioDone {
pub usage: SpeechUsage,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct SpeechUsage {
pub input_tokens: i64,
pub output_tokens: i64,
pub total_tokens: i64,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CreateTranscriptionMultipartForm {
pub file: MultipartPart,
pub model: String,
pub language: Option<String>,
pub languages: Option<Vec<String>>,
pub keywords: Option<Vec<String>>,
pub prompt: Option<String>,
pub response_format: Option<TranscriptionResponseFormat>,
pub temperature: Option<serde_json::Number>,
pub timestamp_granularities: Option<Vec<TranscriptionTimestampGranularity>>,
pub include: Option<Vec<TranscriptionInclude>>,
pub chunking_strategy: Option<Option<ChunkingStrategy>>,
pub known_speaker_names: Option<Vec<String>>,
pub known_speaker_references: Option<Vec<String>>,
pub stream: Option<Option<bool>>,
}
#[derive(Debug, gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CreateTranslationMultipartForm {
pub file: MultipartPart,
pub model: String,
pub prompt: Option<String>,
pub response_format: Option<TranslationResponseFormat>,
pub temperature: Option<serde_json::Number>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionResponseFormat {
#[serde(rename = "json")]
Json,
#[serde(rename = "text")]
Text,
#[serde(rename = "srt")]
Srt,
#[serde(rename = "verbose_json")]
VerboseJson,
#[serde(rename = "vtt")]
Vtt,
#[serde(rename = "diarized_json")]
DiarizedJson,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranslationResponseFormat {
#[serde(rename = "json")]
Json,
#[serde(rename = "text")]
Text,
#[serde(rename = "srt")]
Srt,
#[serde(rename = "verbose_json")]
VerboseJson,
#[serde(rename = "vtt")]
Vtt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionTimestampGranularity {
#[serde(rename = "word")]
Word,
#[serde(rename = "segment")]
Segment,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionInclude {
#[serde(rename = "logprobs")]
Logprobs,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum AutomaticChunking {
#[serde(rename = "auto")]
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum VadType {
#[serde(rename = "server_vad")]
ServerVad,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum ChunkingStrategy {
Auto(AutomaticChunking),
Vad(VadConfig),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct VadConfig {
#[serde(rename = "type")]
pub type_: VadType,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub prefix_padding_ms: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub silence_duration_ms: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub threshold: Option<serde_json::Number>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionJson {
pub text: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub languages: Option<Vec<TranscriptionLanguage>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub logprobs: Option<Vec<TranscriptionLogprob>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<TranscriptionUsage>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionLanguage {
pub code: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionLogprob {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub token: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub bytes: Option<Vec<i64>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub logprob: Option<serde_json::Number>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionVerbose {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub task: Option<TranscriptionTask>,
pub duration: serde_json::Number,
pub language: String,
pub text: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub segments: Option<Vec<TranscriptionSegment>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<TranscriptionDurationUsage>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub words: Option<Vec<TranscriptionWord>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionDiarized {
pub duration: serde_json::Number,
pub segments: Vec<TranscriptionDiarizedSegment>,
pub task: TranscriptionTask,
pub text: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<TranscriptionUsage>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionTask {
#[serde(rename = "transcribe")]
Transcribe,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionDiarizedSegmentType {
#[serde(rename = "transcript.text.segment")]
Segment,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionDiarizedSegment {
pub id: String,
pub end: serde_json::Number,
pub speaker: String,
pub start: serde_json::Number,
pub text: String,
#[serde(rename = "type")]
pub type_: TranscriptionDiarizedSegmentType,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionSegment {
pub id: i64,
pub avg_logprob: serde_json::Number,
pub compression_ratio: serde_json::Number,
pub end: serde_json::Number,
pub no_speech_prob: serde_json::Number,
pub seek: i64,
pub start: serde_json::Number,
pub temperature: serde_json::Number,
pub text: String,
pub tokens: Vec<i64>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionWord {
pub end: serde_json::Number,
pub start: serde_json::Number,
pub word: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TokenUsageType {
#[serde(rename = "tokens")]
Tokens,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum DurationUsageType {
#[serde(rename = "duration")]
Duration,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionTokenUsage {
pub input_tokens: i64,
pub output_tokens: i64,
pub total_tokens: i64,
#[serde(rename = "type")]
pub type_: TokenUsageType,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub input_token_details: Option<TranscriptionInputTokenDetails>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionInputTokenDetails {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub audio_tokens: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub text_tokens: Option<i64>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionDurationUsage {
pub seconds: serde_json::Number,
#[serde(rename = "type")]
pub type_: DurationUsageType,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionUsage {
Tokens(TranscriptionTokenUsage),
Duration(TranscriptionDurationUsage),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranslationJson {
pub text: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranslationVerbose {
pub duration: serde_json::Number,
pub language: String,
pub text: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub segments: Option<Vec<TranscriptionSegment>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionTextStreamEvent {
#[serde(rename = "transcript.text.delta")]
Delta(TranscriptionTextDelta),
#[serde(rename = "transcript.text.done")]
Done(TranscriptionTextDone),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum TranscriptionStreamEvent {
Text(TranscriptionTextStreamEvent),
Segment(TranscriptionDiarizedSegment),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionTextDelta {
pub delta: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub logprobs: Option<Vec<TranscriptionLogprob>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub segment_id: Option<String>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct TranscriptionTextDone {
pub text: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub languages: Option<Vec<TranscriptionLanguage>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub logprobs: Option<Vec<TranscriptionLogprob>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<TranscriptionTokenUsage>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
pub type CreateSpeechRequest = WireRequest<CreateSpeechRequestBody>;
pub type CreateSpeechResponse = WireResponse<HttpBody>;
pub type SpeechStreamResponse = WireResponse<crate::connection::ByteStream>;
pub type CreateTranscriptionRequest = WireRequest<CreateTranscriptionMultipartForm>;
pub type RawTranscriptionRequest = WireRequest<crate::connection::Multipart>;
pub type CreateTranslationRequest = WireRequest<CreateTranslationMultipartForm>;
pub type RawTranslationRequest = WireRequest<crate::connection::Multipart>;
pub type CreateTranscriptionResponse = WireResponse<HttpBody>;
pub type CreateTranslationResponse = WireResponse<HttpBody>;
pub type TranscriptionJsonResponse = WireResponse<TranscriptionJson>;
pub type TranscriptionVerboseResponse = WireResponse<TranscriptionVerbose>;
pub type TranscriptionDiarizedResponse = WireResponse<TranscriptionDiarized>;
pub type TranslationJsonResponse = WireResponse<TranslationJson>;
pub type TranslationVerboseResponse = WireResponse<TranslationVerbose>;
pub type TranscriptionStreamResponse = WireResponse<crate::connection::ByteStream>;