Skip to main content

gproxy_transform/transform/embeddings/batch/
gemini_to_openai.rs

1//! Gemini -> OpenAI batch embedding transforms.
2
3use 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}