Skip to main content

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

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