feat: wire the tier through the transport and keep each tier's warning distinct
The transport now hands back the tier it actually sent, and that tier rides TransportResult into LLMResponse. It is not the requested one: under EFFORT_FALLBACK=nearest a medium request goes out as low, and telemetry grouping by the requested tier would file the row under a tier that never left the process. Reconciliation judges the same tier instead of the old enable_thinking bool, and the warning throttle keys on it. Keyed on the bool, every tier of one model shared a single key, so the second contradiction was silenced for the lifetime of the transport. The predicate is an identity check against Effort.NONE on purpose -- the member's value is the non-empty string "none", so any truthiness test would send every strength tier down the "asked to disable" branch and invert the alarm.
This commit is contained in:
@@ -23,7 +23,7 @@ from polygateway.transports.openai_compat import (
|
||||
_iter_sse_deltas,
|
||||
_sse_data_payload,
|
||||
)
|
||||
from polygateway.types import ChatRequest, LLMResponse, SourceConfig, ThinkingObservation
|
||||
from polygateway.types import ChatRequest, Effort, LLMResponse, SourceConfig, ThinkingObservation
|
||||
|
||||
|
||||
def _source(**overrides):
|
||||
@@ -629,6 +629,60 @@ class TestThinkingReconciliation:
|
||||
hits = [m for m in messages if "MiniMax-M3" in m]
|
||||
assert len(hits) == 2, f"两个方向各应告警一次,实得 {len(hits)} 次"
|
||||
|
||||
async def test_each_tier_of_one_model_earns_its_own_warning(self):
|
||||
"""同一源同一模型的两个强度档是**两个独立的矛盾**,不得共用一个节流键。
|
||||
|
||||
节流键沿用旧的 `enable_thinking` 三态时,两次请求的键逐字相同(都是
|
||||
`None`——档位根本不经过那个字段),于是 `max` 档的矛盾被 `low` 档那次
|
||||
永久静音。档位化后 low 与 max 各喊一次,重复的 low 仍只喊一次。
|
||||
"""
|
||||
transport = _transport_for(self._zero_signal)
|
||||
source = _source(name="zp", provider="zhipu", model="glm-5.3")
|
||||
messages: list[str] = []
|
||||
sink_id = logger.add(messages.append, level="WARNING")
|
||||
try:
|
||||
await _complete(transport, source, reasoning_effort=Effort.LOW)
|
||||
await _complete(transport, source, reasoning_effort=Effort.LOW)
|
||||
await _complete(transport, source, reasoning_effort=Effort.MAX)
|
||||
finally:
|
||||
logger.remove(sink_id)
|
||||
hits = [m for m in messages if "glm-5.3" in m]
|
||||
assert len(hits) == 2, f"low 与 max 应各告警一次,实得 {len(hits)} 次"
|
||||
|
||||
def _zero_signal(self, request):
|
||||
"""零推理信号的成功响应 → UNKNOWN,与"要求开启"矛盾(M3 实测形态)。"""
|
||||
return _sse_stream(_chunk(content="ok"), _chunk(usage=_USAGE))
|
||||
|
||||
|
||||
class TestAppliedTierLeavesTheTransport:
|
||||
"""本次**实际**发出去的档必须随 TransportResult 上浮(设计 §4.1 / 计划 T8-5)。
|
||||
|
||||
不上浮就只能由遥测自己再算一遍请求档,而 `nearest` 映射后两者不同——压测
|
||||
要按档分组的那一列会挂在一个从未真正发出过的档下,且错得看不出来。
|
||||
"""
|
||||
|
||||
def _ok(self, request):
|
||||
return _sse_stream(_chunk(content="ok"), _chunk(usage=_USAGE))
|
||||
|
||||
async def test_result_carries_the_mapped_tier_not_the_requested_one(self):
|
||||
"""glm-5.3 只有 low/high/max: 请求 `medium`,实际发出的是 `low`。"""
|
||||
transport = _transport_for(self._ok)
|
||||
source = _source(provider="zhipu", model="glm-5.3", effort_fallback="nearest")
|
||||
result = await _complete(transport, source, reasoning_effort=Effort.MEDIUM)
|
||||
assert result.applied_effort is Effort.LOW
|
||||
|
||||
async def test_result_carries_the_tier_that_was_asked_for_when_supported(self):
|
||||
transport = _transport_for(self._ok)
|
||||
source = _source(provider="zhipu", model="glm-5.3")
|
||||
result = await _complete(transport, source, reasoning_effort=Effort.MAX)
|
||||
assert result.applied_effort is Effort.MAX
|
||||
|
||||
async def test_no_statement_stays_none(self):
|
||||
"""不表态时库既不注入也不推定模型默认档——"没看见"不许说成"发生了"。"""
|
||||
transport = _transport_for(self._ok)
|
||||
result = await _complete(transport, _source())
|
||||
assert result.applied_effort is None
|
||||
|
||||
|
||||
class TestNonStreamFastPath:
|
||||
async def test_non_stream_parses_message(self):
|
||||
|
||||
Reference in New Issue
Block a user