refactor: 调度器迁移至独立模块,消除 services->api 反向依赖

- 将调度器相关模块从 src/services/cache/ 迁移到 src/services/scheduling/
- 下沉类型定义到 core 层: AccessRestrictions, ProviderAuthInfo, ParsedChunk/StreamStats, 视频工具函数
- 提取 thinking_cache 签名缓存到 core/api_format/conversion/
- 提取 provider 认证逻辑到 services/provider/auth
- 提取遥测记录到 services/usage/telemetry
- 提取 models 列表缓存到 services/cache/model_list_cache
- 更新所有引用方的 import 路径及相关测试
This commit is contained in:
fawney19
2026-02-16 11:00:48 +08:00
parent 4dc401677d
commit 63870931af
85 changed files with 1907 additions and 1463 deletions

View File

@@ -1,11 +1,13 @@
from __future__ import annotations
from types import SimpleNamespace
from typing import cast
from unittest.mock import MagicMock, patch
from src.services.cache.candidate_sorter import CandidateSorter
from src.services.cache.scheduling_config import SchedulingConfig
from src.services.cache.schemas import ProviderCandidate
from src.models.database import Provider, ProviderAPIKey, ProviderEndpoint
from src.services.scheduling.candidate_sorter import CandidateSorter
from src.services.scheduling.scheduling_config import SchedulingConfig
from src.services.scheduling.schemas import ProviderCandidate
def _make_candidate(
@@ -28,12 +30,12 @@ def _make_candidate(
global_priority_by_format={"openai:chat": global_priority},
)
return ProviderCandidate(
provider=provider,
endpoint=endpoint,
key=key,
provider=cast(Provider, provider),
endpoint=cast(ProviderEndpoint, endpoint),
key=cast(ProviderAPIKey, key),
needs_conversion=needs_conversion,
provider_api_format="openai:chat",
) # type: ignore[arg-type]
)
def test_priority_sort_global_key_does_not_demote_when_global_keep_priority_enabled() -> None:
@@ -59,7 +61,7 @@ def test_priority_sort_global_key_does_not_demote_when_global_keep_priority_enab
# 全局 keep_priority_on_conversion=True不做 needs_conversion 降级分组,纯按 global_priority 排序
with patch(
"src.services.cache.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
"src.services.scheduling.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
return_value=True,
):
result = sorter._apply_priority_mode_sort([exact, demoted], db, None, "openai:chat")
@@ -90,7 +92,7 @@ def test_priority_sort_global_key_demotes_convertible_when_global_keep_priority_
# 全局 keep_priority_on_conversion=False需要降级的 convertible 候选整体排后
with patch(
"src.services.cache.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
"src.services.scheduling.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
return_value=False,
):
result = sorter._apply_priority_mode_sort([exact, demoted], db, None, "openai:chat")
@@ -126,7 +128,7 @@ def test_priority_sort_global_key_provider_keep_priority_overrides_demotion_grou
)
with patch(
"src.services.cache.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
"src.services.scheduling.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
return_value=False,
):
result = sorter._apply_priority_mode_sort(
@@ -163,7 +165,7 @@ def test_priority_sort_provider_mode_demotes_convertible_when_global_keep_priori
)
with patch(
"src.services.cache.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
"src.services.scheduling.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
return_value=False,
):
result = sorter._apply_priority_mode_sort([demoted, exact], db, None, "openai:chat")
@@ -193,7 +195,7 @@ def test_priority_sort_provider_mode_does_not_demote_when_global_keep_priority_e
)
with patch(
"src.services.cache.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
"src.services.scheduling.candidate_sorter.SystemConfigService.is_keep_priority_on_conversion",
return_value=True,
):
result = sorter._apply_priority_mode_sort([demoted, exact], db, None, "openai:chat")

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from types import SimpleNamespace
from src.services.cache.aware_scheduler import ProviderCandidate
from src.services.scheduling.aware_scheduler import ProviderCandidate
def _make_candidate(