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}