use std::sync::Arc;
use crate::dynamic::BatchRef;
use crate::dynamic::EmbeddingModelRef;
use crate::dynamic::FilesRef;
use crate::dynamic::ImageModelRef;
use crate::dynamic::LanguageModelRef;
use crate::dynamic::RealtimeFactoryRef;
use crate::dynamic::RerankingModelRef;
use crate::dynamic::SkillsRef;
use crate::dynamic::SpeechModelRef;
use crate::dynamic::SpeechTranslationModelRef;
use crate::dynamic::TranscriptionModelRef;
use crate::dynamic::VideoModelRef;
use crate::error::ModelKind;
use crate::error::NoSuchModelError;
use crate::shared::ProviderId;
pub trait Provider: Send + Sync + 'static {
fn provider_id(&self) -> &ProviderId;
fn language_model(&self, model_id: &str) -> Result<LanguageModelRef, NoSuchModelError>;
fn embedding_model(&self, model_id: &str) -> Result<EmbeddingModelRef, NoSuchModelError>;
fn image_model(&self, model_id: &str) -> Result<ImageModelRef, NoSuchModelError>;
fn transcription_model(
&self,
model_id: &str,
) -> Result<TranscriptionModelRef, NoSuchModelError> {
Err(NoSuchModelError::unsupported_kind(
self.provider_id(),
model_id,
ModelKind::Transcription,
))
}
fn speech_model(&self, model_id: &str) -> Result<SpeechModelRef, NoSuchModelError> {
Err(NoSuchModelError::unsupported_kind(
self.provider_id(),
model_id,
ModelKind::Speech,
))
}
fn reranking_model(&self, model_id: &str) -> Result<RerankingModelRef, NoSuchModelError> {
Err(NoSuchModelError::unsupported_kind(
self.provider_id(),
model_id,
ModelKind::Reranking,
))
}
fn video_model(&self, model_id: &str) -> Result<VideoModelRef, NoSuchModelError> {
Err(NoSuchModelError::unsupported_kind(
self.provider_id(),
model_id,
ModelKind::Video,
))
}
fn speech_translation_model(
&self,
model_id: &str,
) -> Result<SpeechTranslationModelRef, NoSuchModelError> {
Err(NoSuchModelError::unsupported_kind(
self.provider_id(),
model_id,
ModelKind::SpeechTranslation,
))
}
fn realtime(&self) -> Option<RealtimeFactoryRef> {
None
}
fn files(&self) -> Option<FilesRef> {
None
}
fn skills(&self) -> Option<SkillsRef> {
None
}
fn batch(&self) -> Option<BatchRef> {
None
}
}
pub type ProviderRef = Arc<dyn Provider>;