Skip to main content

gproxy_protocol/transform/openai/compact/gemini/
request.rs

1use crate::gemini::count_tokens::types as gt;
2use crate::gemini::generate_content::request::GeminiGenerateContentRequest;
3use crate::gemini::generate_content::request::{
4    PathParameters, QueryParameters, RequestBody, RequestHeaders,
5};
6use crate::openai::compact_response::request::OpenAiCompactRequest;
7use crate::transform::gemini::model_get::utils::ensure_models_prefix;
8use crate::transform::openai::compact::utils::{
9    COMPACT_MAX_OUTPUT_TOKENS, compact_system_instruction,
10};
11use crate::transform::openai::count_tokens::gemini::utils::{
12    openai_generation_config, openai_input_items_to_gemini_contents,
13};
14use crate::transform::openai::count_tokens::utils::openai_input_to_items;
15use crate::transform::utils::TransformError;
16
17impl TryFrom<OpenAiCompactRequest> for GeminiGenerateContentRequest {
18    type Error = TransformError;
19
20    fn try_from(value: OpenAiCompactRequest) -> Result<Self, TransformError> {
21        let body = value.body;
22        let contents = openai_input_items_to_gemini_contents(openai_input_to_items(body.input));
23
24        Ok(GeminiGenerateContentRequest {
25            method: gt::HttpMethod::Post,
26            path: PathParameters {
27                model: ensure_models_prefix(&body.model),
28            },
29            query: QueryParameters::default(),
30            headers: RequestHeaders::default(),
31            body: RequestBody {
32                contents,
33                tools: None,
34                tool_config: None,
35                safety_settings: None,
36                system_instruction: Some(gt::GeminiContent {
37                    parts: vec![gt::GeminiPart {
38                        text: Some(compact_system_instruction(body.instructions)),
39                        ..gt::GeminiPart::default()
40                    }],
41                    role: None,
42                }),
43                generation_config: openai_generation_config(
44                    None,
45                    None,
46                    Some(COMPACT_MAX_OUTPUT_TOKENS),
47                    None,
48                    None,
49                    None,
50                ),
51                cached_content: None,
52                store: None,
53            },
54        })
55    }
56}