rig/client/
embeddings.rs

1use crate::Embed;
2#[allow(deprecated)]
3use crate::embeddings::embedding::EmbeddingModelDyn;
4use crate::embeddings::{EmbeddingModel, EmbeddingsBuilder};
5
6/// A provider client with embedding capabilities.
7/// Clone is required for conversions between client types.
8pub trait EmbeddingsClient {
9    /// The type of EmbeddingModel used by the Client
10    type EmbeddingModel: EmbeddingModel;
11
12    /// Create an embedding model with the given model.
13    ///
14    /// # Example
15    /// ```
16    /// use rig::prelude::*;
17    /// use rig::providers::openai::{Client, self};
18    ///
19    /// // Initialize the OpenAI client
20    /// let openai = Client::new("your-open-ai-api-key");
21    ///
22    /// let embedding_model = openai.embedding_model(openai::TEXT_EMBEDDING_3_LARGE);
23    /// ```
24    fn embedding_model(&self, model: impl Into<String>) -> Self::EmbeddingModel;
25
26    /// Create an embedding model with the given model identifier string and the number of dimensions in the embedding generated by the model.
27    /// This is the suggested method if you need to use a model not included in
28    /// `Self::EmbeddingModel::Models`
29    ///
30    /// # Example with OpenAI
31    /// ```
32    /// use rig::prelude::*;
33    /// use rig::providers::openai::{Client, self};
34    ///
35    /// // Initialize the OpenAI client
36    /// let openai = Client::new("your-open-ai-api-key");
37    ///
38    /// let embedding_model = openai.embedding_model("model-unknown-to-rig", 3072);
39    /// ```
40    fn embedding_model_with_ndims(
41        &self,
42        model: impl Into<String>,
43        ndims: usize,
44    ) -> Self::EmbeddingModel;
45
46    /// Create an embedding builder with the given embedding model.
47    ///
48    /// # Example with OpenAI
49    /// ```
50    /// use rig::prelude::*;
51    /// use rig::providers::openai::{Client, self};
52    ///
53    /// // Initialize the OpenAI client
54    /// let openai = Client::new("your-open-ai-api-key");
55    ///
56    /// let embeddings = openai.embeddings(openai::TEXT_EMBEDDING_3_LARGE)
57    ///     .simple_document("doc0", "Hello, world!")
58    ///     .simple_document("doc1", "Goodbye, world!")
59    ///     .build()
60    ///     .await
61    ///     .expect("Failed to embed documents");
62    /// ```
63    fn embeddings<D: Embed>(
64        &self,
65        model: impl Into<String>,
66    ) -> EmbeddingsBuilder<Self::EmbeddingModel, D> {
67        EmbeddingsBuilder::new(self.embedding_model(model))
68    }
69
70    /// Create an embedding builder with the given name and the number of dimensions in the embedding generated by the model.
71    ///
72    /// # Example with OpenAI
73    /// ```
74    /// use rig::prelude::*;
75    /// use rig::providers::openai::{Client, self};
76    ///
77    /// // Initialize the OpenAI client
78    /// let openai = Client::new("your-open-ai-api-key");
79    ///
80    /// let embeddings = openai.embeddings_with_ndims(openai::TEXT_EMBEDDING_3_LARGE, 3072)
81    ///     .simple_document("doc0", "Hello, world!")
82    ///     .simple_document("doc1", "Goodbye, world!")
83    ///     .build()
84    ///     .await
85    ///     .expect("Failed to embed documents");
86    /// ```
87    fn embeddings_with_ndims<D: Embed>(
88        &self,
89        model: &str,
90        ndims: usize,
91    ) -> EmbeddingsBuilder<Self::EmbeddingModel, D> {
92        EmbeddingsBuilder::new(self.embedding_model_with_ndims(model, ndims))
93    }
94}
95
96#[allow(deprecated)]
97#[deprecated(
98    since = "0.25.0",
99    note = "`DynClientBuilder` and related features have been deprecated and will be removed in a future release. In this case, use `EmbeddingsClient` instead."
100)]
101pub trait EmbeddingsClientDyn {
102    /// Create an embedding model with the given name.
103    /// Note: default embedding dimension of 0 will be used if model is not known.
104    /// If this is the case, it's better to use function `embedding_model_with_ndims`
105    fn embedding_model<'a>(&self, model: &str) -> Box<dyn EmbeddingModelDyn + 'a>;
106
107    /// Create an embedding model with the given name and the number of dimensions in the embedding generated by the model.
108    fn embedding_model_with_ndims<'a>(
109        &self,
110        model: &str,
111        ndims: usize,
112    ) -> Box<dyn EmbeddingModelDyn + 'a>;
113}
114
115#[allow(deprecated)]
116impl<M, T> EmbeddingsClientDyn for T
117where
118    T: EmbeddingsClient<EmbeddingModel = M>,
119    M: EmbeddingModel + 'static,
120{
121    fn embedding_model<'a>(&self, model: &str) -> Box<dyn EmbeddingModelDyn + 'a> {
122        Box::new(self.embedding_model(model))
123    }
124
125    fn embedding_model_with_ndims<'a>(
126        &self,
127        model: &str,
128        ndims: usize,
129    ) -> Box<dyn EmbeddingModelDyn + 'a> {
130        Box::new(self.embedding_model_with_ndims(model, ndims))
131    }
132}