use super::BoxFuture;
use super::ModelRef;
use super::model_ref::ref_conversions;
use crate::error::ProviderError;
use crate::language_model::CallOptions;
use crate::language_model::GenerateResult;
use crate::language_model::LanguageModel;
use crate::language_model::StreamResult;
use crate::language_model::SupportedUrls;
use crate::shared::ModelId;
use crate::shared::ProviderId;
pub trait DynLanguageModel: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model_id(&self) -> &ModelId;
fn supported_urls(&self) -> BoxFuture<'_, SupportedUrls>;
fn do_generate(
&self,
options: CallOptions,
) -> BoxFuture<'_, Result<GenerateResult, ProviderError>>;
fn do_stream(&self, options: CallOptions)
-> BoxFuture<'_, Result<StreamResult, ProviderError>>;
}
impl<T: LanguageModel> DynLanguageModel for T {
fn provider(&self) -> &ProviderId {
LanguageModel::provider(self)
}
fn model_id(&self) -> &ModelId {
LanguageModel::model_id(self)
}
fn supported_urls(&self) -> BoxFuture<'_, SupportedUrls> {
Box::pin(LanguageModel::supported_urls(self))
}
fn do_generate(
&self,
options: CallOptions,
) -> BoxFuture<'_, Result<GenerateResult, ProviderError>> {
Box::pin(LanguageModel::do_generate(self, options))
}
fn do_stream(
&self,
options: CallOptions,
) -> BoxFuture<'_, Result<StreamResult, ProviderError>> {
Box::pin(LanguageModel::do_stream(self, options))
}
}
pub type LanguageModelRef = ModelRef<dyn DynLanguageModel>;
ref_conversions!(LanguageModelRef, LanguageModel, DynLanguageModel);