Skip to main content

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

1use crate::claude::count_tokens::request::{
2    ClaudeCountTokensRequest, PathParameters, QueryParameters, RequestBody, RequestHeaders,
3};
4use crate::claude::count_tokens::types::{HttpMethod, Model};
5use crate::gemini::count_tokens::request::GeminiCountTokensRequest;
6use crate::transform::gemini::utils::{
7    claude_output_config_from_effort_and_format,
8    claude_thinking_effort_format_from_gemini_generation_config,
9    gemini_contents_to_claude_messages, gemini_system_instruction_to_claude,
10    gemini_tool_choice_to_claude, gemini_tools_to_claude, strip_models_prefix,
11};
12use crate::transform::utils::TransformError;
13
14impl TryFrom<GeminiCountTokensRequest> for ClaudeCountTokensRequest {
15    type Error = TransformError;
16
17    fn try_from(value: GeminiCountTokensRequest) -> Result<Self, TransformError> {
18        let (model_name, contents, tools, tool_config, system_instruction, generation_config) =
19            if let Some(generate_content_request) = value.body.generate_content_request {
20                (
21                    generate_content_request.model,
22                    generate_content_request.contents,
23                    generate_content_request.tools,
24                    generate_content_request.tool_config,
25                    generate_content_request.system_instruction,
26                    generate_content_request.generation_config,
27                )
28            } else {
29                (
30                    value.path.model,
31                    value.body.contents.unwrap_or_default(),
32                    None,
33                    None,
34                    None,
35                    None,
36                )
37            };
38
39        let model = Model::Custom(strip_models_prefix(&model_name));
40        let messages = gemini_contents_to_claude_messages(contents);
41        let system = gemini_system_instruction_to_claude(system_instruction);
42        let tool_choice = gemini_tool_choice_to_claude(tool_config);
43        let tools = gemini_tools_to_claude(tools);
44
45        let (thinking, output_effort, output_format) =
46            claude_thinking_effort_format_from_gemini_generation_config(
47                generation_config.as_ref(),
48                Some(&model),
49            );
50        let output_config =
51            claude_output_config_from_effort_and_format(output_effort, output_format.clone());
52
53        Ok(ClaudeCountTokensRequest {
54            method: HttpMethod::Post,
55            path: PathParameters::default(),
56            query: QueryParameters::default(),
57            headers: RequestHeaders::default(),
58            body: RequestBody {
59                messages,
60                model,
61                context_management: None,
62                mcp_servers: None,
63                cache_control: None,
64                output_config,
65                speed: None,
66                system,
67                thinking,
68                tool_choice,
69                tools,
70            },
71        })
72    }
73}