From 0c9a16ba1a7856a39aeea021d70e1c3b5f432616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 5 Oct 2026 12:01:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(AGC=E6=A8=A1=E5=9E=8B):=20?= =?UTF-8?q?=E6=9C=AA=E7=9F=A5=E6=9D=83=E9=99=90=E6=A1=A3=E5=8F=8D=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=A4=B1=E8=B4=A5=E5=BC=80=E6=94=BE=E4=B8=BA?= =?UTF-8?q?=20basic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AgcModelAccess 将 Basic 放到最后一个变体并加 #[serde(other)],未知 access 不再让整份目录解析失败 - 补充未知 access 反序列化回退 Basic 的单测 --- .../module-runtime/src/agc_model_access.rs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) 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);