fix: enforce registered auto reasoning capabilities
This commit is contained in:
+41
-19
@@ -285,16 +285,13 @@ class TestResolveThinking:
|
||||
get_provider("zhipu"), cap, Effort.NONE, model="glm-5.3", fallback="nearest"
|
||||
)
|
||||
|
||||
def test_phase4_only_blocks_the_off_direction(self):
|
||||
"""关不掉 ≠ 开不了: M2.x 默认就在推理,开的方向不该被拦。
|
||||
|
||||
期望片段 2026-09-05 由 `{}` 改成 minimax 的 `on_base` 实际值: issue #21 把
|
||||
该段的"开"改回带 medium(T2 的"开档不注入"是推定,T10 实测推翻)。本用例守的
|
||||
是 Phase 4 只拦关闭方向,注入什么由 wire 决定,故随 wire 走。
|
||||
"""
|
||||
cap = get_capability("MiniMax-M2.7")
|
||||
got = resolve_thinking(get_provider("minimax"), cap, Effort.AUTO, model="MiniMax-M2.7")
|
||||
assert got.payload == {"reasoning_effort": "medium"}
|
||||
@pytest.mark.parametrize("model", ["MiniMax-M2.5", "MiniMax-M2.7"])
|
||||
def test_phase4_only_blocks_the_off_direction(self, model):
|
||||
"""已登记 AUTO 只发开启片段,不由库代选 medium。"""
|
||||
got = resolve_thinking(
|
||||
get_provider("minimax"), get_capability(model), Effort.AUTO, model=model
|
||||
)
|
||||
assert got.payload == {}
|
||||
assert got.applied_effort is Effort.AUTO
|
||||
|
||||
def test_phase4_passes_when_none_is_registered(self):
|
||||
@@ -351,17 +348,42 @@ class TestResolveThinking:
|
||||
assert got.payload == {"thinking": {"type": "enabled"}, "reasoning_effort": "max"}
|
||||
assert got.applied_effort is Effort.MAX
|
||||
|
||||
def test_auto_never_trips_phase5(self):
|
||||
"""`auto` = 不指定档位,可满足性只取决于 wire 有没有 on_base。
|
||||
@pytest.mark.parametrize(
|
||||
"provider,model", [("deepseek", "deepseek-v4-pro"), ("minimax", "MiniMax-M3")]
|
||||
)
|
||||
@pytest.mark.parametrize("fallback", ["error", "nearest"])
|
||||
def test_unregistered_auto_choice_is_rejected(self, provider, model, fallback):
|
||||
"""有开启形态也不代表已登记模型支持 AUTO,nearest 不可代选。"""
|
||||
with pytest.raises(ThinkingUnsupportedError) as exc:
|
||||
resolve_thinking(
|
||||
get_provider(provider),
|
||||
get_capability(model),
|
||||
Effort.AUTO,
|
||||
model=model,
|
||||
fallback=fallback,
|
||||
)
|
||||
assert model in str(exc.value)
|
||||
assert "auto" in str(exc.value)
|
||||
assert "EFFORT_FALLBACK=nearest" not in str(exc.value)
|
||||
|
||||
它不是写进 `effort_key` 的取值,故不受档位清单约束。反过来判会让存量的
|
||||
`ENABLE_THINKING=true`(T5 起等价于 auto)在 deepseek/glm-5.3 这类清单里
|
||||
没有 auto 的模型上当场报错——设计 §12 明确承诺存量配置继续可跑。
|
||||
"""
|
||||
cap = get_capability("deepseek-v4-pro") # (none, high, max),清单里没有 auto
|
||||
got = resolve_thinking(get_provider("deepseek"), cap, Effort.AUTO, model="deepseek-v4-pro")
|
||||
assert got.payload == {"thinking": {"type": "enabled"}}
|
||||
def test_minimax_explicit_medium_restores_old_wire(self):
|
||||
got = resolve_thinking(
|
||||
get_provider("minimax"), get_capability("MiniMax-M3"), Effort.MEDIUM, model="MiniMax-M3"
|
||||
)
|
||||
assert got.payload == {"reasoning_effort": "medium"}
|
||||
assert got.applied_effort is Effort.MEDIUM
|
||||
|
||||
@pytest.mark.parametrize("provider", ["openai", "qwen"])
|
||||
def test_unknown_auto_warns_without_promising_effect(self, provider):
|
||||
messages, sink = _warnings()
|
||||
try:
|
||||
got = resolve_thinking(
|
||||
get_provider(provider), None, Effort.AUTO, model="unregistered-model"
|
||||
)
|
||||
finally:
|
||||
logger.remove(sink)
|
||||
assert got.applied_effort is Effort.AUTO
|
||||
assert any("不保证" in str(message) for message in messages)
|
||||
|
||||
# —— nearest 映射(fallback 的逃生口)——
|
||||
|
||||
|
||||
Reference in New Issue
Block a user