use serde::{Deserialize, Serialize};
use crate::prelude::*;
use crate::usage::EmbeddingUsage;
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct EmbeddingRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<EmbeddingInput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encoding_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dimensions: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preview: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum EmbeddingInput {
String(String),
StringArray(Vec<String>),
Ints(Vec<i32>),
IntsArray(Vec<Vec<i32>>),
}
impl Default for EmbeddingInput {
fn default() -> Self {
EmbeddingInput::String(String::new())
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct EmbeddingResponse {
pub object: String,
pub model: String,
pub data: Vec<Embedding>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<EmbeddingUsage>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Embedding {
pub index: i32,
pub embedding: EmbeddingContent,
pub object: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum EmbeddingContent {
Float(Vec<f32>),
Base64(String),
}
impl Default for EmbeddingContent {
fn default() -> Self {
EmbeddingContent::Float(Vec::new())
}
}