use crate::completion::Usage;
use crate::error::ProviderError;
use crate::transcription;
use serde::{Deserialize, Serialize};
pub const WHISPER_1: &str = "whisper-1";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TranscriptionResponse {
pub text: String,
#[serde(default)]
pub usage: Option<TranscriptionUsage>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum TranscriptionUsage {
Duration {
r#type: DurationTag,
seconds: f64,
},
Tokens {
r#type: TokensTag,
input_tokens: u64,
#[serde(default)]
input_token_details: Option<TranscriptionInputTokenDetails>,
output_tokens: u64,
total_tokens: u64,
},
Other(serde_json::Value),
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum DurationTag {
Duration,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum TokensTag {
Tokens,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct TranscriptionInputTokenDetails {
#[serde(default)]
pub audio_tokens: u64,
#[serde(default)]
pub text_tokens: u64,
}
impl TranscriptionResponse {
pub fn normalize(self) -> Result<transcription::TranscriptionResponse, ProviderError> {
let usage = match &self.usage {
Some(TranscriptionUsage::Tokens {
input_tokens,
output_tokens,
total_tokens,
..
}) => Usage {
input_tokens: Some(*input_tokens),
output_tokens: Some(*output_tokens),
total_tokens: Some(*total_tokens),
..Default::default()
},
Some(TranscriptionUsage::Duration { .. })
| Some(TranscriptionUsage::Other(_))
| None => Usage::default(),
};
Ok(transcription::TranscriptionResponse {
usage,
..transcription::TranscriptionResponse::new(self.text)
})
}
}
#[cfg(test)]
mod tests;