Skip to main content

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

1use http::StatusCode;
2use time::OffsetDateTime;
3
4use crate::claude::types::{BetaErrorResponse, BetaModelInfo, BetaModelType};
5use crate::gemini::types::{GeminiApiErrorResponse, GeminiModelInfo};
6use crate::transform::claude::utils::beta_error_response_from_status_message;
7
8pub fn strip_models_prefix(value: &str) -> String {
9    value.strip_prefix("models/").unwrap_or(value).to_string()
10}
11
12pub fn ensure_models_prefix(value: &str) -> String {
13    if value.starts_with("models/") {
14        value.to_string()
15    } else {
16        format!("models/{value}")
17    }
18}
19
20pub fn beta_model_info_from_gemini_model(model: GeminiModelInfo) -> BetaModelInfo {
21    let id = model
22        .base_model_id
23        .as_deref()
24        .map(str::trim)
25        .filter(|value| !value.is_empty())
26        .map(ToOwned::to_owned)
27        .unwrap_or_else(|| strip_models_prefix(&model.name));
28    BetaModelInfo {
29        id: id.clone(),
30        created_at: OffsetDateTime::UNIX_EPOCH,
31        display_name: model.display_name.unwrap_or_else(|| id.clone()),
32        max_input_tokens: model.input_token_limit,
33        max_tokens: model.output_token_limit,
34        capabilities: None,
35        type_: BetaModelType::Model,
36    }
37}
38
39pub fn beta_error_response_from_gemini(
40    status_code: StatusCode,
41    body: GeminiApiErrorResponse,
42) -> BetaErrorResponse {
43    beta_error_response_from_status_message(status_code, body.error.message)
44}