From 009c506df9e770620d7ec9e4c4e3b9686e4ec7eb Mon Sep 17 00:00:00 2001 From: panzeyu2013 <1971614652@qq.com> Date: Thu, 11 Jun 2026 15:22:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=98=BB=E6=AD=A2=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A8=A1=E5=9E=8B=E5=90=8E=E8=A2=AB=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=8B=89=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除模型后 reloadManagedCatalog(false) 在缓存为空时会穿透到远端拉取, 导致刚删除的模型被重新并入目录。同时 auto_associate_source_models 在路由读取时会自动重建已删除的模型条目。 三处修复: 1. read_managed_model_catalog: refresh_remote=false 时始终返回缓存 2. delete_model_catalog_entry: 删除时设置 unlinked 偏好阻止自动关联重建 3. read_account_pool_platform_catalog: 仅首次初始化时远端拉取,已初始化过的空目录不再穿透 --- crates/service/src/apikey/apikey_models.rs | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/service/src/apikey/apikey_models.rs b/crates/service/src/apikey/apikey_models.rs index 23ab00c01..8d913c2b2 100644 --- a/crates/service/src/apikey/apikey_models.rs +++ b/crates/service/src/apikey/apikey_models.rs @@ -74,7 +74,7 @@ pub(crate) fn read_managed_model_catalog( storage_helpers::open_storage().ok_or_else(|| "storage unavailable".to_string())?; let cached_catalog = read_managed_model_catalog_from_storage(&storage)?; let cached = managed_catalog_to_models_response(&cached_catalog); - if !refresh_remote && !cached.is_empty() { + if !refresh_remote { return Ok(cached_catalog); } @@ -864,11 +864,16 @@ fn read_account_pool_platform_catalog( } if allow_remote_catalog_fetch { - if let Ok(models) = gateway::fetch_models_for_picker() { - let catalog = merge_managed_model_catalog(cached_catalog.clone(), models); - if !catalog.items.is_empty() { - save_managed_model_catalog_with_storage(storage, &catalog)?; - return Ok(catalog); + let scope_record = storage + .get_model_catalog_scope(MODEL_CACHE_SCOPE_DEFAULT) + .map_err(|e| e.to_string())?; + if scope_record.is_none() { + if let Ok(models) = gateway::fetch_models_for_picker() { + let catalog = merge_managed_model_catalog(cached_catalog.clone(), models); + if !catalog.items.is_empty() { + save_managed_model_catalog_with_storage(storage, &catalog)?; + return Ok(catalog); + } } } } @@ -1794,6 +1799,16 @@ fn replace_model_catalog_entry( } fn delete_model_catalog_entry(storage: &Storage, slug: &str) -> Result<(), String> { + if let Ok(mappings) = storage.list_model_source_mappings(Some(slug)) { + for mapping in &mappings { + let _ = storage.upsert_model_source_mapping_preference( + &mapping.source_kind, + &mapping.source_id, + &mapping.upstream_model, + "unlinked", + ); + } + } storage .delete_model_group_model_references(slug) .map_err(|e| e.to_string())?;