mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
Merge pull request #220 from AAEE86/master
fix(pool): recent_refresh 按 provider_type 解析 reset_seconds 并锁定 Codex 周重置语义
This commit is contained in:
@@ -161,6 +161,41 @@ def test_multi_score_preset_recent_refresh_prefers_nearer_reset() -> None:
|
||||
assert s2 < s1
|
||||
|
||||
|
||||
def test_multi_score_preset_recent_refresh_uses_codex_weekly_reset() -> None:
|
||||
strategy = MultiScoreStrategy()
|
||||
cfg = PoolConfig(
|
||||
scheduling_mode="multi_score",
|
||||
scheduling_presets=(SchedulingPreset(preset="recent_refresh", enabled=True),),
|
||||
)
|
||||
ctx = {
|
||||
"provider_type": "codex",
|
||||
"all_key_ids": ["k1", "k2"],
|
||||
"lru_scores": {"k1": 100.0, "k2": 100.0},
|
||||
"keys_by_id": {
|
||||
"k1": _key_with_metadata(
|
||||
{
|
||||
"codex": {
|
||||
"primary_reset_seconds": 600,
|
||||
"secondary_reset_seconds": 120,
|
||||
}
|
||||
}
|
||||
),
|
||||
"k2": _key_with_metadata(
|
||||
{
|
||||
"codex": {
|
||||
"primary_reset_seconds": 300,
|
||||
"secondary_reset_seconds": 900,
|
||||
}
|
||||
}
|
||||
),
|
||||
},
|
||||
}
|
||||
s1 = strategy.compute_score(key_id="k1", config=cfg, context=ctx)
|
||||
s2 = strategy.compute_score(key_id="k2", config=cfg, context=ctx)
|
||||
assert s1 is not None and s2 is not None
|
||||
assert s2 < s1
|
||||
|
||||
|
||||
def test_multi_score_preset_single_account_prefers_internal_priority_then_reverse_lru() -> None:
|
||||
strategy = MultiScoreStrategy()
|
||||
cfg = PoolConfig(
|
||||
|
||||
@@ -83,6 +83,17 @@ def test_parse_codex_usage_headers_paid_windows_mapping() -> None:
|
||||
assert "credits_balance" not in parsed
|
||||
|
||||
|
||||
@pytest.mark.parametrize("plan_type", ["plus", "enterprise"])
|
||||
def test_parse_codex_usage_headers_paid_plan_windows_mapping(plan_type: str) -> None:
|
||||
parsed = parse_codex_usage_headers(_paid_headers(**{"x-codex-plan-type": plan_type}))
|
||||
assert parsed is not None
|
||||
assert parsed["plan_type"] == plan_type
|
||||
assert parsed["primary_used_percent"] == 64.0
|
||||
assert parsed["secondary_used_percent"] == 3.0
|
||||
assert parsed["primary_window_minutes"] == 10080
|
||||
assert parsed["secondary_window_minutes"] == 300
|
||||
|
||||
|
||||
def test_parse_codex_usage_headers_free_uses_primary_only() -> None:
|
||||
parsed = parse_codex_usage_headers(
|
||||
{
|
||||
|
||||
@@ -542,6 +542,35 @@ def test_parse_codex_usage_missing_plan_type_infers_paid_windows() -> None:
|
||||
assert parsed["secondary_window_minutes"] == 300
|
||||
|
||||
|
||||
@pytest.mark.parametrize("plan_type", ["plus", "enterprise"])
|
||||
def test_parse_codex_usage_paid_plan_windows_mapping(plan_type: str) -> None:
|
||||
parsed = parse_codex_wham_usage_response(
|
||||
{
|
||||
"plan_type": plan_type,
|
||||
"rate_limit": {
|
||||
"primary_window": {
|
||||
"used_percent": 25,
|
||||
"reset_after_seconds": 600,
|
||||
"reset_at": 1700000000,
|
||||
"limit_window_seconds": 18000,
|
||||
},
|
||||
"secondary_window": {
|
||||
"used_percent": 80,
|
||||
"reset_after_seconds": 3600,
|
||||
"reset_at": 1700003600,
|
||||
"limit_window_seconds": 604800,
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
assert parsed is not None
|
||||
assert parsed["plan_type"] == plan_type
|
||||
assert parsed["primary_used_percent"] == 80.0
|
||||
assert parsed["secondary_used_percent"] == 25.0
|
||||
assert parsed["primary_window_minutes"] == 10080
|
||||
assert parsed["secondary_window_minutes"] == 300
|
||||
|
||||
|
||||
def test_parse_codex_usage_blank_credits_balance_is_ignored() -> None:
|
||||
parsed = parse_codex_wham_usage_response(
|
||||
{
|
||||
|
||||
@@ -74,6 +74,20 @@ def test_dimension_helpers_delegate_to_unified_reader(monkeypatch: pytest.Monkey
|
||||
assert extract_usage_ratio(key_obj) == pytest.approx(0.45)
|
||||
|
||||
|
||||
def test_extract_reset_seconds_uses_codex_weekly_reset_for_codex_provider() -> None:
|
||||
key_obj = SimpleNamespace(
|
||||
provider_type="codex",
|
||||
upstream_metadata={
|
||||
"codex": {
|
||||
"primary_reset_seconds": 1800.0,
|
||||
"secondary_reset_seconds": 120.0,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
assert extract_reset_seconds(key_obj) == pytest.approx(1800.0)
|
||||
|
||||
|
||||
def test_resolve_pool_account_state_keeps_codex_metadata_block() -> None:
|
||||
state = resolve_pool_account_state(
|
||||
provider_type="codex",
|
||||
|
||||
Reference in New Issue
Block a user