Skip to main content

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

1use crate::claude::count_tokens::response::ClaudeCountTokensResponse;
2use crate::gemini::count_tokens::response::{GeminiCountTokensResponse, ResponseBody};
3use crate::gemini::count_tokens::types::{GeminiModality, GeminiModalityTokenCount};
4use crate::gemini::types::GeminiResponseHeaders;
5use crate::transform::gemini::count_tokens::claude::utils::gemini_error_response_from_claude;
6use crate::transform::utils::TransformError;
7
8impl TryFrom<ClaudeCountTokensResponse> for GeminiCountTokensResponse {
9    type Error = TransformError;
10
11    fn try_from(value: ClaudeCountTokensResponse) -> Result<Self, TransformError> {
12        Ok(match value {
13            ClaudeCountTokensResponse::Success {
14                stats_code,
15                headers,
16                body,
17            } => {
18                let total_tokens = body.input_tokens;
19
20                GeminiCountTokensResponse::Success {
21                    stats_code,
22                    headers: GeminiResponseHeaders {
23                        extra: headers.extra,
24                    },
25                    body: ResponseBody {
26                        total_tokens,
27                        cached_content_token_count: None,
28                        prompt_tokens_details: Some(vec![GeminiModalityTokenCount {
29                            modality: GeminiModality::Text,
30                            token_count: total_tokens,
31                        }]),
32                        cache_tokens_details: None,
33                    },
34                }
35            }
36            ClaudeCountTokensResponse::Error {
37                stats_code,
38                headers,
39                body,
40            } => GeminiCountTokensResponse::Error {
41                stats_code,
42                headers: GeminiResponseHeaders {
43                    extra: headers.extra,
44                },
45                body: gemini_error_response_from_claude(stats_code, body),
46            },
47        })
48    }
49}