Skip to content

feat(号池): 支持账号批量配置与可用模型管理#672

Merged
fawney19 merged 6 commits into
fawney19:mainfrom
MMEXA:codex/pool-key-bulk-management-20260714
Jul 19, 2026
Merged

feat(号池): 支持账号批量配置与可用模型管理#672
fawney19 merged 6 commits into
fawney19:mainfrom
MMEXA:codex/pool-key-bulk-management-20260714

Conversation

@MMEXA

@MMEXA MMEXA commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

功能范围

  • 号池管理沿用“账号批量操作”入口,跨页选择、筛选结果全选与已有批量动作保持统一。
  • 选择账号后可进入“编辑配置”,批量应用支持 API、启用状态、优先级、RPM、并发上限、缓存 TTL、熔断探测周期、备注、自动获取上游模型设置与可用模型范围。
  • 每个字段都由独立的“应用”开关控制。未启用的字段不会进入请求体,也不会覆盖账号已有配置。
  • api_keyauth_configauth_type、账号名称等身份与凭据字段由单账号编辑负责,避免把同一身份信息写入多个账号。

模型配置语义

自动模型发现与可用模型范围是两项独立配置:

  • “自动获取上游可用模型”控制是否从上游同步模型列表。
  • “包含规则”和“排除规则”仅在自动获取开启时参与模型筛选,支持逗号分隔以及 *? 通配符,匹配不区分大小写。
  • “可用模型范围”控制账号允许承接的模型;可选择允许全部模型,也可维护明确的模型集合。
  • “锁定已选模型”明确控制 locked_models。自动获取模型时,锁定集合用于保留人工确认的模型范围。
  • 自动获取设置与可用模型范围分别写入补丁;只修改其中一项时,另一项保持不变。
  • 关闭自动获取只写入 auto_fetch_models: false,不会清空模型范围、锁定集合或筛选规则。

模型选择器聚合以下来源:

  • Provider 已配置模型;
  • 所选账号实际获取到的上游模型;
  • 管理员输入的自定义模型。

模型列表支持搜索,并可按当前搜索结果批量选择。

管理接口

PATCH /api/admin/pool/:provider_id/keys/batch-update

请求体示例:

{
  "key_ids": ["key-a", "key-b"],
  "patch": {
    "api_formats": ["openai:responses"],
    "internal_priority": 10,
    "auto_fetch_models": true,
    "model_include_patterns": ["gpt-*"],
    "model_exclude_patterns": ["*-preview"],
    "allowed_models": ["gpt-5.6-sol", "gpt-5.6-luna"],
    "locked_models": ["gpt-5.6-sol", "gpt-5.6-luna"]
  }
}

接口行为:

  • key_ids 统一去重并校验 Provider 归属;空集合、未知账号或跨 Provider 账号在写入前返回错误。
  • patch 只接受可共享的账号配置字段。
  • 每个目标账号通过单账号更新构造器完成认证约束、API 格式、数值范围、模型规则、代理配置与加密上下文校验。
  • 所有目标记录构造成功后进入集合写入;任一记录校验失败时,整组配置保持不变。
  • 响应返回实际更新数量和模型同步统计。配置写入与外部模型发现分别报告结果,避免上游发现失败掩盖配置状态。

模型发现链路

  • /api/admin/provider-query/models 接受 api_key_ids,模型发现范围限定为所选账号集合。
  • 管理员明确选择的停用账号可用于获取上游模型;Provider 默认查询只使用启用账号。
  • Provider 级缓存服务默认查询;指定账号集合时使用账号级缓存和实际上游结果聚合,避免不同选择范围复用错误结果。
  • 自动获取开启、包含/排除规则变化或锁定模型变化时触发即时同步。
  • 多账号同步只读取一轮 Provider、端点和账号目录,并把目标 ID 集合交给模型抓取运行时处理。

持久化与运行态

  • ProviderCatalogWriteRepository 提供集合更新契约,内存、PostgreSQL、SQLite 与 MySQL 实现保持一致。
  • PostgreSQL、SQLite 与 MySQL 在单个数据库事务中写入目标账号集合;数据库错误回滚整组修改。
  • SQLite 与 MySQL 更新语句覆盖 auto_fetch_modelslocked_modelsmodel_include_patternsmodel_exclude_patterns,各数据后端使用一致的模型配置语义。
  • Provider 目录缓存与路由缓存按集合写入统一失效,避免逐账号重复刷新运行态。
  • 号池评分记录按目标集合统一补齐。

UI 与交互

  • 选择状态复用号池跨页选择与筛选解析能力,编辑器接收解析后的稳定账号 ID 集合。
  • “编辑配置”属于“账号批量操作”的一个动作,选择状态和配置编辑状态由两个独立对话框管理。
  • 保存前展示目标账号数量和实际应用字段摘要,并确认影响范围。
  • 限制可用模型时至少选择一个模型,避免空集合产生歧义。
  • 视觉置灰控件同步禁用键盘交互,鼠标与键盘行为保持一致。
  • 上游模型请求使用统一的并发去重、错误解析和加载状态执行器;强制刷新期间由最新请求持有加载状态。

设计依据

  • 单账号与批量账号配置共同使用 build_admin_update_provider_key_record_with_existing_keys 作为字段校验入口,批量接口只负责目标集合、补丁边界和事务编排。
  • 选择语义复用 resolvePoolKeySelection,分页、筛选与全选只保留一套解释规则。
  • 模型发现复用 Provider Query 与 Model Fetch 运行时,批量能力通过账号 ID 集合限定查询范围。
  • 数据一致性由仓储事务保证,前端不执行逐账号请求、失败补偿或回滚模拟。
  • 身份与凭据字段保持单账号职责,批量配置只处理能够安全共享的运行参数和模型策略。

合并依赖

  • 合并顺序:#669#672
  • #669 提供 Gateway 测试辅助函数作用域和 effective-token 统计语义;#672 的 Rust CI 基于 main 合并树运行,相关 Gateway Clippy 与统计测试依赖该提交。
  • #669 合并后更新 #672 基线并执行完整 CI 矩阵。

验证

  • cargo fmt --all -- --check
  • cargo check -p aether-gateway
  • cargo clippy -p aether-data -p aether-gateway --lib --tests -- -D warnings
  • cargo test -p aether-data sqlite_repository_writes_provider_catalog_contract_views -- --nocapture
  • Gateway 批量更新成功、未知账号零写入、字段白名单、所选账号模型发现、路由分类与模块边界测试
  • npm run type-check
  • 相关前端 ESLint 检查
  • 批量字段补丁、编辑对话框、批量入口与模型请求并发测试,共 11 项
  • npm run build

@MMEXA
MMEXA marked this pull request as draft July 13, 2026 21:46
@MMEXA MMEXA changed the title feat(号池): 支持密钥批量配置与模型权限管理 feat(号池): 支持账号批量配置与可用模型管理 Jul 14, 2026
ZipperCode added a commit to ZipperCode/Aether that referenced this pull request Jul 14, 2026
MMEXA added 2 commits July 16, 2026 23:43
…anagement-20260714

# Conflicts:
#	apps/aether-gateway/src/handlers/admin/request/provider/tasks.rs
#	frontend/src/api/endpoints/pool.ts
@MMEXA
MMEXA marked this pull request as ready for review July 16, 2026 16:34
@fawney19
fawney19 merged commit 95053f9 into fawney19:main Jul 19, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants