auto 档在 on_base 为空的 provider 上表达不了「开」,ENABLE_THINKING=true 会静默不推理 #21

Closed
opened 2026-09-05 22:36:56 +08:00 by iomgaa · 1 comment
Owner

一句话

auto 档在 on_base 为空的 provider 上表达不了「开推理」,而 resolve_thinking 的 Phase 5 又无条件放行它——于是 ENABLE_THINKING=true 配在 MiniMax-M3 上会静默不推理。1.3.3 已用权宜之计堵住 minimax 一段,正解待本 issue。

怎么发现的

2026-09-05 T10 经 new-api 对 26 个模型逐个实测(约 500 次真实调用)时撞到。当时的判断是「on_base={} + AUTO 不注入任何参数,语义仍是『开』,因为这些模型默认都推理」——实测推翻了它: MiniMax-M3 不发任何推理参数时 5/5 轮不推理,而六个强度值 minimal/low/medium/high/xhigh/max 全部生效且彼此等价。

机制

三层各让一步,合起来就是静默:

层 行为 为什么堵不住
provider wire minimax.on_base = {} 「开」这件事本身不发任何字节,完全依赖「模型默认就推理」这个前提
能力表 M3 的 supported_efforts 实测为 (none, minimal, low, medium, high, xhigh, max),不含 auto 表里已经如实记了「本模型没有 auto 这一档」
resolve_thinking Phase 5 对 auto 无条件放行,不查清单 放行的理由是: auto 在请求体里是「不写 effort_key」而非某个取值,可满足性只取决于 on_base 在不在

第三层的理由在 on_base 非空时成立(qwen/deepseek/zhipu/moonshot: 发 enable_thinking:true 或 thinking.type:enabled,确实与档位无关),在 on_base 为空时不成立——那时「开」根本没有载体。

1.3.3 做了什么(权宜)

把 minimax.on_base 改回 {"reasoning_effort": "medium"}(与本次换代前逐字相同),恢复旧行为。代价是退回了「库替下游选一个档」,而那正是本次工作要消灭的东西。

只动了 minimax 一段。openai/anthropic/google 三段同样是 on_base={},但它们涉及的模型(gpt-5.x / claude-5 / gemini-3)默认都推理(OpenRouter 记 default_enabled: true 或 mandatory: true),未被实测覆盖(claude 撞 7 天限额、gemini 上游报错、gpt-5.4 全账号限流),故按无证据不动处理。

正解的几个方向(未定,需 brainstorming + 人类门)

  1. 让 auto 受能力表约束: 清单不含 auto 时报错并指路显式档位。语义最干净,但会让存量 ENABLE_THINKING=true 配在档位型模型上一律报错——需要评估三项目迁移影响。
  2. 能力表记「默认是否推理」: 恢复一个类似 default_enabled 的事实字段(初稿曾有 default_effort,因当时无消费者被删,现在有了)。auto 在「默认不推理」的模型上转为报错或映射到最省档。
  3. wire 增 auto_effort 字段: 由 provider 声明「auto 该发什么」,minimax 填一个档。比方向 2 少一张表,但把模型级事实塞进了 provider 级声明,与既有的形态/能力分层相悖。

选型时注意: 这三条都改变公共行为,按 CLAUDE.md 属 MANDATORY brainstorming + 人类确认。

验收判据

ENABLE_THINKING=true + MiniMax-M3 时,库要么真的开启推理,要么明确报错并给出可执行档位——不允许静默不推理。且 openai/anthropic/google 三段在其模型被实测覆盖后,同一判据要重跑一遍。

