Skip to main content

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

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