use std::sync::Arc;
use crate::embedding_model::EmbeddingModel;
use crate::error::Result;
use crate::image_model::ImageModel;
use crate::language_model::LanguageModel;
pub trait Provider: Send + Sync + std::fmt::Debug {
fn language_model(&self, model_id: &str) -> Result<DynLanguageModel>;
fn embedding_model(&self, _model_id: &str) -> Result<DynEmbeddingModel> {
Err(crate::ProviderError::unsupported("embedding_model"))
}
fn image_model(&self, _model_id: &str) -> Result<DynImageModel> {
Err(crate::ProviderError::unsupported("image_model"))
}
}
#[derive(Debug, Clone)]
pub struct DynLanguageModel(Arc<dyn LanguageModel>);
impl DynLanguageModel {
pub fn new<M: LanguageModel + 'static>(model: M) -> Self {
Self(Arc::new(model))
}
#[must_use]
pub fn from_arc(model: Arc<dyn LanguageModel>) -> Self {
Self(model)
}
#[must_use]
pub fn into_inner(self) -> Arc<dyn LanguageModel> {
self.0
}
}
impl std::ops::Deref for DynLanguageModel {
type Target = dyn LanguageModel;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
#[derive(Debug, Clone)]
pub struct DynEmbeddingModel(Arc<dyn EmbeddingModel>);
impl DynEmbeddingModel {
pub fn new<M: EmbeddingModel + 'static>(model: M) -> Self {
Self(Arc::new(model))
}
#[must_use]
pub fn from_arc(model: Arc<dyn EmbeddingModel>) -> Self {
Self(model)
}
#[must_use]
pub fn into_inner(self) -> Arc<dyn EmbeddingModel> {
self.0
}
}
impl std::ops::Deref for DynEmbeddingModel {
type Target = dyn EmbeddingModel;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
#[derive(Debug, Clone)]
pub struct DynImageModel(Arc<dyn ImageModel>);
impl DynImageModel {
pub fn new<M: ImageModel + 'static>(model: M) -> Self {
Self(Arc::new(model))
}
#[must_use]
pub fn from_arc(model: Arc<dyn ImageModel>) -> Self {
Self(model)
}
#[must_use]
pub fn into_inner(self) -> Arc<dyn ImageModel> {
self.0
}
}
impl std::ops::Deref for DynImageModel {
type Target = dyn ImageModel;
fn deref(&self) -> &Self::Target {
&*self.0
}
}