gproxy_protocol/transform/gemini/count_tokens/claude/
request.rs1use 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}