gproxy_transform/transform/embeddings/batch/
gemini_to_openai.rs1use crate::protocol::{gemini, openai};
4use crate::transform::{TransformContext, TransformError};
5
6use super::super::common;
7
8pub fn request(
9 input: gemini::BatchEmbedContentsRequest,
10 _: &TransformContext,
11) -> Result<openai::EmbeddingRequest, TransformError> {
12 let requests = input.requests;
13 let mut inputs = Vec::with_capacity(requests.len());
14 let mut model = None;
15 let mut dimensions = None;
16
17 for request in requests {
18 let converted = common::gemini_request_parts(request);
19 inputs.push(converted.text);
20 common::merge_model(&mut model, converted.model);
21 common::merge_dimensions(&mut dimensions, converted.dimensions);
22 }
23
24 Ok(crate::protocol::wire!(openai::EmbeddingRequest {
25 input: common::strings_to_openai_input(inputs),
26 model: model
27 .unwrap_or_else(|| common::DEFAULT_OPENAI_EMBEDDING_MODEL.to_owned())
28 .into(),
29 dimensions,
30 encoding_format: Some(openai::EmbeddingEncodingFormat::Float),
31 user: None,
32 extra: Default::default(),
33 }))
34}
35
36pub fn response(
37 input: gemini::BatchEmbedContentsResponse,
38 _: &TransformContext,
39) -> Result<openai::EmbeddingResponse, TransformError> {
40 Ok(crate::protocol::wire!(openai::EmbeddingResponse {
41 data: input
42 .embeddings
43 .into_iter()
44 .enumerate()
45 .map(|(index, embedding)| common::gemini_to_openai_embedding(embedding, index))
46 .collect(),
47 model: common::DEFAULT_OPENAI_EMBEDDING_MODEL.to_owned().into(),
48 object: openai::ListObjectType::List,
49 usage: common::gemini_to_openai_usage(input.usage_metadata),
50 extra: Default::default(),
51 }))
52}