fix(admin): 补齐 key 自动获取模型的即时刷新场景

- 新增 key 且开启自动获取时立即抓取并写回 allowed_models
- 自动获取已开启时修改包含/排除规则后立即刷新 allowed_models
- 补充创建与过滤规则变更场景的控制层回归测试
This commit is contained in:
AAEE86
2026-04-14 14:33:02 +08:00
parent 861ae81ff0
commit d089ed22c7
3 changed files with 355 additions and 3 deletions

View File

@@ -1,7 +1,7 @@
use crate::handlers::admin::provider::shared::paths::admin_provider_id_for_keys;
use crate::handlers::admin::provider::shared::payloads::AdminProviderKeyCreateRequest;
use crate::handlers::admin::request::{AdminAppState, AdminRequestContext};
use crate::GatewayError;
use crate::{model_fetch::perform_model_fetch_for_key, GatewayError};
use axum::{
body::{Body, Bytes},
http,
@@ -63,6 +63,32 @@ pub(super) async fn maybe_handle(
let Some(created) = state.create_provider_catalog_key(&record).await? else {
return Ok(None);
};
let key_id = created.id.clone();
let created = if created.auto_fetch_models {
let summary =
perform_model_fetch_for_key(state.as_ref(), &provider.id, &created.id).await?;
if summary.succeeded == 0 {
let detail = state
.read_provider_catalog_keys_by_ids(std::slice::from_ref(&key_id))
.await?
.into_iter()
.next()
.and_then(|key| key.last_models_fetch_error)
.unwrap_or_else(|| "未获取到可用上游模型".to_string());
return Err(GatewayError::Internal(format!(
"开启自动获取模型后同步上游模型失败: {detail}"
)));
}
state
.read_provider_catalog_keys_by_ids(std::slice::from_ref(&key_id))
.await?
.into_iter()
.next()
.unwrap_or(created)
} else {
created
};
let now_unix_secs = SystemTime::now()
.duration_since(UNIX_EPOCH)
.ok()

View File

@@ -81,8 +81,12 @@ pub(super) async fn maybe_handle(
let Some(updated) = state.update_provider_catalog_key(&updated_record).await? else {
return Ok(None);
};
let should_overwrite_allowed_models_immediately =
!existing_key.auto_fetch_models && updated.auto_fetch_models;
let auto_fetch_filters_changed = existing_key.model_include_patterns
!= updated.model_include_patterns
|| existing_key.model_exclude_patterns != updated.model_exclude_patterns;
// 自动获取开启后,调整过滤规则也要立即刷新 allowed_models。
let should_overwrite_allowed_models_immediately = updated.auto_fetch_models
&& (!existing_key.auto_fetch_models || auto_fetch_filters_changed);
let updated = if should_overwrite_allowed_models_immediately {
let summary =
perform_model_fetch_for_key(state.as_ref(), &provider.id, &updated.id).await?;