use serde::{Deserialize, Serialize};
pub(crate) const PATH: &str = "/embeddings";
#[derive(Serialize, Clone, Default, Deserialize, Debug)]
pub enum Direction {
#[serde(rename = "Right")]
#[default]
Right,
#[serde(rename = "Left")]
Left,
}
#[derive(Serialize, Clone, Default, Deserialize, Debug)]
pub struct Input {
pub text: Option<String>,
pub image: Option<String>,
}
#[derive(Serialize, Clone, Default, Deserialize, Debug)]
pub struct Request {
pub(crate) input: Vec<Input>,
pub(crate) model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) truncate: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) truncate_direction: Option<Direction>,
}
impl Request {
pub fn new(model: String, text: Option<String>, image: Option<String>) -> Request {
Self {
model,
input: vec![Input { text, image }],
truncate: None,
truncate_direction: None,
}
}
pub fn truncate(mut self, direction: Direction) -> Self {
self.truncate = Some(true);
self.truncate_direction = Some(direction);
self
}
pub fn add_input(mut self, text: Option<String>, image: Option<String>) -> Self {
self.input.push(Input { text, image });
self
}
pub fn add_inputs(mut self, inputs: Vec<Input>) -> Self {
for i in inputs {
self.input.push(i);
}
self
}
}
#[derive(Serialize, Default, Deserialize, Debug)]
#[serde(default)]
pub struct Data {
pub index: i64,
pub object: String,
pub embedding: Vec<f64>,
}
#[derive(Serialize, Default, Deserialize, Debug)]
#[serde(default)]
pub struct Response {
pub id: String,
pub object: String,
pub created: i64,
pub model: String,
pub data: Vec<Data>,
}