fix: enforce registered auto reasoning capabilities
This commit is contained in:
+16
-12
@@ -471,11 +471,8 @@ def resolve_thinking(
|
||||
信息与可执行替代,下游随后就会去找 `extra_body` 那条绕过的路,而那正是
|
||||
issue #20 的成因。
|
||||
|
||||
**`auto` 不受档位清单约束**: 它表达的是"开启,但不指定强度",在请求体里就是
|
||||
"不写 `effort_key`",而不是写进 `effort_key` 的某个取值,故 Phase 5 放行它。
|
||||
反过来判会让存量的 `ENABLE_THINKING=true`(T5 起等价于 `auto`)在 deepseek-v4
|
||||
与 glm-5.3 这类清单里没有 `auto` 的模型上当场报错,而设计 §12 明确承诺存量
|
||||
配置继续可跑——那里唯一允许新报错的是"关闭一个官方不可关的模型"。
|
||||
**已登记的 AUTO 同样受清单约束**: 开启形态不证明模型支持不指定强度。
|
||||
AUTO 不在强弱轴上,不允许 nearest 静默代选付费档位;未知模型仍尽力并告警。
|
||||
|
||||
`model` 只用于错误与告警文案: 报错能定位到具体模型才有可操作性,而
|
||||
`capability` 为 None(未登记)时无从从别处取得模型名。
|
||||
@@ -517,7 +514,7 @@ def resolve_thinking(
|
||||
# 带一条能立刻照做的替代(见 docstring: 4 先于 5 的理由)
|
||||
if effort is Effort.NONE and not capability.can_disable:
|
||||
raise ThinkingUnsupportedError(_cannot_disable(model, capability))
|
||||
# Phase 5: 档位打空 —— 报错或按 fallback 映射(auto 例外,见 docstring)
|
||||
# Phase 5: 已登记选择必须可满足;AUTO 不允许按强度距离映射
|
||||
applied = _settle_tier(effort, capability, model=model, fallback=fallback)
|
||||
return ThinkingResolution(_inject(profile, applied, model=model), applied)
|
||||
|
||||
@@ -544,12 +541,15 @@ def _settle_tier(
|
||||
) -> Effort:
|
||||
"""Phase 5: 请求档在不在清单里;不在则按 `fallback` 映射或报错,返回**实际**档。
|
||||
|
||||
`auto` 直接放行: 它不是写进 `effort_key` 的取值,而是"不写 effort_key"
|
||||
(理由见 `resolve_thinking` 的 docstring)。
|
||||
AUTO 与强度档统一检查成员,但不参与最近强度映射。
|
||||
"""
|
||||
if effort is Effort.AUTO or effort in capability.supported_efforts:
|
||||
if effort in capability.supported_efforts:
|
||||
return effort
|
||||
mapped = _nearest_effort(effort, capability) if fallback == "nearest" else None
|
||||
mapped = (
|
||||
_nearest_effort(effort, capability)
|
||||
if fallback == "nearest" and effort is not Effort.AUTO
|
||||
else None
|
||||
)
|
||||
if mapped is None:
|
||||
raise ThinkingUnsupportedError(
|
||||
_tier_unsupported(model, effort, capability, fallback=fallback)
|
||||
@@ -634,7 +634,11 @@ def _tier_unsupported(
|
||||
else f"该模型只有开关、没有强度档位,可用: {listed}"
|
||||
)
|
||||
# 已经开着 nearest 还走到这里,说明映射本身无解,再劝一遍是废话
|
||||
hint = "" if fallback == "nearest" else ";若希望自动落到最近的档,请配 EFFORT_FALLBACK=nearest"
|
||||
hint = (
|
||||
""
|
||||
if fallback == "nearest" or effort is Effort.AUTO
|
||||
else ";若希望自动落到最近的档,请配 EFFORT_FALLBACK=nearest"
|
||||
)
|
||||
return f"{head}{body}{hint}"
|
||||
|
||||
|
||||
@@ -676,7 +680,7 @@ def _warn_unregistered(
|
||||
) -> None:
|
||||
logger.warning(
|
||||
"模型 {} 的推理能力未登记,按 provider {} 的形态尽力注入 {}(请求档位 {});"
|
||||
"若该模型实际不支持这一档,本次设置将静默失效。实测后请用 register_capability 登记",
|
||||
"不保证开启、关闭或强度生效。实测后请用 register_capability 登记",
|
||||
model,
|
||||
profile.name,
|
||||
dict(payload),
|
||||
|
||||
Reference in New Issue
Block a user