use serde::{Deserialize, Serialize};
#[allow(unused_imports)]
pub use async_openai::types::embeddings::*;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum EmbeddingVector {
Float(Vec<f32>),
Base64(String),
}
impl EmbeddingVector {
pub fn dim(&self) -> Option<usize> {
match self {
EmbeddingVector::Float(v) => Some(v.len()),
EmbeddingVector::Base64(_) => None,
}
}
}
impl From<Vec<f32>> for EmbeddingVector {
fn from(v: Vec<f32>) -> Self {
EmbeddingVector::Float(v)
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct Embedding {
pub index: u32,
pub object: String,
pub embedding: EmbeddingVector,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct CreateEmbeddingResponse {
pub object: String,
pub model: String,
pub data: Vec<Embedding>,
pub usage: EmbeddingUsage,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn float_variant_serializes_as_array() {
let v = EmbeddingVector::Float(vec![0.1, 0.2, 0.3]);
let json = serde_json::to_string(&v).unwrap();
assert_eq!(json, "[0.1,0.2,0.3]");
}
#[test]
fn base64_variant_serializes_as_string() {
let v = EmbeddingVector::Base64("AAACOQ==".to_string());
let json = serde_json::to_string(&v).unwrap();
assert_eq!(json, "\"AAACOQ==\"");
}
#[test]
fn deserializes_array_as_float() {
let v: EmbeddingVector = serde_json::from_str("[0.1, 0.2, 0.3]").unwrap();
assert_eq!(v, EmbeddingVector::Float(vec![0.1, 0.2, 0.3]));
}
#[test]
fn deserializes_string_as_base64() {
let v: EmbeddingVector = serde_json::from_str("\"AAACOQ==\"").unwrap();
assert_eq!(v, EmbeddingVector::Base64("AAACOQ==".to_string()));
}
#[test]
fn round_trips_via_embedding_struct() {
let e = Embedding {
index: 0,
object: "embedding".to_string(),
embedding: EmbeddingVector::Float(vec![1.0, 2.0]),
};
let json = serde_json::to_string(&e).unwrap();
let parsed: Embedding = serde_json::from_str(&json).unwrap();
assert_eq!(e, parsed);
let e = Embedding {
index: 1,
object: "embedding".to_string(),
embedding: EmbeddingVector::Base64("AAACOQ==".to_string()),
};
let json = serde_json::to_string(&e).unwrap();
let parsed: Embedding = serde_json::from_str(&json).unwrap();
assert_eq!(e, parsed);
}
}