Skip to main content

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

1use crate::claude::model_list::response::ClaudeModelListResponse;
2use crate::gemini::model_list::response::{
3    GeminiModelListResponse, ResponseBody as GeminiModelListResponseBody,
4};
5use crate::gemini::types::GeminiResponseHeaders;
6use crate::transform::gemini::model_list::claude::utils::{
7    gemini_error_response_from_claude, gemini_model_info_from_claude_model,
8};
9use crate::transform::utils::TransformError;
10
11impl TryFrom<ClaudeModelListResponse> for GeminiModelListResponse {
12    type Error = TransformError;
13
14    fn try_from(value: ClaudeModelListResponse) -> Result<Self, TransformError> {
15        Ok(match value {
16            ClaudeModelListResponse::Success {
17                stats_code,
18                headers,
19                body,
20            } => {
21                let next_page_token = if body.has_more && !body.last_id.is_empty() {
22                    Some(body.last_id.clone())
23                } else {
24                    None
25                };
26
27                GeminiModelListResponse::Success {
28                    stats_code,
29                    headers: GeminiResponseHeaders {
30                        extra: headers.extra,
31                    },
32                    body: GeminiModelListResponseBody {
33                        models: body
34                            .data
35                            .into_iter()
36                            .map(gemini_model_info_from_claude_model)
37                            .collect::<Vec<_>>(),
38                        next_page_token,
39                    },
40                }
41            }
42            ClaudeModelListResponse::Error {
43                stats_code,
44                headers,
45                body,
46            } => GeminiModelListResponse::Error {
47                stats_code,
48                headers: GeminiResponseHeaders {
49                    extra: headers.extra,
50                },
51                body: gemini_error_response_from_claude(stats_code, body),
52            },
53        })
54    }
55}