diff --git a/server-rs/crates/module-runtime/src/agc_model_access.rs b/server-rs/crates/module-runtime/src/agc_model_access.rs index bf74ee07c..67c0109b7 100644 --- a/server-rs/crates/module-runtime/src/agc_model_access.rs +++ b/server-rs/crates/module-runtime/src/agc_model_access.rs @@ -23,13 +23,16 @@ pub const MODEL_NOT_AVAILABLE_FOR_PLAN: &str = "MODEL_NOT_AVAILABLE_FOR_PLAN"; /// 单个模型要求的权限档。 /// /// 缺省 `Basic`(失败开放):存量目录 JSON 缺该字段、后台未人工标注都按基础档处理, -/// 只有被后台明确标成 `Full` 的模型才会对 `Basic` 档账号产生拦截。 +/// 只有被后台明确标成 `Full` 的模型才会对 `Basic` 档账号产生拦截。未知取值同样 +/// 失败开放到 `Basic`(`#[serde(other)]`),避免将来新增档位时旧服务端整份目录解析失败、 +/// 静默回退到上游目录而丢掉人工标注。 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum AgcModelAccess { - #[default] - Basic, Full, + #[default] + #[serde(other)] + Basic, } impl AgcModelAccess { @@ -246,6 +249,17 @@ mod tests { assert_eq!(catalog.models[0].access, AgcModelAccess::Basic); } + #[test] + fn unknown_catalog_json_access_fails_open_to_basic() { + // 中文注释:未知 access 取值(例如将来新增档位)不能让整份目录解析失败、 + // 静默回退上游目录,应失败开放到 Basic。 + let catalog: AgcModelCatalog = serde_json::from_str( + r#"{"revision":1,"defaultModelId":"model-a","models":[{"id":"model-a","alias":"model-a","modelId":"model-a","enabled":true,"agentMode":"codex","access":"premium"}]}"#, + ) + .expect("未知 access 应失败开放到 Basic"); + assert_eq!(catalog.models[0].access, AgcModelAccess::Basic); + } + #[test] fn basic_plan_does_not_see_full_models_and_gets_first_basic_default() { let mut catalog = catalog_from_ids(&["model-a", "model-b", "model-c"], 1);