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