feat: OAuth 账户管理、维护调度、端点健康检查增强及前端优化

- 新增 OAuth 账户管理对话框和提供商详情抽屉中的 OAuth 信息展示
- 新增维护调度器(maintenance_scheduler)支持定时清理和健康检查
- 增强端点健康检查器,支持更多检测策略
- 重构 codex 服务为 metadata_collectors 模块
- 优化 OpenAI CLI normalizer 代码结构
- 前端: 改进使用量表格、统计图表、指南页面和异步任务管理
- 扩展多个数据库字符串列为 TEXT 类型
- 新增倒计时 composable 和 provider OAuth API 端点
This commit is contained in:
fawney19
2026-02-04 23:59:45 +08:00
parent 24c9105628
commit 4d6e7c094f
64 changed files with 3885 additions and 930 deletions

View File

@@ -1391,6 +1391,13 @@ class ProviderAPIKey(Base):
model_include_patterns = Column(JSON, nullable=True) # 包含规则列表,空表示不过滤(包含所有)
model_exclude_patterns = Column(JSON, nullable=True) # 排除规则列表,空表示不排除
# 上游元数据(由响应头解析器采集,如 Codex 额度信息)
upstream_metadata = Column(JSON, nullable=True, default=dict)
# OAuth 失效状态(账号被封、授权撤销、刷新失败等)
oauth_invalid_at = Column(DateTime(timezone=True), nullable=True) # 失效时间
oauth_invalid_reason = Column(String(255), nullable=True) # 失效原因
# 时间戳
created_at = Column(
DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False

View File

@@ -154,9 +154,7 @@ class ProviderEndpointResponse(BaseModel):
header_rules: list[HeaderRule] | None = Field(default=None, description="请求头规则列表")
# 请求体配置
body_rules: list[BodyRule] | None = Field(
default=None, description="请求体规则列表"
)
body_rules: list[BodyRule] | None = Field(default=None, description="请求体规则列表")
max_retries: int
@@ -514,7 +512,18 @@ class EndpointAPIKeyResponse(BaseModel):
capabilities: dict[str, bool] | None = Field(default=None, description="Key 能力标签")
# OAuth 相关
oauth_expires_at: int | None = Field(default=None, description="OAuth Token 过期时间Unix 时间戳)")
oauth_expires_at: int | None = Field(
default=None, description="OAuth Token 过期时间Unix 时间戳)"
)
oauth_email: str | None = Field(default=None, description="OAuth 账号邮箱")
oauth_plan_type: str | None = Field(
default=None, description="OAuth 账号套餐类型(如 free/plus/team/enterprise"
)
oauth_account_id: str | None = Field(default=None, description="OAuth 账号 ID")
oauth_invalid_at: int | None = Field(
default=None, description="OAuth Token 失效时间Unix 时间戳),如账号被封、授权撤销等"
)
oauth_invalid_reason: str | None = Field(default=None, description="OAuth Token 失效原因")
# 缓存与熔断配置
cache_ttl_minutes: int = Field(default=5, description="缓存 TTL分钟0=禁用")
@@ -576,6 +585,11 @@ class EndpointAPIKeyResponse(BaseModel):
model_include_patterns: list[str] | None = Field(None, description="模型包含规则")
model_exclude_patterns: list[str] | None = Field(None, description="模型排除规则")
# 上游元数据(由响应头采集,如 Codex 额度信息)
upstream_metadata: dict[str, Any] | None = Field(
None, description="上游元数据(如 Codex 额度信息)"
)
# 时间戳
last_used_at: datetime | None = None
created_at: datetime
@@ -701,7 +715,9 @@ class ProviderWithEndpointsSummary(BaseModel):
# Provider 基本信息
id: str
name: str
provider_type: str | None = Field(default=None, description="Provider 类型custom/claude_code/codex/gemini_cli/antigravity")
provider_type: str | None = Field(
default=None, description="Provider 类型custom/claude_code/codex/gemini_cli/antigravity"
)
description: str | None = None
website: str | None = None
provider_priority: int = Field(default=100, description="提供商优先级(数字越小越优先)")