Skip to main content

ferrin_spec/dynamic/
language_model.rs

1//! Object-safe language model.
2
3use 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
15/// Object-safe counterpart of [`LanguageModel`].
16///
17/// Implemented automatically for every `LanguageModel`; do not implement it
18/// by hand.
19pub trait DynLanguageModel: Send + Sync + 'static {
20    /// See [`LanguageModel::provider`].
21    fn provider(&self) -> &ProviderId;
22    /// See [`LanguageModel::model_id`].
23    fn model_id(&self) -> &ModelId;
24    /// See [`LanguageModel::supported_urls`].
25    fn supported_urls(&self) -> BoxFuture<'_, SupportedUrls>;
26    /// See [`LanguageModel::do_generate`].
27    fn do_generate(
28        &self,
29        options: CallOptions,
30    ) -> BoxFuture<'_, Result<GenerateResult, ProviderError>>;
31    /// See [`LanguageModel::do_stream`].
32    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
64/// Shared reference to a language model (or an unresolved model id).
65pub type LanguageModelRef = ModelRef<dyn DynLanguageModel>;
66
67ref_conversions!(LanguageModelRef, LanguageModel, DynLanguageModel);