liter_llm/types/
embedding.rs1use serde::{Deserialize, Serialize};
2
3use super::common::Usage;
4use crate::cost;
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "lowercase")]
11pub enum EmbeddingFormat {
12 Float,
14 Base64,
16}
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21#[serde(deny_unknown_fields)]
22pub struct EmbeddingRequest {
23 pub model: String,
24 pub input: EmbeddingInput,
25 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub encoding_format: Option<EmbeddingFormat>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub dimensions: Option<u32>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
30 pub user: Option<String>,
31}
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34#[serde(untagged)]
35pub enum EmbeddingInput {
36 Single(String),
37 Multiple(Vec<String>),
38}
39
40impl Default for EmbeddingInput {
41 fn default() -> Self {
42 Self::Single(String::new())
43 }
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49pub struct EmbeddingResponse {
50 pub object: String,
53 pub data: Vec<EmbeddingObject>,
54 pub model: String,
55 #[serde(default, skip_serializing_if = "Option::is_none")]
56 pub usage: Option<Usage>,
57}
58
59impl EmbeddingResponse {
60 #[must_use]
77 pub fn estimated_cost(&self) -> Option<f64> {
78 let usage = self.usage.as_ref()?;
79 cost::completion_cost(&self.model, usage.prompt_tokens, usage.completion_tokens)
80 }
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
84pub struct EmbeddingObject {
85 pub object: String,
88 pub embedding: Vec<f64>,
89 pub index: u32,
90}