gproxy_protocol/transform/gemini/embeddings/openai/
request.rs1use 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}