use serde::{Deserialize, Serialize}; use crate::{app::constant::COMMA, chat::constant::AVAILABLE_MODELS}; #[derive(Deserialize)] pub struct BuildKeyRequest { pub auth_token: String, #[serde(default)] pub disable_vision: Option, #[serde(default)] pub enable_slow_pool: Option, #[serde(default)] pub usage_check_models: Option, #[serde(default)] pub include_web_references: Option, } pub struct UsageCheckModelConfig { pub model_type: UsageCheckModelType, pub model_ids: Vec<&'static str>, } impl<'de> Deserialize<'de> for UsageCheckModelConfig { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { #[derive(Deserialize)] struct Helper { #[serde(rename = "type")] model_type: UsageCheckModelType, #[serde(default)] model_ids: String, } let helper = Helper::deserialize(deserializer)?; let model_ids = if helper.model_ids.is_empty() { Vec::new() } else { helper .model_ids .split(COMMA) .filter_map(|model| { let model = model.trim(); AVAILABLE_MODELS .iter() .find(|m| m.id == model) .map(|m| m.id) }) .collect() }; Ok(UsageCheckModelConfig { model_type: helper.model_type, model_ids, }) } } #[derive(Deserialize)] #[serde(rename_all = "lowercase")] pub enum UsageCheckModelType { Default, Disabled, All, Custom, } #[derive(Serialize)] #[serde(rename_all = "lowercase")] pub enum BuildKeyResponse { Key(String), Error(String), }