use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum TranscriptionProvider {
#[default]
OpenAI,
#[serde(rename = "openai-realtime")]
OpenAIRealtime,
Mistral,
Groq,
Deepgram,
ElevenLabs,
#[serde(rename = "local-whisper")]
LocalWhisper,
#[serde(rename = "local-parakeet")]
LocalParakeet,
}
impl TranscriptionProvider {
pub fn as_str(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI => "openai",
TranscriptionProvider::OpenAIRealtime => "openai-realtime",
TranscriptionProvider::Mistral => "mistral",
TranscriptionProvider::Groq => "groq",
TranscriptionProvider::Deepgram => "deepgram",
TranscriptionProvider::ElevenLabs => "elevenlabs",
TranscriptionProvider::LocalWhisper => "local-whisper",
TranscriptionProvider::LocalParakeet => "local-parakeet",
}
}
pub fn api_key_env_var(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI | TranscriptionProvider::OpenAIRealtime => {
"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",
TranscriptionProvider::LocalParakeet => "LOCAL_PARAKEET_MODEL_PATH",
}
}
pub fn all() -> &'static [TranscriptionProvider] {
&[
TranscriptionProvider::OpenAI,
TranscriptionProvider::OpenAIRealtime,
TranscriptionProvider::Mistral,
TranscriptionProvider::Groq,
TranscriptionProvider::Deepgram,
TranscriptionProvider::ElevenLabs,
TranscriptionProvider::LocalWhisper,
TranscriptionProvider::LocalParakeet,
]
}
pub fn display_name(&self) -> &'static str {
match self {
TranscriptionProvider::OpenAI => "OpenAI",
TranscriptionProvider::OpenAIRealtime => "OpenAI Realtime",
TranscriptionProvider::Mistral => "Mistral",
TranscriptionProvider::Groq => "Groq",
TranscriptionProvider::Deepgram => "Deepgram",
TranscriptionProvider::ElevenLabs => "ElevenLabs",
TranscriptionProvider::LocalWhisper => "Local Whisper",
TranscriptionProvider::LocalParakeet => "Local Parakeet",
}
}
pub fn requires_api_key(&self) -> bool {
!matches!(
self,
TranscriptionProvider::LocalWhisper | TranscriptionProvider::LocalParakeet
)
}
pub fn is_local(&self) -> bool {
matches!(
self,
TranscriptionProvider::LocalWhisper | TranscriptionProvider::LocalParakeet
)
}
}
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),
"openai-realtime" | "openairealttime" | "realtime" => {
Ok(TranscriptionProvider::OpenAIRealtime)
}
"mistral" => Ok(TranscriptionProvider::Mistral),
"groq" => Ok(TranscriptionProvider::Groq),
"deepgram" => Ok(TranscriptionProvider::Deepgram),
"elevenlabs" => Ok(TranscriptionProvider::ElevenLabs),
"local-whisper" | "localwhisper" | "whisper" => Ok(TranscriptionProvider::LocalWhisper),
"local-parakeet" | "localparakeet" | "parakeet" => {
Ok(TranscriptionProvider::LocalParakeet)
}
_ => Err(format!(
"Unknown provider: {}. Available: openai, openai-realtime, mistral, groq, deepgram, elevenlabs, local-whisper, local-parakeet",
s
)),
}
}
}