use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum TranscriptionProvider {
#[default]
OpenAI,
Mistral,
Groq,
Deepgram,
ElevenLabs,
#[serde(rename = "local-whisper")]
LocalWhisper,
}
impl TranscriptionProvider {
pub fn as_str(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI => "openai",
TranscriptionProvider::Mistral => "mistral",
TranscriptionProvider::Groq => "groq",
TranscriptionProvider::Deepgram => "deepgram",
TranscriptionProvider::ElevenLabs => "elevenlabs",
TranscriptionProvider::LocalWhisper => "local-whisper",
}
}
pub fn api_key_env_var(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI => "OPENAI_API_KEY",
TranscriptionProvider::Mistral => "MISTRAL_API_KEY",
TranscriptionProvider::Groq => "GROQ_API_KEY",
TranscriptionProvider::Deepgram => "DEEPGRAM_API_KEY",
TranscriptionProvider::ElevenLabs => "ELEVENLABS_API_KEY",
TranscriptionProvider::LocalWhisper => "LOCAL_WHISPER_MODEL_PATH",
}
}
pub fn all() -> &'static [TranscriptionProvider] {
&[
TranscriptionProvider::OpenAI,
TranscriptionProvider::Mistral,
TranscriptionProvider::Groq,
TranscriptionProvider::Deepgram,
TranscriptionProvider::ElevenLabs,
TranscriptionProvider::LocalWhisper,
]
}
pub fn display_name(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI => "OpenAI",
TranscriptionProvider::Mistral => "Mistral",
TranscriptionProvider::Groq => "Groq",
TranscriptionProvider::Deepgram => "Deepgram",
TranscriptionProvider::ElevenLabs => "ElevenLabs",
TranscriptionProvider::LocalWhisper => "Local Whisper",
}
}
pub fn requires_api_key(&self) -> bool {
!matches!(self, TranscriptionProvider::LocalWhisper)
}
}
impl fmt::Display for TranscriptionProvider {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl std::str::FromStr for TranscriptionProvider {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"openai" => Ok(TranscriptionProvider::OpenAI),
"mistral" => Ok(TranscriptionProvider::Mistral),
"groq" => Ok(TranscriptionProvider::Groq),
"deepgram" => Ok(TranscriptionProvider::Deepgram),
"elevenlabs" => Ok(TranscriptionProvider::ElevenLabs),
"local-whisper" | "localwhisper" | "whisper" => Ok(TranscriptionProvider::LocalWhisper),
_ => Err(format!(
"Unknown provider: {}. Available: openai, mistral, groq, deepgram, elevenlabs, local-whisper",
s
)),
}
}
}