refactor: 拆分调度器为独立子模块,增强 Sub2API 多认证方式支持

调度器重构:
- 将 CacheAwareScheduler 拆分为 candidate_builder、candidate_sorter、
  concurrency_checker、restriction_checker、scheduling_config、schemas、utils 等独立模块
- 删除旧的 _candidate_builder.py 和 _candidate_sorter.py
- 新增调度并发拒绝 Prometheus 指标

Sub2API 架构增强:
- 支持账号密码登录和 Refresh Token 两种认证方式
- 实现 JWT 自动刷新和 Token Rotation 持久化
- 前端 ProviderAuthDialog 支持多认证方式切换和 credentials_schema 动态渲染
- 验证接口返回 updated_credentials 以同步轮换后的 token

其他改进:
- 并发管理器增加 RPM guard 和动态预留逻辑
- RequestCandidate 支持 mark_skipped 附加 extra_data
- TaskService 增强健壮性
- 补充相关单元测试和契约测试
This commit is contained in:
fawney19
2026-02-15 16:32:23 +08:00
parent 8a670f5524
commit 1c16b77a92
27 changed files with 2159 additions and 645 deletions

View File

@@ -675,12 +675,13 @@ class Provider(Base):
# 注意:如果系统配置 keep_priority_on_conversion=true此字段被忽略所有提供商都保持优先级
keep_priority_on_conversion = Column(Boolean, default=False, nullable=False)
# 是否允许格式转换(默认 True
# - True: 该提供商可以作为格式转换的目标(如 OpenAI 客户端请求可以路由到此 Gemini 提供商
# - False: 该提供商不接受需要格式转换的请求
# 是否允许格式转换(默认 False
# - True: 该提供商可以作为格式转换的目标(全局开关关闭时也可跳过端点检查
# - False: 默认不作为格式转换目标;此时需要端点 format_acceptance_config 显式允许才可跨格式
# 优先级逻辑:
# - 全局开关 ON 强制允许所有提供商的格式转换(忽略此字段)
# - 全局开关 OFF → 由此字段决定是否允许该提供商的格式转换
# - 全局开关 ON -> 强制允许跨格式(忽略此字段与端点检查
# - 全局开关 OFF -> 若此字段 ON -> 允许跨格式(跳过端点检查)
# - 否则 -> 由端点 format_acceptance_config 决定是否允许
enable_format_conversion = Column(Boolean, default=False, nullable=False)
# 状态

View File

@@ -80,12 +80,13 @@ class Provider(Base):
# 注意:如果系统配置 keep_priority_on_conversion=true此字段被忽略所有提供商都保持优先级
keep_priority_on_conversion = Column(Boolean, default=False, nullable=False)
# 是否允许格式转换(默认 True
# - True: 该提供商可以作为格式转换的目标(如 OpenAI 客户端请求可以路由到此 Gemini 提供商
# - False: 该提供商不接受需要格式转换的请求
# 是否允许格式转换(默认 False
# - True: 该提供商可以作为格式转换的目标(全局开关关闭时也可跳过端点检查
# - False: 默认不作为格式转换目标;此时需要端点 format_acceptance_config 显式允许才可跨格式
# 优先级逻辑:
# - 全局开关 ON -> 强制允许所有提供商的格式转换(忽略此字段)
# - 全局开关 OFF -> 此字段决定是否允许该提供商的格式转换
# - 全局开关 ON -> 强制允许跨格式(忽略此字段与端点检查
# - 全局开关 OFF -> 此字段 ON -> 允许跨格式(跳过端点检查)
# - 否则 -> 由端点 format_acceptance_config 决定是否允许
enable_format_conversion = Column(Boolean, default=False, nullable=False)
# 状态