Skip to main content

gproxy_protocol/transform/gemini/embeddings/openai/
request.rs

1use crate::gemini::embeddings::request::GeminiEmbedContentRequest;
2use crate::openai::embeddings::request::{
3    OpenAiEmbeddingsRequest, PathParameters, QueryParameters, RequestBody, RequestHeaders,
4};
5use crate::openai::embeddings::types::{HttpMethod, OpenAiEmbeddingInput, OpenAiEmbeddingModel};
6use crate::transform::utils::TransformError;
7
8impl TryFrom<GeminiEmbedContentRequest> for OpenAiEmbeddingsRequest {
9    type Error = TransformError;
10
11    fn try_from(value: GeminiEmbedContentRequest) -> Result<Self, TransformError> {
12        let mut input_texts = Vec::new();
13        for part in value.body.content.parts {
14            if let Some(text) = part.text
15                && !text.is_empty()
16            {
17                input_texts.push(text);
18            }
19        }
20
21        let input = match input_texts.len() {
22            0 => OpenAiEmbeddingInput::String(String::new()),
23            1 => OpenAiEmbeddingInput::String(input_texts.remove(0)),
24            _ => OpenAiEmbeddingInput::StringArray(input_texts),
25        };
26
27        let raw_model = value
28            .path
29            .model
30            .strip_prefix("models/")
31            .unwrap_or(value.path.model.as_str())
32            .to_string();
33
34        let model = match raw_model.as_str() {
35            "text-embedding-ada-002" => OpenAiEmbeddingModel::Known(
36                crate::openai::embeddings::types::OpenAiEmbeddingModelKnown::TextEmbeddingAda002,
37            ),
38            "text-embedding-3-small" => OpenAiEmbeddingModel::Known(
39                crate::openai::embeddings::types::OpenAiEmbeddingModelKnown::TextEmbedding3Small,
40            ),
41            "text-embedding-3-large" => OpenAiEmbeddingModel::Known(
42                crate::openai::embeddings::types::OpenAiEmbeddingModelKnown::TextEmbedding3Large,
43            ),
44            _ => OpenAiEmbeddingModel::Custom(raw_model),
45        };
46
47        Ok(Self {
48            method: HttpMethod::Post,
49            path: PathParameters::default(),
50            query: QueryParameters::default(),
51            headers: RequestHeaders::default(),
52            body: RequestBody {
53                input,
54                model,
55                dimensions: value.body.output_dimensionality,
56                encoding_format: None,
57                user: None,
58            },
59        })
60    }
61}