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

View File

@@ -22,7 +22,7 @@ class TestCheckModelSupportForGlobalModel:
"""测试 _check_model_support_for_global_model 方法"""
@pytest.mark.asyncio
async def test_provider_without_model_should_return_false(self):
async def test_provider_without_model_should_return_false(self) -> None:
"""Provider 没有配置对应的 Model 时应该返回 False"""
scheduler = CacheAwareScheduler()
@@ -45,7 +45,7 @@ class TestCheckModelSupportForGlobalModel:
with patch("sqlalchemy.inspect", return_value=mock_inspect):
is_supported, skip_reason, caps, provider_model_names = (
await scheduler._check_model_support_for_global_model(
await scheduler._candidate_builder._check_model_support_for_global_model(
db=db,
provider=provider,
global_model=global_model,
@@ -59,7 +59,7 @@ class TestCheckModelSupportForGlobalModel:
assert provider_model_names is None
@pytest.mark.asyncio
async def test_provider_with_different_model_should_return_false(self):
async def test_provider_with_different_model_should_return_false(self) -> None:
"""Provider 配置了其他模型但没有目标模型时应该返回 False"""
scheduler = CacheAwareScheduler()
@@ -93,7 +93,7 @@ class TestCheckModelSupportForGlobalModel:
with patch("sqlalchemy.inspect", return_value=mock_inspect):
is_supported, skip_reason, caps, provider_model_names = (
await scheduler._check_model_support_for_global_model(
await scheduler._candidate_builder._check_model_support_for_global_model(
db=db,
provider=provider,
global_model=global_model,
@@ -105,7 +105,7 @@ class TestCheckModelSupportForGlobalModel:
assert skip_reason == "Provider 未实现此模型"
@pytest.mark.asyncio
async def test_provider_with_matching_model_should_return_true(self):
async def test_provider_with_matching_model_should_return_true(self) -> None:
"""Provider 配置了目标模型时应该返回 True"""
scheduler = CacheAwareScheduler()
@@ -136,7 +136,7 @@ class TestCheckModelSupportForGlobalModel:
with patch("sqlalchemy.inspect", return_value=mock_inspect):
is_supported, skip_reason, caps, provider_model_names = (
await scheduler._check_model_support_for_global_model(
await scheduler._candidate_builder._check_model_support_for_global_model(
db=db,
provider=provider,
global_model=global_model,
@@ -150,7 +150,7 @@ class TestCheckModelSupportForGlobalModel:
assert provider_model_names == {"claude-3-haiku-20240307"}
@pytest.mark.asyncio
async def test_provider_with_inactive_model_should_return_false(self):
async def test_provider_with_inactive_model_should_return_false(self) -> None:
"""Provider 的模型未激活时应该返回 False"""
scheduler = CacheAwareScheduler()
@@ -179,7 +179,7 @@ class TestCheckModelSupportForGlobalModel:
with patch("sqlalchemy.inspect", return_value=mock_inspect):
is_supported, skip_reason, caps, provider_model_names = (
await scheduler._check_model_support_for_global_model(
await scheduler._candidate_builder._check_model_support_for_global_model(
db=db,
provider=provider,
global_model=global_model,