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