mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
refactor(pool): 移除调度多维评分详情,简化为 reasons 摘要
移除 scheduling_score、candidate_eligible、scheduling_dimensions 等字段, 前后端统一使用 scheduling_reasons 展示调度状态,精简号池列表信息密度。
This commit is contained in:
@@ -47,7 +47,6 @@ from .schemas import (
|
||||
PoolKeysPageResponse,
|
||||
PoolOverviewItem,
|
||||
PoolOverviewResponse,
|
||||
PoolSchedulingDimension,
|
||||
PoolSchedulingReason,
|
||||
PresetDimensionMetaResponse,
|
||||
PresetModeMetaResponse,
|
||||
@@ -508,17 +507,7 @@ def _build_pool_scheduling_state(
|
||||
cost_limit: int | None,
|
||||
cost_soft_threshold_percent: int,
|
||||
health_score: float,
|
||||
) -> tuple[
|
||||
str,
|
||||
str,
|
||||
str,
|
||||
list[PoolSchedulingReason],
|
||||
float,
|
||||
bool,
|
||||
int,
|
||||
int,
|
||||
list[PoolSchedulingDimension],
|
||||
]:
|
||||
) -> tuple[str, str, str, list[PoolSchedulingReason]]:
|
||||
"""Build unified scheduling state for frontend display."""
|
||||
snapshot = PoolSchedulingSnapshot(
|
||||
is_active=is_active,
|
||||
@@ -537,28 +526,12 @@ def _build_pool_scheduling_state(
|
||||
dimensions_raw = evaluate_pool_scheduling_dimensions(snapshot)
|
||||
summary = summarize_pool_scheduling_dimensions(dimensions_raw)
|
||||
|
||||
scheduling_dimensions: list[PoolSchedulingDimension] = []
|
||||
scheduling_reasons: list[PoolSchedulingReason] = []
|
||||
|
||||
for item in dimensions_raw:
|
||||
detail = item.detail
|
||||
if item.code == "cooldown":
|
||||
detail = _format_cooldown_detail(detail)
|
||||
|
||||
model = PoolSchedulingDimension(
|
||||
code=item.code,
|
||||
label=item.label,
|
||||
status=item.status,
|
||||
blocking=bool(item.blocking or item.status == "blocked"),
|
||||
source=item.source,
|
||||
weight=item.weight,
|
||||
score=item.score,
|
||||
ttl_seconds=item.ttl_seconds,
|
||||
detail=detail,
|
||||
)
|
||||
scheduling_dimensions.append(model)
|
||||
|
||||
if item.status != "ok":
|
||||
detail = item.detail
|
||||
if item.code == "cooldown":
|
||||
detail = _format_cooldown_detail(detail)
|
||||
scheduling_reasons.append(
|
||||
PoolSchedulingReason(
|
||||
code=item.code,
|
||||
@@ -575,11 +548,6 @@ def _build_pool_scheduling_state(
|
||||
summary.reason,
|
||||
summary.label,
|
||||
scheduling_reasons,
|
||||
summary.score,
|
||||
summary.candidate_eligible,
|
||||
summary.blocked_count,
|
||||
summary.degraded_count,
|
||||
scheduling_dimensions,
|
||||
)
|
||||
|
||||
|
||||
@@ -902,11 +870,6 @@ class AdminListPoolKeysAdapter(AdminApiAdapter):
|
||||
scheduling_reason,
|
||||
scheduling_label,
|
||||
scheduling_reasons,
|
||||
scheduling_score,
|
||||
candidate_eligible,
|
||||
scheduling_blocked_count,
|
||||
scheduling_degraded_count,
|
||||
scheduling_dimensions,
|
||||
) = _build_pool_scheduling_state(
|
||||
is_active=bool(k.is_active),
|
||||
account_blocked=account_state.blocked,
|
||||
@@ -1035,11 +998,6 @@ class AdminListPoolKeysAdapter(AdminApiAdapter):
|
||||
scheduling_reason=scheduling_reason,
|
||||
scheduling_label=scheduling_label,
|
||||
scheduling_reasons=scheduling_reasons,
|
||||
scheduling_score=scheduling_score,
|
||||
candidate_eligible=candidate_eligible,
|
||||
scheduling_blocked_count=scheduling_blocked_count,
|
||||
scheduling_degraded_count=scheduling_degraded_count,
|
||||
scheduling_dimensions=scheduling_dimensions,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -64,19 +64,6 @@ class PoolSchedulingReason(BaseModel):
|
||||
detail: str | None = None
|
||||
|
||||
|
||||
class PoolSchedulingDimension(BaseModel):
|
||||
"""Detailed scheduling dimension status."""
|
||||
|
||||
code: str
|
||||
label: str
|
||||
status: str = "ok" # ok / degraded / blocked
|
||||
blocking: bool = False
|
||||
source: str = "pool"
|
||||
weight: int = 1
|
||||
score: float = 1.0 # normalized 0~1
|
||||
ttl_seconds: int | None = None
|
||||
detail: str | None = None
|
||||
|
||||
|
||||
class PoolKeyDetail(BaseModel):
|
||||
"""Detailed status of a single pool key."""
|
||||
@@ -124,11 +111,6 @@ class PoolKeyDetail(BaseModel):
|
||||
scheduling_reason: str = "available"
|
||||
scheduling_label: str = "可用"
|
||||
scheduling_reasons: list[PoolSchedulingReason] = Field(default_factory=list)
|
||||
scheduling_score: float = 100.0
|
||||
candidate_eligible: bool = True
|
||||
scheduling_blocked_count: int = 0
|
||||
scheduling_degraded_count: int = 0
|
||||
scheduling_dimensions: list[PoolSchedulingDimension] = Field(default_factory=list)
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
@@ -53,7 +53,6 @@ class PoolSchedulingSummary:
|
||||
status: str # available / degraded / blocked
|
||||
reason: str
|
||||
label: str
|
||||
score: float
|
||||
candidate_eligible: bool
|
||||
blocked_count: int
|
||||
degraded_count: int
|
||||
@@ -408,7 +407,6 @@ def summarize_pool_scheduling_dimensions(
|
||||
status="available",
|
||||
reason="available",
|
||||
label="可用",
|
||||
score=100.0,
|
||||
candidate_eligible=True,
|
||||
blocked_count=0,
|
||||
degraded_count=0,
|
||||
@@ -417,18 +415,12 @@ def summarize_pool_scheduling_dimensions(
|
||||
blocked = [item for item in dimensions if item.status == "blocked" or item.blocking]
|
||||
degraded = [item for item in dimensions if item.status == "degraded"]
|
||||
|
||||
total_weight = sum(max(item.weight, 1) for item in dimensions)
|
||||
weighted_score = sum(
|
||||
max(item.weight, 1) * max(min(item.score, 1.0), 0.0) for item in dimensions
|
||||
) / max(total_weight, 1)
|
||||
|
||||
if blocked:
|
||||
primary = blocked[0]
|
||||
return PoolSchedulingSummary(
|
||||
status="blocked",
|
||||
reason=primary.code,
|
||||
label=primary.label,
|
||||
score=round(weighted_score * 100, 1),
|
||||
candidate_eligible=False,
|
||||
blocked_count=len(blocked),
|
||||
degraded_count=len(degraded),
|
||||
@@ -440,7 +432,6 @@ def summarize_pool_scheduling_dimensions(
|
||||
status="degraded",
|
||||
reason=primary.code,
|
||||
label=primary.label,
|
||||
score=round(weighted_score * 100, 1),
|
||||
candidate_eligible=True,
|
||||
blocked_count=0,
|
||||
degraded_count=len(degraded),
|
||||
@@ -450,7 +441,6 @@ def summarize_pool_scheduling_dimensions(
|
||||
status="available",
|
||||
reason="available",
|
||||
label="可用",
|
||||
score=round(weighted_score * 100, 1),
|
||||
candidate_eligible=True,
|
||||
blocked_count=0,
|
||||
degraded_count=0,
|
||||
|
||||
Reference in New Issue
Block a user