Skip to main content

gproxy_transform/transform/images/edit/
gemini_to_openai.rs

1//! Gemini -> OpenAI edit-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::ImageEditRequest, TransformError> {
12    let images = common::gemini_request_image_references(&input);
13    if images.is_empty() {
14        return Err(TransformError::InvalidInput {
15            reason: "Gemini edit-image request did not contain image parts".to_owned(),
16        });
17    }
18
19    Ok(crate::protocol::wire!(openai::ImageEditRequest {
20        images,
21        prompt: common::gemini_request_prompt(&input),
22        background: None,
23        input_fidelity: None,
24        mask: None,
25        model: input.model.map(Into::into),
26        moderation: None,
27        n: input
28            .generation_config
29            .as_ref()
30            .and_then(|config| config.candidate_count)
31            .and_then(common::positive_i32_to_u32),
32        output_compression: None,
33        output_format: common::gemini_output_format(input.generation_config.as_ref()),
34        partial_images: None,
35        quality: None,
36        size: common::gemini_to_openai_edit_size(input.generation_config.as_ref()),
37        stream: None,
38        user: None,
39        extra: Default::default(),
40    }))
41}
42
43pub fn response(
44    input: gemini::GenerateContentResponse,
45    _: &TransformContext,
46) -> Result<openai::ImagesResponse, TransformError> {
47    Ok(common::gemini_response_to_openai_images(input))
48}
49
50pub fn stream_event(
51    input: gemini::GenerateContentResponse,
52    _: &TransformContext,
53) -> Result<openai::ImageEditStreamEvent, TransformError> {
54    common::gemini_to_openai_edit_stream(input).ok_or_else(|| TransformError::InvalidInput {
55        reason: "Gemini image stream chunk did not contain an inline image".to_owned(),
56    })
57}