修复(AGC模型): 未知权限档反序列化失败开放为 basic

- AgcModelAccess 将 Basic 放到最后一个变体并加 #[serde(other)],未知 access 不再让整份目录解析失败
- 补充未知 access 反序列化回退 Basic 的单测
This commit is contained in:
2026-10-05 12:01:12 +08:00
parent d3f02d6bc9
commit 0c9a16ba1a
@@ -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);