use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::provider::{ModelName, ProviderId, TokenUsage};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EmbeddingRequest {
pub model: ModelName,
pub input: Vec<EmbeddingInput>,
pub dimensions: Option<u32>,
pub metadata: Value,
}
impl EmbeddingRequest {
#[must_use]
pub fn new(model: ModelName, input: Vec<EmbeddingInput>) -> Self {
Self {
model,
input,
dimensions: None,
metadata: Value::Null,
}
}
#[must_use]
pub fn from_text(model: ModelName, text: impl Into<String>) -> Self {
Self::new(model, vec![EmbeddingInput::text(text)])
}
#[must_use]
pub fn with_dimensions(mut self, dimensions: u32) -> Self {
self.dimensions = Some(dimensions);
self
}
#[must_use]
pub fn with_metadata(mut self, metadata: Value) -> Self {
self.metadata = metadata;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
#[non_exhaustive]
pub enum EmbeddingInput {
Text {
text: String,
},
Tokens {
tokens: Vec<u32>,
},
}
impl EmbeddingInput {
#[must_use]
pub fn text(text: impl Into<String>) -> Self {
Self::Text { text: text.into() }
}
#[must_use]
pub fn tokens(tokens: Vec<u32>) -> Self {
Self::Tokens { tokens }
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EmbeddingResponse {
pub provider: ProviderId,
pub model: ModelName,
pub embeddings: Vec<Embedding>,
pub usage: Option<TokenUsage>,
pub raw: Option<Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Embedding {
pub index: usize,
pub vector: Vec<f32>,
}
impl Embedding {
#[must_use]
pub fn new(index: usize, vector: Vec<f32>) -> Self {
Self { index, vector }
}
}