Skip to main content

gproxy_transform/transform/images/create/
gemini_to_openai.rs

1//! Gemini -> OpenAI create-image transforms.
2
3use crate::protocol::{gemini, openai};
4use crate::transform::{TransformContext, TransformError};
5
6use super::super::common;
7
8pub fn request(
9    input: gemini::GenerateContentRequest,
10    _: &TransformContext,
11) -> Result<openai::ImageGenerationRequest, TransformError> {
12    Ok(crate::protocol::wire!(openai::ImageGenerationRequest {
13        prompt: common::gemini_request_prompt(&input),
14        background: None,
15        model: input.model.map(Into::into),
16        moderation: None,
17        n: input
18            .generation_config
19            .as_ref()
20            .and_then(|config| config.candidate_count)
21            .and_then(common::positive_i32_to_u32),
22        output_compression: None,
23        output_format: common::gemini_output_format(input.generation_config.as_ref()),
24        partial_images: None,
25        quality: None,
26        response_format: common::gemini_response_format(input.generation_config.as_ref()),
27        size: common::gemini_to_openai_create_size(input.generation_config.as_ref()),
28        stream: None,
29        style: None,
30        user: None,
31        extra: Default::default(),
32    }))
33}
34
35pub fn response(
36    input: gemini::GenerateContentResponse,
37    _: &TransformContext,
38) -> Result<openai::ImagesResponse, TransformError> {
39    Ok(common::gemini_response_to_openai_images(input))
40}
41
42pub fn stream_event(
43    input: gemini::GenerateContentResponse,
44    _: &TransformContext,
45) -> Result<openai::ImageGenerationStreamEvent, TransformError> {
46    common::gemini_to_openai_generation_stream(input).ok_or_else(|| TransformError::InvalidInput {
47        reason: "Gemini image stream chunk did not contain an inline image".to_owned(),
48    })
49}