use super::types::{EncodingFormat, Input};
use crate::common::types::{Body, InParam, RetryCount, Timeout};
use http::{
HeaderValue,
header::{IntoHeaderName, USER_AGENT},
};
use serde_json::Value;
use std::time::Duration;
pub struct EmbeddingsParam {
inner: InParam,
}
impl EmbeddingsParam {
pub fn new<T: Into<Input>>(model: &str, input: T) -> Self {
let mut inner = InParam::new();
inner.body = Some(Body::new());
inner
.body
.as_mut()
.unwrap()
.insert("model".to_string(), serde_json::to_value(model).unwrap());
inner.body.as_mut().unwrap().insert(
"input".to_string(),
serde_json::to_value(<T as Into<Input>>::into(input)).unwrap(),
);
let param = EmbeddingsParam { inner };
param.encoding_format(EncodingFormat::Float)
}
pub fn encoding_format(mut self, encoding_format: EncodingFormat) -> Self {
self.inner.body.as_mut().unwrap().insert(
"encoding_format".to_string(),
serde_json::to_value(encoding_format).unwrap(),
);
self
}
pub fn dimensions(mut self, dimensions: usize) -> Self {
self.inner.body.as_mut().unwrap().insert(
"dimensions".to_string(),
serde_json::to_value(dimensions).unwrap(),
);
self
}
pub fn user(mut self, user: &str) -> Self {
self.inner
.body
.as_mut()
.unwrap()
.insert("user".to_string(), serde_json::to_value(user).unwrap());
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.inner.extensions.insert(Timeout(timeout));
self
}
pub fn user_agent(mut self, user_agent: HeaderValue) -> Self {
self.inner.headers.insert(USER_AGENT, user_agent);
self
}
pub fn header<K: IntoHeaderName>(mut self, key: K, val: HeaderValue) -> Self {
self.inner.headers.insert(key, val);
self
}
pub fn body<K: Into<String>, V: Into<Value>>(mut self, key: K, val: V) -> Self {
self.inner
.body
.as_mut()
.unwrap()
.insert(key.into(), val.into());
self
}
pub fn retry_count(mut self, retry_count: usize) -> Self {
self.inner.extensions.insert(RetryCount(retry_count));
self
}
}
impl EmbeddingsParam {
pub(crate) fn take(self) -> InParam {
self.inner
}
}