Skip to main content

openai_types/embedding/
manual.rs

1// Manual: hand-crafted embedding types (enums, builders, response structs).
2
3use serde::{Deserialize, Serialize};
4
5/// Encoding format for embedding output.
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
8#[non_exhaustive]
9pub enum EncodingFormat {
10    #[serde(rename = "float")]
11    Float,
12    #[serde(rename = "base64")]
13    Base64,
14}
15
16/// Input for embeddings: a single string, array of strings, or array of token arrays.
17#[derive(Debug, Clone, Serialize)]
18#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
19#[serde(untagged)]
20#[non_exhaustive]
21pub enum EmbeddingInput {
22    String(String),
23    StringArray(Vec<String>),
24    Tokens(Vec<Vec<i64>>),
25}
26
27impl From<&str> for EmbeddingInput {
28    fn from(s: &str) -> Self {
29        EmbeddingInput::String(s.to_string())
30    }
31}
32
33impl From<String> for EmbeddingInput {
34    fn from(s: String) -> Self {
35        EmbeddingInput::String(s)
36    }
37}
38
39impl From<Vec<String>> for EmbeddingInput {
40    fn from(v: Vec<String>) -> Self {
41        EmbeddingInput::StringArray(v)
42    }
43}
44
45impl From<Vec<Vec<i64>>> for EmbeddingInput {
46    fn from(v: Vec<Vec<i64>>) -> Self {
47        EmbeddingInput::Tokens(v)
48    }
49}
50
51/// Request body for `POST /embeddings`.
52#[derive(Debug, Clone, Serialize)]
53#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
54pub struct EmbeddingCreateRequest {
55    /// Input text to embed.
56    pub input: EmbeddingInput,
57
58    /// Embedding model (e.g. "text-embedding-3-small").
59    pub model: String,
60
61    /// Encoding format for the embedding vectors.
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub encoding_format: Option<EncodingFormat>,
64
65    /// Number of dimensions to return (for supported models).
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub dimensions: Option<i64>,
68
69    /// A unique identifier representing your end-user.
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub user: Option<String>,
72}
73
74impl EmbeddingCreateRequest {
75    pub fn new(input: impl Into<EmbeddingInput>, model: impl Into<String>) -> Self {
76        Self {
77            input: input.into(),
78            model: model.into(),
79            encoding_format: None,
80            dimensions: None,
81            user: None,
82        }
83    }
84}
85
86/// Backward compatibility alias.
87pub type EmbeddingRequest = EmbeddingCreateRequest;
88
89/// OpenAPI spec name alias.
90pub type CreateEmbeddingRequest = EmbeddingCreateRequest;
91
92/// A single embedding vector.
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
95pub struct Embedding {
96    pub object: String,
97    /// The embedding vector (when encoding_format is float).
98    #[serde(default)]
99    pub embedding: Option<Vec<f64>>,
100    /// Base64-encoded embedding (when encoding_format is base64).
101    #[serde(default)]
102    pub b64_embedding: Option<String>,
103    pub index: i64,
104}
105
106/// Response from `POST /embeddings`.
107#[derive(Debug, Clone, Deserialize)]
108#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
109pub struct EmbeddingResponse {
110    pub object: String,
111    pub data: Vec<Embedding>,
112    pub model: String,
113    pub usage: super::Usage,
114}