Skip to main content

gproxy_protocol/wire/openai/
embeddings.rs

1//! OpenAI embeddings request/response wire shapes. Source: Create embeddings.md.
2//! Base64 wire vectors are also handled by the official SDK response parser:
3//! https://github.com/openai/openai-python/blob/main/src/openai/resources/embeddings.py
4use crate::{Rest, WireRequest, WireResponse};
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
8#[serde(rename_all = "snake_case")]
9#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
10#[derive(gproxy_protocol_macros::DeclaredFields)]
11#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
12pub struct CreateEmbeddingRequestBody {
13    pub input: EmbeddingInput,
14    pub model: String,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub dimensions: Option<i64>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub encoding_format: Option<EmbeddingEncodingFormat>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub user: Option<String>,
21    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
22    pub rest: Rest,
23}
24pub type CreateEmbeddingRequest = WireRequest<CreateEmbeddingRequestBody>;
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26#[serde(untagged)]
27#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
28#[derive(gproxy_protocol_macros::DeclaredFields)]
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30pub enum EmbeddingInput {
31    Text(String),
32    Texts(Vec<String>),
33    Tokens(Vec<i64>),
34    TokenArrays(Vec<Vec<i64>>),
35}
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
37#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
38#[derive(gproxy_protocol_macros::DeclaredFields)]
39#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
40pub enum EmbeddingModel {
41    #[serde(rename = "text-embedding-ada-002")]
42    Ada002,
43    #[serde(rename = "text-embedding-3-small")]
44    ThreeSmall,
45    #[serde(rename = "text-embedding-3-large")]
46    ThreeLarge,
47}
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
49#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
50#[derive(gproxy_protocol_macros::DeclaredFields)]
51#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
52pub enum EmbeddingEncodingFormat {
53    #[serde(rename = "float")]
54    Float,
55    #[serde(rename = "base64")]
56    Base64,
57}
58#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
59#[serde(rename_all = "snake_case")]
60#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
61#[derive(gproxy_protocol_macros::DeclaredFields)]
62#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
63pub struct CreateEmbeddingResponseBody {
64    pub data: Vec<OpenAiEmbedding>,
65    pub model: String,
66    #[serde(rename = "object")]
67    pub object_: EmbeddingListObject,
68    pub usage: EmbeddingUsage,
69    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
70    pub rest: Rest,
71}
72pub type CreateEmbeddingResponse = WireResponse<CreateEmbeddingResponseBody>;
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
74#[serde(rename_all = "snake_case")]
75#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
76#[derive(gproxy_protocol_macros::DeclaredFields)]
77#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
78pub struct OpenAiEmbedding {
79    pub embedding: EmbeddingVector,
80    pub index: i64,
81    #[serde(rename = "object")]
82    pub object_: EmbeddingObject,
83    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
84    pub rest: Rest,
85}
86#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87#[serde(untagged)]
88#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
89#[derive(gproxy_protocol_macros::DeclaredFields)]
90#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
91pub enum EmbeddingVector {
92    Floats(Vec<serde_json::Number>),
93    Base64(String),
94}
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97#[derive(gproxy_protocol_macros::DeclaredFields)]
98#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
99pub enum EmbeddingObject {
100    #[serde(rename = "embedding")]
101    Embedding,
102}
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
104#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
105#[derive(gproxy_protocol_macros::DeclaredFields)]
106#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
107pub enum EmbeddingListObject {
108    #[serde(rename = "list")]
109    List,
110}
111#[derive(
112    Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
113)]
114#[serde(rename_all = "snake_case")]
115#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
116#[derive(gproxy_protocol_macros::DeclaredFields)]
117#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
118pub struct EmbeddingUsage {
119    pub prompt_tokens: i64,
120    pub total_tokens: i64,
121    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
122    pub rest: Rest,
123}