## 一句话 `auto` 档在 `on_base` 为空的 provider 上表达不了「开推理」,而 `resolve_thinking` 的 Phase 5 又无条件放行它——于是 `ENABLE_THINKING=true` 配在 MiniMax-M3 上会静默不推理。1.3.3 已用权宜之计堵住 minimax 一段,正解待本 issue。 ## 怎么发现的 2026-09-05 T10 经 new-api 对 26 个模型逐个实测(约 500 次真实调用)时撞到。当时的判断是「`on_base={}` + `AUTO` 不注入任何参数,语义仍是『开』,因为这些模型默认都推理」——**实测推翻了它**: MiniMax-M3 不发任何推理参数时 5/5 轮不推理,而六个强度值 minimal/low/medium/high/xhigh/max 全部生效且彼此等价。 ## 机制 三层各让一步,合起来就是静默: | 层 | 行为 | 为什么堵不住 | |---|---|---| | provider wire | `minimax.on_base = {}` | 「开」这件事本身不发任何字节,完全依赖「模型默认就推理」这个前提 | | 能力表 | M3 的 `supported_efforts` 实测为 `(none, minimal, low, medium, high, xhigh, max)`,**不含 `auto`** | 表里已经如实记了「本模型没有 auto 这一档」 | | `resolve_thinking` | Phase 5 对 `auto` **无条件放行**,不查清单 | 放行的理由是: `auto` 在请求体里是「不写 `effort_key`」而非某个取值,可满足性只取决于 `on_base` 在不在 | 第三层的理由在 `on_base` 非空时成立(qwen/deepseek/zhipu/moonshot: 发 `enable_thinking:true` 或 `thinking.type:enabled`,确实与档位无关),在 `on_base` 为空时不成立——那时「开」根本没有载体。 ## 1.3.3 做了什么(权宜) 把 `minimax.on_base` 改回 `{"reasoning_effort": "medium"}`(与本次换代前逐字相同),恢复旧行为。代价是退回了「库替下游选一个档」,而那正是本次工作要消灭的东西。 只动了 minimax 一段。`openai`/`anthropic`/`google` 三段同样是 `on_base={}`,但它们涉及的模型(gpt-5.x / claude-5 / gemini-3)默认都推理(OpenRouter 记 `default_enabled: true` 或 `mandatory: true`),**未被实测覆盖**(claude 撞 7 天限额、gemini 上游报错、gpt-5.4 全账号限流),故按无证据不动处理。 ## 正解的几个方向(未定,需 brainstorming + 人类门) 1. **让 `auto` 受能力表约束**: 清单不含 `auto` 时报错并指路显式档位。语义最干净,但会让存量 `ENABLE_THINKING=true` 配在档位型模型上一律报错——需要评估三项目迁移影响。 2. **能力表记「默认是否推理」**: 恢复一个类似 `default_enabled` 的事实字段(初稿曾有 `default_effort`,因当时无消费者被删,现在有了)。`auto` 在「默认不推理」的模型上转为报错或映射到最省档。 3. **wire 增 `auto_effort` 字段**: 由 provider 声明「`auto` 该发什么」,minimax 填一个档。比方向 2 少一张表,但把模型级事实塞进了 provider 级声明,与既有的形态/能力分层相悖。 选型时注意: 这三条都改变公共行为,按 CLAUDE.md 属 MANDATORY brainstorming + 人类确认。 ## 验收判据 `ENABLE_THINKING=true` + MiniMax-M3 时,库要么真的开启推理,要么明确报错并给出可执行档位——**不允许静默不推理**。且 `openai`/`anthropic`/`google` 三段在其模型被实测覆盖后,同一判据要重跑一遍。
Author
Owner

已登记 AUTO 必须为能力成员,True 糖同约束,nearest 不代选强度;MiniMax on_base 为空,M3 True/AUTO 明确拒绝并指向显式档。受管与 raw 推理控制同值/被遮蔽也拒绝,raw-only 保留。下载包独立安装已复验 AUTO 与冲突拒绝。受影响缓存必须在首次新语义读写前更换 namespace/salt,未迁移仍可能回放旧语义。

发布:v1.3.4,main/tag 提交 af57f93adce24b43fd10b6d8e1281ab8ee43c0a8。合并后 make lint 通过;make test:1518 passed / 23 skipped / 108 deselected,95%覆盖率;定向 M2.5/M2.7 AUTO:2 passed(各5轮,并发1);Redis时间语义:18 passed。wheel/sdist 从 registry 独立下载,散列与构建一致,解包及独立 target 安装行为、README元数据通过;Release正文、包页面正文和仓库链接已亲查。

2026-09-09 用户批准不补全模型矩阵:embedding 503仍FAIL、claude-opus-5开启命题仍FAIL,UNKNOWN/身份不足/不可达/缺轮/缺下游现行配置证据保持例外,不改成PASS,不宣称三项目已完成迁移。

Release · 包页面 · 验证与例外记录
原始本轮日志:tests/outputs/134/publish-20260909/;既有红绿与独立审查见上述验证记录。

已登记 AUTO 必须为能力成员,True 糖同约束,nearest 不代选强度;MiniMax on_base 为空,M3 True/AUTO 明确拒绝并指向显式档。受管与 raw 推理控制同值/被遮蔽也拒绝,raw-only 保留。下载包独立安装已复验 AUTO 与冲突拒绝。受影响缓存必须在首次新语义读写前更换 namespace/salt,未迁移仍可能回放旧语义。 发布:v1.3.4,main/tag 提交 af57f93adce24b43fd10b6d8e1281ab8ee43c0a8。合并后 make lint 通过;make test:1518 passed / 23 skipped / 108 deselected,95%覆盖率;定向 M2.5/M2.7 AUTO:2 passed(各5轮,并发1);Redis时间语义:18 passed。wheel/sdist 从 registry 独立下载,散列与构建一致,解包及独立 target 安装行为、README元数据通过;Release正文、包页面正文和仓库链接已亲查。 2026-09-09 用户批准不补全模型矩阵:embedding 503仍FAIL、claude-opus-5开启命题仍FAIL,UNKNOWN/身份不足/不可达/缺轮/缺下游现行配置证据保持例外,不改成PASS,不宣称三项目已完成迁移。 [Release](https://gitea.iomgaa.online/iomgaa/PolyGateway/releases/tag/v1.3.4) · [包页面](https://gitea.iomgaa.online/iomgaa/-/packages/pypi/polygateway/1.3.4) · [验证与例外记录](https://gitea.iomgaa.online/iomgaa/PolyGateway/src/tag/v1.3.4/research-wiki/findings/2026-09-09-134-thinking-contracts-validation.md) 原始本轮日志:tests/outputs/134/publish-20260909/;既有红绿与独立审查见上述验证记录。
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: iomgaa/PolyGateway#21