gproxy_transform/transform/images/edit/
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::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}