refactor: 继续拆分大型模块并增强模块注册健壮性

后端:
- chat_handler_base 错误处理函数提取到 chat_error_utils 子模块
- CLI mixin 引入 CliHandlerProtocol 协议类改善类型标注
- aware_scheduler 拆分为 _candidate_builder 和 _candidate_sorter 子模块
- usage recording 拆分为 _billing_integration 和 _recording_helpers 子模块
- ModuleRegistry 添加循环依赖检测,将写操作从查询方法分离到 reconcile_module_state
- 修正 plugin manager 入度注释

前端:
- 路由守卫逻辑拆分为独立 guards 模块
- ProviderManagement 拆分为 TableHeader/TableRow/BalanceCell/MobileCard 子组件
- SystemSettings 拆分为多个 Section 子组件和 composables
- 提取 useEndpointStatus/useProviderBalance/useProviderFilters composables

测试适配重构后的子模块结构
This commit is contained in:
fawney19
2026-02-14 20:06:38 +08:00
parent 676e918edc
commit 8a670f5524
51 changed files with 7095 additions and 5359 deletions
@@ -20,14 +20,14 @@ def _make_key(
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_kiro_quota_remaining_zero_skips(_mock_cb: MagicMock) -> None:
scheduler = CacheAwareScheduler()
key = _make_key(upstream_metadata={"kiro": {"remaining": 0.0}})
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="openai:chat",
model_name="any-model",
@@ -39,14 +39,14 @@ def test_kiro_quota_remaining_zero_skips(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_kiro_quota_remaining_positive_allows(_mock_cb: MagicMock) -> None:
scheduler = CacheAwareScheduler()
key = _make_key(upstream_metadata={"kiro": {"remaining": 1.0}})
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="openai:chat",
model_name="any-model",
@@ -58,7 +58,7 @@ def test_kiro_quota_remaining_positive_allows(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_codex_weekly_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@@ -73,7 +73,7 @@ def test_codex_weekly_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
}
)
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="openai:cli",
model_name="any-model",
@@ -85,7 +85,7 @@ def test_codex_weekly_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_codex_5h_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@@ -99,7 +99,7 @@ def test_codex_5h_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
}
)
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="openai:cli",
model_name="any-model",
@@ -111,7 +111,7 @@ def test_codex_5h_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_codex_ignores_code_review_quota(_mock_cb: MagicMock) -> None:
@@ -126,7 +126,7 @@ def test_codex_ignores_code_review_quota(_mock_cb: MagicMock) -> None:
}
)
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="openai:cli",
model_name="any-model",
@@ -138,7 +138,7 @@ def test_codex_ignores_code_review_quota(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_antigravity_model_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@@ -154,7 +154,7 @@ def test_antigravity_model_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
},
)
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="gemini:chat",
model_name="ag-model",
@@ -166,7 +166,7 @@ def test_antigravity_model_quota_exhausted_skips(_mock_cb: MagicMock) -> None:
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_antigravity_other_model_not_exhausted_allows(_mock_cb: MagicMock) -> None:
@@ -182,7 +182,7 @@ def test_antigravity_other_model_not_exhausted_allows(_mock_cb: MagicMock) -> No
},
)
ok, reason, _mapped = scheduler._check_key_availability(
ok, reason, _mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="gemini:chat",
model_name="other",
@@ -194,7 +194,7 @@ def test_antigravity_other_model_not_exhausted_allows(_mock_cb: MagicMock) -> No
@patch(
"src.services.cache.aware_scheduler.health_monitor.get_circuit_breaker_status",
"src.services.cache._candidate_builder.health_monitor.get_circuit_breaker_status",
return_value=(True, None),
)
def test_antigravity_quota_uses_mapping_matched_model(_mock_cb: MagicMock) -> None:
@@ -212,7 +212,7 @@ def test_antigravity_quota_uses_mapping_matched_model(_mock_cb: MagicMock) -> No
allowed_models=["ag-model"],
)
ok, reason, mapped = scheduler._check_key_availability(
ok, reason, mapped = scheduler._candidate_builder._check_key_availability(
key,
api_format="gemini:chat",
model_name="global-model",