From 85decd74871eb6acb6a701e7c426d3d15949f4e2 Mon Sep 17 00:00:00 2001 From: fawney19 Date: Tue, 13 Jan 2026 16:04:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20GlobalModel=20?= =?UTF-8?q?=E5=88=AB=E5=90=8D=E5=8C=B9=E9=85=8D=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要更改: - GlobalModel 支持 model_aliases 配置,允许使用正则表达式定义别名规则 - Provider Key 的 allowed_models 现在可以通过别名规则匹配 GlobalModel - 新增 ModelAliasesTab 组件用于管理模型别名配置 - Provider 详情页新增别名映射预览功能,展示 Key 白名单与 GlobalModel 别名的匹配关系 - 路由预览 API 返回 Key 的 allowed_models 信息 安全特性: - 使用 regex 库的原生超时保护(100ms)防止 ReDoS 攻击 - 别名规则数量限制(50 条/模型)和长度限制(200 字符) - 别名映射预览 API 添加超时保护和结果截断 其他改进: - GlobalModel 更新/删除时使用行级锁防止并发竞态 - 缓存失效逻辑优化,支持异步清理和正则缓存清空 - 路由 Tab 布局重构,使用 flexbox 替代绝对定位 --- frontend/src/api/endpoints/providers.ts | 47 + frontend/src/api/endpoints/types.ts | 1 + .../models/components/ModelAliasesTab.vue | 523 +++ .../models/components/ModelDetailDrawer.vue | 32 + .../features/models/components/RoutingTab.vue | 383 +- .../src/features/models/components/index.ts | 1 + .../components/ProviderDetailDrawer.vue | 233 +- .../features/providers/components/index.ts | 2 - .../components/provider-tabs/ModelsTab.vue | 17 +- pyproject.toml | 1 + src/api/admin/models/global_models.py | 95 +- src/api/admin/models/routing.py | 19 + src/api/admin/providers/routes.py | 306 +- src/api/handlers/base/chat_handler_base.py | 29 +- src/api/handlers/base/cli_handler_base.py | 44 +- src/api/public/system_catalog.py | 2 +- src/core/model_permissions.py | 305 +- src/services/cache/aware_scheduler.py | 64 +- src/services/cache/invalidation.py | 61 +- src/services/request/executor.py | 2 +- uv.lock | 3986 +++++++++-------- 21 files changed, 3845 insertions(+), 2308 deletions(-) create mode 100644 frontend/src/features/models/components/ModelAliasesTab.vue diff --git a/frontend/src/api/endpoints/providers.ts b/frontend/src/api/endpoints/providers.ts index d4ebfe9..4eeeb84 100644 --- a/frontend/src/api/endpoints/providers.ts +++ b/frontend/src/api/endpoints/providers.ts @@ -95,3 +95,50 @@ export async function testModel(data: TestModelRequest): Promise { + const response = await client.get(`/api/admin/providers/${providerId}/alias-mapping-preview`) + return response.data +} diff --git a/frontend/src/api/endpoints/types.ts b/frontend/src/api/endpoints/types.ts index c318766..a8d49e8 100644 --- a/frontend/src/api/endpoints/types.ts +++ b/frontend/src/api/endpoints/types.ts @@ -641,6 +641,7 @@ export interface RoutingKeyInfo { health_score: number is_active: boolean api_formats: string[] + allowed_models?: string[] | null // 允许的模型列表,null 表示不限制 circuit_breaker_open: boolean circuit_breaker_formats: string[] } diff --git a/frontend/src/features/models/components/ModelAliasesTab.vue b/frontend/src/features/models/components/ModelAliasesTab.vue new file mode 100644 index 0000000..88c4e0e --- /dev/null +++ b/frontend/src/features/models/components/ModelAliasesTab.vue @@ -0,0 +1,523 @@ + + + diff --git a/frontend/src/features/models/components/ModelDetailDrawer.vue b/frontend/src/features/models/components/ModelDetailDrawer.vue index 666e555..1e703ef 100644 --- a/frontend/src/features/models/components/ModelDetailDrawer.vue +++ b/frontend/src/features/models/components/ModelDetailDrawer.vue @@ -104,6 +104,19 @@ 链路 + @@ -419,6 +432,17 @@ @delete-provider="handleDeleteProviderFromRouting" /> + + +
+ +
@@ -456,6 +480,7 @@ import TableRow from '@/components/ui/table-row.vue' import TableHead from '@/components/ui/table-head.vue' import TableCell from '@/components/ui/table-cell.vue' import RoutingTab from './RoutingTab.vue' +import ModelAliasesTab from './ModelAliasesTab.vue' // 使用外部类型定义 import type { GlobalModelResponse } from '@/api/global-models' @@ -518,6 +543,13 @@ function refreshRoutingData() { routingTabRef.value?.loadRoutingData?.() } +// 处理模型别名更新 +function handleAliasesUpdate(_aliases: string[]) { + // 别名已在 ModelAliasesTab 内部保存到服务器 + // 刷新路由数据以反映可能的候选变化 + refreshRoutingData() +} + // 暴露刷新方法给父组件 defineExpose({ refreshRoutingData diff --git a/frontend/src/features/models/components/RoutingTab.vue b/frontend/src/features/models/components/RoutingTab.vue index ce948f4..00e82bf 100644 --- a/frontend/src/features/models/components/RoutingTab.vue +++ b/frontend/src/features/models/components/RoutingTab.vue @@ -76,21 +76,19 @@ >
-
+
{{ formatGroup.api_format }} - + {{ formatGroup.active_keys }}/{{ formatGroup.total_keys }} Keys - - · - + · {{ formatGroup.active_providers }}/{{ formatGroup.total_providers }} 提供商
@@ -105,203 +103,220 @@
@@ -485,7 +574,6 @@