Skip to main content

ferrin_spec/dynamic/
embedding_model.rs

1//! Object-safe embedding model.
2
3use super::BoxFuture;
4use super::ModelRef;
5use super::model_ref::ref_conversions;
6use crate::embedding_model::EmbedOptions;
7use crate::embedding_model::EmbedResult;
8use crate::embedding_model::EmbeddingModel;
9use crate::error::ProviderError;
10use crate::shared::ModelId;
11use crate::shared::ProviderId;
12
13/// Object-safe counterpart of [`EmbeddingModel`].
14pub trait DynEmbeddingModel: Send + Sync + 'static {
15    /// See [`EmbeddingModel::provider`].
16    fn provider(&self) -> &ProviderId;
17    /// See [`EmbeddingModel::model_id`].
18    fn model_id(&self) -> &ModelId;
19    /// See [`EmbeddingModel::max_embeddings_per_call`].
20    fn max_embeddings_per_call(&self) -> Option<usize>;
21    /// See [`EmbeddingModel::max_input_bytes_per_call`].
22    fn max_input_bytes_per_call(&self) -> Option<usize>;
23    /// See [`EmbeddingModel::supports_parallel_calls`].
24    fn supports_parallel_calls(&self) -> bool;
25    /// See [`EmbeddingModel::do_embed`].
26    fn do_embed(&self, options: EmbedOptions) -> BoxFuture<'_, Result<EmbedResult, ProviderError>>;
27}
28
29impl<T: EmbeddingModel> DynEmbeddingModel for T {
30    fn provider(&self) -> &ProviderId {
31        EmbeddingModel::provider(self)
32    }
33
34    fn model_id(&self) -> &ModelId {
35        EmbeddingModel::model_id(self)
36    }
37
38    fn max_embeddings_per_call(&self) -> Option<usize> {
39        EmbeddingModel::max_embeddings_per_call(self)
40    }
41
42    fn max_input_bytes_per_call(&self) -> Option<usize> {
43        EmbeddingModel::max_input_bytes_per_call(self)
44    }
45
46    fn supports_parallel_calls(&self) -> bool {
47        EmbeddingModel::supports_parallel_calls(self)
48    }
49
50    fn do_embed(&self, options: EmbedOptions) -> BoxFuture<'_, Result<EmbedResult, ProviderError>> {
51        Box::pin(EmbeddingModel::do_embed(self, options))
52    }
53}
54
55/// Shared reference to an embedding model (or an unresolved model id).
56pub type EmbeddingModelRef = ModelRef<dyn DynEmbeddingModel>;
57
58ref_conversions!(EmbeddingModelRef, EmbeddingModel, DynEmbeddingModel);