ferrin_spec/dynamic/
language_model.rs1use super::BoxFuture;
4use super::ModelRef;
5use super::model_ref::ref_conversions;
6use crate::error::ProviderError;
7use crate::language_model::CallOptions;
8use crate::language_model::GenerateResult;
9use crate::language_model::LanguageModel;
10use crate::language_model::StreamResult;
11use crate::language_model::SupportedUrls;
12use crate::shared::ModelId;
13use crate::shared::ProviderId;
14
15pub trait DynLanguageModel: Send + Sync + 'static {
20 fn provider(&self) -> &ProviderId;
22 fn model_id(&self) -> &ModelId;
24 fn supported_urls(&self) -> BoxFuture<'_, SupportedUrls>;
26 fn do_generate(
28 &self,
29 options: CallOptions,
30 ) -> BoxFuture<'_, Result<GenerateResult, ProviderError>>;
31 fn do_stream(&self, options: CallOptions)
33 -> BoxFuture<'_, Result<StreamResult, ProviderError>>;
34}
35
36impl<T: LanguageModel> DynLanguageModel for T {
37 fn provider(&self) -> &ProviderId {
38 LanguageModel::provider(self)
39 }
40
41 fn model_id(&self) -> &ModelId {
42 LanguageModel::model_id(self)
43 }
44
45 fn supported_urls(&self) -> BoxFuture<'_, SupportedUrls> {
46 Box::pin(LanguageModel::supported_urls(self))
47 }
48
49 fn do_generate(
50 &self,
51 options: CallOptions,
52 ) -> BoxFuture<'_, Result<GenerateResult, ProviderError>> {
53 Box::pin(LanguageModel::do_generate(self, options))
54 }
55
56 fn do_stream(
57 &self,
58 options: CallOptions,
59 ) -> BoxFuture<'_, Result<StreamResult, ProviderError>> {
60 Box::pin(LanguageModel::do_stream(self, options))
61 }
62}
63
64pub type LanguageModelRef = ModelRef<dyn DynLanguageModel>;
66
67ref_conversions!(LanguageModelRef, LanguageModel, DynLanguageModel);