use crate::_prelude::*;
pub trait ApiEmbedding
where
Self: ApiBase,
{
fn create_embedding(
&self,
request: EmbeddingRequest,
) -> impl Send + Future<Output = Result<EmbeddingResponse>> {
async {
let resp = self.post_json("/embeddings", request).await?;
tracing::debug!("{resp}");
Ok(serde_json::from_str::<ApiResult<EmbeddingResponse>>(&resp)?.as_result()?)
}
}
}
impl<T> ApiEmbedding for T where T: ApiBase {}
#[allow(missing_docs)]
#[derive(Clone, Debug, Serialize)]
pub struct EmbeddingRequest {
pub input: Either<String, Vec<String>>,
pub model: Model,
#[serde(skip_serializing_if = "Option::is_none")]
pub dimensions: Option<u32>,
pub encoding_format: Option<EncodingFormat>,
pub user: Option<String>,
}
impl Default for EmbeddingRequest {
fn default() -> Self {
Self {
input: Either::A("".into()),
model: Model::TextEmbedding3Large,
dimensions: None,
encoding_format: None,
user: None,
}
}
}
impl_serializable_enum! {
EncodingFormat {
#[default]
Float => "float",
Base64 => "base64",
}
}
#[allow(missing_docs)]
#[derive(Clone, Debug, Deserialize)]
pub struct EmbeddingResponse {
pub data: Vec<EmbeddingObject>,
pub model: Model,
pub usage: EmbeddingUsage,
}
#[allow(missing_docs)]
#[derive(Clone, Debug, Deserialize)]
pub struct EmbeddingObject {
pub embedding: Vec<f32>,
pub index: u32,
}
#[allow(missing_docs)]
#[derive(Clone, Debug, Deserialize)]
pub struct EmbeddingUsage {
pub prompt_tokens: u32,
pub total_tokens: u32,
}