use crate::ModelIden;
use crate::chat::Usage;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedResponse {
pub embeddings: Vec<Embedding>,
pub model_iden: ModelIden,
pub provider_model_iden: ModelIden,
pub usage: Usage,
pub captured_raw_body: Option<serde_json::Value>,
}
impl EmbedResponse {
pub fn new(
embeddings: Vec<Embedding>,
model_iden: ModelIden,
provider_model_iden: ModelIden,
usage: Usage,
) -> Self {
Self {
embeddings,
model_iden,
provider_model_iden,
usage,
captured_raw_body: None,
}
}
pub fn with_captured_raw_body(mut self, raw_body: serde_json::Value) -> Self {
self.captured_raw_body = Some(raw_body);
self
}
}
impl EmbedResponse {
pub fn first_embedding(&self) -> Option<&Embedding> {
self.embeddings.first()
}
pub fn first_vector(&self) -> Option<&Vec<f32>> {
self.first_embedding().map(|e| &e.vector)
}
pub fn vectors(&self) -> Vec<&Vec<f32>> {
self.embeddings.iter().map(|e| &e.vector).collect()
}
pub fn into_vectors(self) -> Vec<Vec<f32>> {
self.embeddings.into_iter().map(|e| e.vector).collect()
}
pub fn is_single(&self) -> bool {
self.embeddings.len() == 1
}
pub fn is_batch(&self) -> bool {
self.embeddings.len() > 1
}
pub fn embedding_count(&self) -> usize {
self.embeddings.len()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Embedding {
pub vector: Vec<f32>,
pub index: usize,
pub dimensions: usize,
}
impl Embedding {
pub fn new(vector: Vec<f32>, index: usize) -> Self {
let dimensions = vector.len();
Self {
vector,
index,
dimensions,
}
}
pub fn with_dimensions(vector: Vec<f32>, index: usize, dimensions: usize) -> Self {
Self {
vector,
index,
dimensions,
}
}
}
impl Embedding {
pub fn vector(&self) -> &Vec<f32> {
&self.vector
}
pub fn into_vector(self) -> Vec<f32> {
self.vector
}
pub fn index(&self) -> usize {
self.index
}
pub fn dimensions(&self) -> usize {
self.dimensions
}
}