mod private
{
use crate::
{
client ::Client,
error ::{ Result, OpenAIError },
environment ::{ OpenaiEnvironment, EnvironmentInterface },
curl_generation ::{ CurlGeneration, build_curl_request, serialize_request_to_json },
};
use crate::components::embeddings::
{
CreateEmbeddingResponse,
};
use crate::components::embeddings_request::
{
CreateEmbeddingRequest,
};
#[ derive( Debug, Clone ) ]
pub struct Embeddings< 'client, E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static,
{
client : &'client Client< E >,
}
impl< 'client, E > Embeddings< 'client, E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static,
{
#[ inline ]
pub(crate) fn new( client : &'client Client< E > ) -> Self
{
Self { client }
}
#[ inline ]
pub async fn create( &self, request : CreateEmbeddingRequest ) -> Result< CreateEmbeddingResponse >
{
#[ cfg( feature = "input_validation" ) ]
{
use crate::input_validation::Validate;
if let Err( validation_errors ) = request.validate()
{
let error_messages : Vec< String > = validation_errors
.iter()
.map( | e | format!( "{e}" ) )
.collect();
return Err( error_tools::Error::from( crate::error::OpenAIError::InvalidArgument( format!( "Request validation failed : {}", error_messages.join( "; " ) ) ) ) );
}
}
self.client.post( "embeddings", &request ).await
}
}
impl< E > CurlGeneration for Embeddings< '_, E >
where
E : OpenaiEnvironment + EnvironmentInterface + Send + Sync + 'static,
{
type Request = CreateEmbeddingRequest;
type Error = OpenAIError;
#[ inline ]
fn to_curl( &self, request : &Self::Request ) -> core::result::Result< String, Self::Error >
{
let json_body = serialize_request_to_json( request ).map_err( |e|
OpenAIError::Internal( format!( "Failed to serialize request : {e}" ) )
)?;
let base_url = self.client.environment.base_url();
let url = format!( "{base_url}embeddings" );
let mut headers = vec![
( "Content-Type".to_string(), "application/json".to_string() ),
( "User-Agent".to_string(), "api-openai/1.0.0".to_string() ),
];
let env_headers = self.client.environment.headers().map_err( |e|
OpenAIError::Internal( format!( "Failed to get headers from environment : {e}" ) )
)?;
for ( key, value ) in &env_headers
{
if let Ok( value_str ) = value.to_str()
{
headers.push( ( key.as_str().to_string(), value_str.to_string() ) );
}
}
let curl_request = build_curl_request( "POST", &url, &headers, Some( &json_body ) );
Ok( curl_request.to_curl_command() )
}
#[ inline ]
fn to_curl_safe( &self, request : &Self::Request ) -> core::result::Result< String, Self::Error >
{
let json_body = serialize_request_to_json( request ).map_err( |e|
OpenAIError::Internal( format!( "Failed to serialize request : {e}" ) )
)?;
let base_url = self.client.environment.base_url();
let url = format!( "{base_url}embeddings" );
let headers = vec![
( "Content-Type".to_string(), "application/json".to_string() ),
( "User-Agent".to_string(), "api-openai/1.0.0".to_string() ),
( "Authorization".to_string(), "Bearer [REDACTED]".to_string() ),
];
let curl_request = build_curl_request( "POST", &url, &headers, Some( &json_body ) );
Ok( curl_request.to_curl_command() )
}
#[ inline ]
fn to_curl_with_headers( &self, request : &Self::Request, custom_headers : &std::collections::HashMap< String, String > ) -> core::result::Result< String, Self::Error >
{
let json_body = serialize_request_to_json( request ).map_err( |e|
OpenAIError::Internal( format!( "Failed to serialize request : {e}" ) )
)?;
let base_url = self.client.environment.base_url();
let url = format!( "{base_url}embeddings" );
let mut headers = vec![
( "Content-Type".to_string(), "application/json".to_string() ),
( "User-Agent".to_string(), "api-openai/1.0.0".to_string() ),
];
let env_headers = self.client.environment.headers().map_err( |e|
OpenAIError::Internal( format!( "Failed to get headers from environment : {e}" ) )
)?;
for ( key, value ) in &env_headers
{
if let Ok( value_str ) = value.to_str()
{
headers.push( ( key.as_str().to_string(), value_str.to_string() ) );
}
}
for ( key, value ) in custom_headers
{
headers.push( ( key.clone(), value.clone() ) );
}
let curl_request = build_curl_request( "POST", &url, &headers, Some( &json_body ) );
Ok( curl_request.to_curl_command() )
}
}
}
crate ::mod_interface!
{
exposed use
{
Embeddings,
};
}