feat: Provider 异步删除、可配置密码策略、Hub 超时优化及多项改进

- 新增 Provider 异步删除任务系统,后台分阶段删除子资源并清理残留引用
- 新增可配置密码策略等级(weak/medium/strong),支持系统设置面板调整
- aether-hub 升级至 0.1.4,idle timeout 支持禁用(设为 0),worker 默认超时调整为 120s
- OAuth 手动续期增加 Redis 分布式锁,防止并发刷新冲突
- ProxyNode 心跳检测改为 asyncio.to_thread,避免阻塞事件循环
- 删除 ModelMultiSelect 和 useInvalidModels,MultiSelect 组件通用化
- 明确 allowed_providers/allowed_api_formats 的 NULL 与空数组语义
- 前端 StandaloneKeyFormDialog、UserFormDialog 等多处 UI 优化
- 新增 Alembic 迁移脚本清理 Provider 删除后的残留引用
- 补充相关测试用例
This commit is contained in:
fawney19
2026-03-12 01:11:35 +08:00
parent 0d770d1c4d
commit 6e51a3f45d
55 changed files with 3219 additions and 862 deletions
@@ -290,20 +290,12 @@
{{ formatOAuthPlanType(key.oauth_plan_type) }}
</Badge>
<Badge
v-if="getPrimaryOAuthOrganizationTitle(key)"
variant="secondary"
class="text-[10px] px-1.5 py-0 shrink-0 max-w-[120px] truncate"
:title="getOAuthOrganizationsTooltip(key)"
>
{{ getPrimaryOAuthOrganizationTitle(key) }}
</Badge>
<Badge
v-if="key.oauth_account_id"
v-if="getOAuthOrgBadge(key)"
variant="secondary"
class="text-[10px] px-1.5 py-0 shrink-0"
:title="key.oauth_account_id"
:title="getOAuthOrgBadge(key)?.id"
>
acct {{ formatOAuthIdentityShort(key.oauth_account_id) }}
{{ getOAuthOrgBadge(key)?.label }}
</Badge>
<!-- Kiro 订阅类型标签 -->
<Badge
@@ -319,13 +311,6 @@
<span class="text-[11px] font-mono text-muted-foreground">
{{ key.auth_type === 'oauth' ? '[Refresh Token]' : (key.auth_type === 'service_account' ? '[Service Account]' : key.api_key_masked) }}
</span>
<span
v-if="key.oauth_account_user_id"
class="text-[10px] text-muted-foreground"
:title="key.oauth_account_user_id"
>
AUID {{ formatOAuthIdentityShort(key.oauth_account_user_id, 10, 8) }}
</span>
<Button
v-if="key.auth_type === 'oauth'"
variant="ghost"
@@ -1126,7 +1111,7 @@ import type { UpstreamMetadata, AntigravityModelQuota } from '@/api/endpoints/ty
import { formatApiFormat } from '@/api/endpoints/types/api-format'
import { isOAuthAccountProviderType, isKeyManagedProviderType } from '../utils/providerTypeUtils'
import { isAccountLevelBlockReason, cleanAccountBlockReason } from '@/utils/accountBlock'
import { formatOAuthIdentityShort, getPrimaryOAuthOrganizationTitle, getOAuthOrganizationsTooltip } from '@/utils/oauthIdentity'
import { getOAuthOrgBadge } from '@/utils/oauthIdentity'
// 扩展端点类型,包含密钥列表
interface ProviderEndpointWithKeys extends ProviderEndpoint {