portkey_sdk/service/
embeddings.rs

1use std::future::Future;
2
3#[cfg(feature = "tracing")]
4use crate::TRACING_TARGET_SERVICE;
5use crate::client::PortkeyClient;
6use crate::error::Result;
7use crate::model::{CreateEmbeddingRequest, CreateEmbeddingResponse};
8
9/// Service trait for creating embeddings.
10///
11/// This trait provides methods for generating embeddings from text input
12/// using various embedding models through the Portkey gateway.
13///
14/// # Example
15///
16/// ```rust,no_run
17/// use portkey_sdk::{PortkeyConfig, Result};
18/// use portkey_sdk::service::EmbeddingsService;
19/// use portkey_sdk::builder::AuthMethod;
20/// use portkey_sdk::model::{CreateEmbeddingRequest, EmbeddingInput, EncodingFormat};
21///
22/// #[tokio::main]
23/// async fn main() -> Result<()> {
24///     let client = PortkeyConfig::builder()
25///         .with_api_key("your-portkey-api-key")
26///         .with_auth_method(AuthMethod::virtual_key("your-virtual-key"))
27///         .build_client()?;
28///
29///     // Create embeddings for a single string
30///     let request = CreateEmbeddingRequest {
31///         model: "text-embedding-ada-002".to_string(),
32///         input: EmbeddingInput::String(
33///             "The quick brown fox jumped over the lazy dog".to_string()
34///         ),
35///         encoding_format: Some(EncodingFormat::Float),
36///         dimensions: None,
37///         user: None,
38///     };
39///
40///     let response = client.create_embedding(request).await?;
41///     println!("Generated {} embeddings", response.data.len());
42///     println!("Model: {}", response.model);
43///     println!("Tokens used: {}", response.usage.total_tokens);
44///
45///     Ok(())
46/// }
47/// ```
48pub trait EmbeddingsService {
49    /// Creates an embedding vector representing the input text.
50    ///
51    /// # Arguments
52    ///
53    /// * `request` - The embedding request containing the model and input text
54    ///
55    /// # Returns
56    ///
57    /// Returns a `CreateEmbeddingResponse` containing the embedding vectors and usage statistics.
58    ///
59    /// # Errors
60    ///
61    /// Returns an error if the API request fails or the response cannot be parsed.
62    ///
63    /// # Example
64    ///
65    /// ```rust,no_run
66    /// use portkey_sdk::{PortkeyConfig, Result};
67    /// use portkey_sdk::service::EmbeddingsService;
68    /// use portkey_sdk::builder::AuthMethod;
69    /// use portkey_sdk::model::{CreateEmbeddingRequest, EmbeddingInput};
70    ///
71    /// # async fn example() -> Result<()> {
72    /// # let client = PortkeyConfig::builder()
73    /// #     .with_api_key("key")
74    /// #     .with_auth_method(AuthMethod::virtual_key("vk"))
75    /// #     .build_client()?;
76    /// let request = CreateEmbeddingRequest {
77    ///     model: "text-embedding-3-small".to_string(),
78    ///     input: EmbeddingInput::StringArray(vec![
79    ///         "Hello, world!".to_string(),
80    ///         "Embeddings are useful.".to_string(),
81    ///     ]),
82    ///     encoding_format: None,
83    ///     dimensions: Some(512),
84    ///     user: Some("user-123".to_string()),
85    /// };
86    ///
87    /// let response = client.create_embedding(request).await?;
88    /// for (i, embedding) in response.data.iter().enumerate() {
89    ///     println!("Embedding {}: {} dimensions", i, embedding.embedding.len());
90    /// }
91    /// # Ok(())
92    /// # }
93    /// ```
94    fn create_embedding(
95        &self,
96        request: CreateEmbeddingRequest,
97    ) -> impl Future<Output = Result<CreateEmbeddingResponse>>;
98}
99
100impl EmbeddingsService for PortkeyClient {
101    async fn create_embedding(
102        &self,
103        request: CreateEmbeddingRequest,
104    ) -> Result<CreateEmbeddingResponse> {
105        #[cfg(feature = "tracing")]
106        tracing::debug!(
107            target: TRACING_TARGET_SERVICE,
108            model = %request.model,
109            encoding_format = ?request.encoding_format,
110            dimensions = ?request.dimensions,
111            "Creating embedding"
112        );
113
114        let response = self
115            .send_json(reqwest::Method::POST, "/embeddings", &request)
116            .await?;
117        let response = response.error_for_status()?;
118        let embedding_response: CreateEmbeddingResponse = response.json().await?;
119
120        Ok(embedding_response)
121    }
122}