Skip to main content

gproxy_protocol/transform/openai/generate_content/openai_response/gemini/
request.rs

1use crate::gemini::count_tokens::types as gt;
2use crate::gemini::generate_content::request::{
3    GeminiGenerateContentRequest, PathParameters, QueryParameters, RequestBody, RequestHeaders,
4};
5use crate::gemini::generate_content::types::HttpMethod as GeminiHttpMethod;
6use crate::openai::create_response::request::OpenAiCreateResponseRequest;
7use crate::transform::gemini::model_get::utils::ensure_models_prefix;
8use crate::transform::openai::count_tokens::gemini::utils::{
9    openai_generation_config, openai_input_items_to_gemini_contents, openai_tool_choice_to_gemini,
10    openai_tools_to_gemini,
11};
12use crate::transform::openai::count_tokens::utils::openai_input_to_items;
13use crate::transform::utils::TransformError;
14
15impl TryFrom<OpenAiCreateResponseRequest> for GeminiGenerateContentRequest {
16    type Error = TransformError;
17
18    fn try_from(value: OpenAiCreateResponseRequest) -> Result<Self, TransformError> {
19        let body = value.body;
20        let model = ensure_models_prefix(&body.model.unwrap_or_default());
21
22        let contents = openai_input_items_to_gemini_contents(openai_input_to_items(body.input));
23
24        let (tools, has_function_calling_tools) = body
25            .tools
26            .map(openai_tools_to_gemini)
27            .unwrap_or((None, false));
28
29        let tool_config =
30            openai_tool_choice_to_gemini(body.tool_choice, has_function_calling_tools);
31        let generation_config = openai_generation_config(
32            body.reasoning,
33            body.text,
34            body.max_output_tokens,
35            body.temperature,
36            body.top_p,
37            body.top_logprobs,
38        );
39        let system_instruction = body.instructions.and_then(|text| {
40            if text.is_empty() {
41                None
42            } else {
43                Some(gt::GeminiContent {
44                    parts: vec![gt::GeminiPart {
45                        text: Some(text),
46                        ..gt::GeminiPart::default()
47                    }],
48                    role: None,
49                })
50            }
51        });
52
53        Ok(GeminiGenerateContentRequest {
54            method: GeminiHttpMethod::Post,
55            path: PathParameters { model },
56            query: QueryParameters::default(),
57            headers: RequestHeaders::default(),
58            body: RequestBody {
59                contents,
60                tools,
61                tool_config,
62                safety_settings: None,
63                system_instruction,
64                generation_config,
65                cached_content: None,
66                store: None,
67            },
68        })
69    }
70}