use std::sync::Arc;
use crate::error::Error;
use crate::provider::Provider;
use super::response::EmbeddingsResponse;
#[derive(Clone)]
pub struct EmbeddingsRequest {
pub model: String,
pub input: Vec<String>,
pub dimensions: Option<u32>,
pub provider_options: serde_json::Value,
}
impl EmbeddingsRequest {
pub fn new(model: impl Into<String>) -> Self {
Self {
model: model.into(),
input: Vec::new(),
dimensions: None,
provider_options: serde_json::Value::Null,
}
}
}
pub struct PendingEmbeddingsRequest {
provider: Arc<dyn Provider>,
request: EmbeddingsRequest,
}
impl PendingEmbeddingsRequest {
pub fn new(provider: Arc<dyn Provider>, model: impl Into<String>) -> Self {
Self {
provider,
request: EmbeddingsRequest::new(model),
}
}
pub fn with_input(mut self, input: impl Into<String>) -> Self {
self.request.input.push(input.into());
self
}
pub fn with_dimensions(mut self, dimensions: u32) -> Self {
self.request.dimensions = Some(dimensions);
self
}
pub fn to_request(&self) -> EmbeddingsRequest {
self.request.clone()
}
pub async fn generate(self) -> Result<EmbeddingsResponse, Error> {
self.provider.embeddings(self.request).await
}
}