mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 17:30:23 +08:00
feat(pool): 引入多维评分调度策略与账号状态检测
- 新增 multi_score 调度模式,支持 LRU/延迟/健康度/剩余额度多维加权评分 - 新增调度预设维度系统(free_team_first, quota_balanced, recent_refresh, single_account),支持有序对象列表配置格式并兼容旧字符串列表 - 新增 account_state 模块,统一账号封禁/受限检测逻辑,替代分散在 routes 中的判断代码 - 新增 health_cache 模块和 latency 采样(redis_ops.record_latency / batch_get_latency_avgs) - RequestDispatcher 返回 ttfb_ms,PoolManager.on_request_success 记录延迟样本 - 前端:PoolConfigDialog 替换为 PoolSchedulingDialog,支持预设维度可视化配置;号池管理页增加调度模式标签与账号异常 Badge 显示 - 提取前端 accountBlock 工具函数,ProviderDetailDrawer 复用统一判断 - scheduling_dimensions 增加 account_state 和 latency 维度评估 - 补充 account_state、health_cache、multi_score 策略、preset 维度、redis latency 等测试
This commit is contained in:
@@ -28,7 +28,7 @@ def _snapshot(**overrides: object) -> PoolSchedulingSnapshot:
|
||||
|
||||
def test_default_dimension_registry_contains_core_dimensions() -> None:
|
||||
names = list_pool_scheduling_dimensions()
|
||||
assert names == ("manual", "cooldown", "circuit", "cost", "health")
|
||||
assert names == ("account_state", "manual", "cooldown", "circuit", "cost", "latency", "health")
|
||||
|
||||
|
||||
def test_summary_available_when_all_dimensions_ok() -> None:
|
||||
@@ -54,6 +54,37 @@ def test_summary_blocked_when_manual_disabled() -> None:
|
||||
assert summary.score < 100.0
|
||||
|
||||
|
||||
def test_summary_blocked_when_account_state_blocked() -> None:
|
||||
dimensions = evaluate_pool_scheduling_dimensions(
|
||||
_snapshot(
|
||||
account_blocked=True,
|
||||
account_block_label="账号封禁",
|
||||
account_block_reason="account suspended",
|
||||
)
|
||||
)
|
||||
summary = summarize_pool_scheduling_dimensions(dimensions)
|
||||
|
||||
assert summary.status == "blocked"
|
||||
assert summary.reason == "account_banned"
|
||||
assert summary.candidate_eligible is False
|
||||
assert summary.blocked_count >= 1
|
||||
|
||||
|
||||
def test_account_state_takes_priority_over_manual_disabled() -> None:
|
||||
dimensions = evaluate_pool_scheduling_dimensions(
|
||||
_snapshot(
|
||||
is_active=False,
|
||||
account_blocked=True,
|
||||
account_block_label="访问受限",
|
||||
account_block_reason="forbidden",
|
||||
)
|
||||
)
|
||||
summary = summarize_pool_scheduling_dimensions(dimensions)
|
||||
|
||||
assert summary.status == "blocked"
|
||||
assert summary.reason == "account_forbidden"
|
||||
|
||||
|
||||
def test_summary_degraded_when_cost_reaches_soft_threshold() -> None:
|
||||
dimensions = evaluate_pool_scheduling_dimensions(
|
||||
_snapshot(cost_window_usage=8200, cost_limit=10000, cost_soft_threshold_percent=80)
|
||||
@@ -92,3 +123,11 @@ def test_dimension_result_keeps_degraded_health_details() -> None:
|
||||
assert isinstance(health, PoolSchedulingDimensionResult)
|
||||
assert health.status == "degraded"
|
||||
assert health.detail == "0.65"
|
||||
|
||||
|
||||
def test_latency_dimension_degraded_when_latency_high() -> None:
|
||||
dimensions = evaluate_pool_scheduling_dimensions(_snapshot(latency_avg_ms=3200))
|
||||
latency = next((item for item in dimensions if item.code == "latency_high"), None)
|
||||
assert isinstance(latency, PoolSchedulingDimensionResult)
|
||||
assert latency.status == "degraded"
|
||||
assert latency.detail == "3200ms"
|
||||
|
||||
Reference in New Issue
Block a user