feat(pool,admin): 拆分调度维度、重构调度 UI 与增强配置导入导出

调度维度:
- 新增 cache_affinity/free_first/team_first/plus_first/load_balance 五个独立维度
- 将 free_team_first 标记为 hidden,保留后向兼容但不再显示
- Registry 新增 hidden 属性,_helpers 新增 plus_only 优先级评分

前端调度对话框:
- 分配模式(互斥组)独立为按钮组选择,策略调度保留拖拽排序
- 默认调度从 LRU 轮转改为缓存亲和
- 提取 buildPresetListItem/insertMissingByPreferredOrder 消除重复代码

配置导入导出:
- 导出时 api_formats 支持规范化、去重与 None 回退到 Provider 端点
- 导入时兼容 supported_endpoints 别名与历史 None 语义
- 新增 test_admin_system_key_formats 单元测试
This commit is contained in:
fawney19
2026-03-05 23:22:25 +08:00
parent da915208a8
commit 228cbc8f87
12 changed files with 667 additions and 229 deletions

View File

@@ -0,0 +1,61 @@
from src.api.admin.system import AdminExportConfigAdapter, AdminImportConfigAdapter
def test_export_key_api_formats_falls_back_to_provider_endpoints_when_none() -> None:
adapter = AdminExportConfigAdapter()
result = adapter._resolve_export_key_api_formats(
None,
["claude:chat", "openai:cli"],
)
assert result == ["claude:chat", "openai:cli"]
def test_export_key_api_formats_keeps_explicit_empty_list() -> None:
adapter = AdminExportConfigAdapter()
result = adapter._resolve_export_key_api_formats(
[],
["openai:chat"],
)
assert result == []
def test_export_key_api_formats_normalizes_and_deduplicates() -> None:
adapter = AdminExportConfigAdapter()
result = adapter._resolve_export_key_api_formats(
[" OPENAI:CHAT ", "openai:chat", "openai:cli", "bad-format"],
["claude:chat"],
)
assert result == ["openai:chat", "openai:cli"]
def test_import_key_api_formats_uses_supported_endpoints_alias() -> None:
result = AdminImportConfigAdapter._extract_import_key_api_formats(
{"supported_endpoints": ["openai:chat"]},
{"openai:chat", "openai:cli"},
)
assert result == ["openai:chat"]
def test_import_key_api_formats_falls_back_to_provider_endpoints_when_none() -> None:
result = AdminImportConfigAdapter._extract_import_key_api_formats(
{"api_formats": None},
{"openai:chat", "claude:cli"},
)
assert result == ["claude:cli", "openai:chat"]
def test_import_key_api_formats_keeps_explicit_empty_list() -> None:
result = AdminImportConfigAdapter._extract_import_key_api_formats(
{"api_formats": []},
{"openai:chat"},
)
assert result == []