mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-01 17:00:21 +08:00
fix: 流式响应健壮性增强与候选排序稳定性修复
- test-model 接口优先使用流式请求,失败自动回退非流式 - CLI 流式处理在 StreamClosed/RemoteProtocolError 时 flush 残余 SSE 数据,捕获尾部 usage - 流未正常完成时兜底估算 tokens,避免 usage 记录为 0 - ProviderCandidate 添加 __lt__ 解决 tuple 排序 TypeError - sorted() 添加显式 key 参数避免隐式比较候选对象 - 异常日志改用 logger.opt(exception=e) 替代手动 traceback
This commit is contained in:
81
tests/unit/test_provider_candidate_ordering.py
Normal file
81
tests/unit/test_provider_candidate_ordering.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from types import SimpleNamespace
|
||||
|
||||
from src.services.cache.aware_scheduler import ProviderCandidate
|
||||
|
||||
|
||||
def _make_candidate(
|
||||
*,
|
||||
provider_priority: int | None,
|
||||
internal_priority: int | None,
|
||||
provider_id: str,
|
||||
endpoint_id: str,
|
||||
key_id: str,
|
||||
) -> ProviderCandidate:
|
||||
provider = SimpleNamespace(id=provider_id, name="p", provider_priority=provider_priority)
|
||||
endpoint = SimpleNamespace(id=endpoint_id)
|
||||
key = SimpleNamespace(id=key_id, internal_priority=internal_priority)
|
||||
return ProviderCandidate(provider=provider, endpoint=endpoint, key=key) # type: ignore[arg-type]
|
||||
|
||||
|
||||
def test_provider_candidate_is_orderable() -> None:
|
||||
c1 = _make_candidate(
|
||||
provider_priority=1,
|
||||
internal_priority=1,
|
||||
provider_id="p1",
|
||||
endpoint_id="e1",
|
||||
key_id="k1",
|
||||
)
|
||||
c2 = _make_candidate(
|
||||
provider_priority=1,
|
||||
internal_priority=2,
|
||||
provider_id="p1",
|
||||
endpoint_id="e1",
|
||||
key_id="k2",
|
||||
)
|
||||
|
||||
assert c1 < c2
|
||||
assert sorted([c2, c1]) == [c1, c2]
|
||||
|
||||
|
||||
def test_provider_candidate_can_break_ties_in_tuple_sort() -> None:
|
||||
c1 = _make_candidate(
|
||||
provider_priority=1,
|
||||
internal_priority=1,
|
||||
provider_id="p1",
|
||||
endpoint_id="e1",
|
||||
key_id="k1",
|
||||
)
|
||||
c2 = _make_candidate(
|
||||
provider_priority=1,
|
||||
internal_priority=2,
|
||||
provider_id="p1",
|
||||
endpoint_id="e1",
|
||||
key_id="k2",
|
||||
)
|
||||
|
||||
# When the first tuple element ties, Python will compare the second element.
|
||||
# This should not raise:
|
||||
# TypeError: '<' not supported between instances of 'ProviderCandidate' and 'ProviderCandidate'
|
||||
pairs = [(0, c2), (0, c1)]
|
||||
assert [c for _score, c in sorted(pairs)] == [c1, c2]
|
||||
|
||||
|
||||
def test_provider_candidate_none_priorities_sort_last() -> None:
|
||||
c1 = _make_candidate(
|
||||
provider_priority=1,
|
||||
internal_priority=None,
|
||||
provider_id="p1",
|
||||
endpoint_id="e1",
|
||||
key_id="k1",
|
||||
)
|
||||
c2 = _make_candidate(
|
||||
provider_priority=None,
|
||||
internal_priority=None,
|
||||
provider_id="p2",
|
||||
endpoint_id="e1",
|
||||
key_id="k2",
|
||||
)
|
||||
|
||||
assert sorted([c2, c1]) == [c1, c2]
|
||||
Reference in New Issue
Block a user