refactor: make capability a tier list, since "can it be off" is one entry
The boolean could say a model reasons or does not. It could not say what GLM-5.3 and Gemini 3 Pro actually do: refuse to stop reasoning while still letting you ask for less. So capability becomes the list of tiers a model serves, and `none`'s presence in it is what "can_disable" now reads. Effort carries `auto` alongside the strength tiers. Nine of the models on our gateway are pure switches with no tier to name, and without `auto` they would have to borrow a strength tier to mean "on" — which is the exact bug this work exists to remove. Tiers land as documented guesses from four registries that agree; every entry says so in its evidence, and task 10 replaces them with measurements.
This commit is contained in:
@@ -167,6 +167,53 @@ def canonical_sampling_json(merged: Mapping[str, Any]) -> str | None:
|
||||
return json.dumps(dict(merged), sort_keys=True, ensure_ascii=False)
|
||||
|
||||
|
||||
class Effort(StrEnum):
|
||||
"""推理强度档位的封闭词汇(设计 §3.1)。
|
||||
|
||||
取值直接写进请求体(`reasoning_effort` 等键),**改名即改变发出去的字节**,
|
||||
且会进缓存 key 与遥测落库,历史数据会断层。
|
||||
|
||||
八档而非六档: `none`(不推理)与 `auto`(推理,档位由模型自定)必须同时存在。
|
||||
`auto` 不可省——newapi 上 26 个可调用模型里有 9 个是**纯开关型**(qwen 五个、
|
||||
MiniMax-M3、glm-5/5.1/4.6v),它们能开推理却没有强度档可填;没有 `auto` 就只
|
||||
能拿某个强度档冒充"开",而那正是本次要修的病根(旧 `thinking_on` 硬编码
|
||||
`medium`,可 `medium` 在 GLM/kimi/deepseek 的档位表里根本不存在)。
|
||||
|
||||
词汇取四家参考实现共同收敛的一套(cherry-studio 的 canonical selection、
|
||||
OpenRouter 的 `supported_efforts`、LiteLLM 的 `reasoning_effort_levels`、
|
||||
new-api 的 `relayconvert/reasoning`),不自创。
|
||||
|
||||
**枚举定义在最内层而非决策层**: 它是 `SourceConfig`/`ChatRequest`/
|
||||
`LLMResponse` 的字段类型,放进 `thinking.py` 会让 `types.py` 反向 import
|
||||
决策模块(P7 依赖铁律),与 `ThinkingObservation` 同一理由。
|
||||
"""
|
||||
|
||||
NONE = "none"
|
||||
AUTO = "auto"
|
||||
MINIMAL = "minimal"
|
||||
LOW = "low"
|
||||
MEDIUM = "medium"
|
||||
HIGH = "high"
|
||||
XHIGH = "xhigh"
|
||||
MAX = "max"
|
||||
|
||||
|
||||
EFFORT_ORDER: tuple[Effort, ...] = (
|
||||
Effort.NONE,
|
||||
Effort.MINIMAL,
|
||||
Effort.LOW,
|
||||
Effort.MEDIUM,
|
||||
Effort.HIGH,
|
||||
Effort.XHIGH,
|
||||
Effort.MAX,
|
||||
)
|
||||
"""由弱到强的强度序;`AUTO` **不在其中**——它是"由模型自定",在强弱轴上没有位置。
|
||||
|
||||
供能力表求"最省的开启档"与 `nearest` 映射取最近档。公开(非 `_` 前缀)是因为
|
||||
`thinking.py` 要跨模块消费它,跨模块引用私有名是坏味道。
|
||||
"""
|
||||
|
||||
|
||||
class ThinkingObservation(StrEnum):
|
||||
"""一次调用中"推理是否真的发生"的裁定结果(issue #16/#17)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user