docs: measure the 1.3.3 notes against 1.3.2, not against this branch
The behaviour section described round trips that only ever existed inside the branch. Verified every claim against `git show 6ec9ec7:<file>` plus a 300-combo side-by-side run (4 old provider slots x 25 models x three ENABLE_THINKING states); exactly two differences exist. - glm-5.3 / glm-5.3-flash / gemini-3.1-pro are newly registered as unable to stop reasoning. They were unregistered in 1.3.2, so ENABLE_THINKING=false passed; now it fails at assembly. That is the one change that breaks an existing config, so it leads the table. - The openai slot moves from "shape unknown, refuse at assembly" to the standard OpenAI shapes in both directions. Neither openai nor anthropic nor google ever injected medium; minimax did and still does, byte for byte. - kimi-k3 was never registered before, so it changes nothing for anyone. Moved to new capabilities as a first registration. - Both keyword and positional ThinkingCapability construction break, not just positional; spell out the migration form. .env.example: name all eight registry slots, and say that "on" injects nothing on the three slots whose on_base is empty.
This commit is contained in:
+6
-2
@@ -2,7 +2,8 @@
|
||||
# 键名清单 = M1 设计文档 §8 定稿;缺关键配置直接报错,不做默认值兜底。
|
||||
|
||||
# ══ 多源配置: {SCOPE}__{PROVIDER}__{N}__{FIELD} ══
|
||||
# PROVIDER 必须是注册表键(qwen/deepseek/openai,或 register_provider 注册后经 registry 传入)。
|
||||
# PROVIDER 必须是注册表键(八段: qwen/deepseek/zhipu/moonshot/minimax/openai/anthropic/google,
|
||||
# 或 register_provider 注册后经 registry 传入)。
|
||||
# 必填: BASE_URL / API_KEY / MODEL / TIMEOUT_S(或用平铺 LLM_TIMEOUT 作缺省)。
|
||||
LLM__QWEN__1__BASE_URL=
|
||||
LLM__QWEN__1__API_KEY=
|
||||
@@ -15,8 +16,11 @@ LLM__QWEN__1__TIMEOUT_S=120
|
||||
# LLM__QWEN__1__EST_TOKENS=2000 # 可选调优覆盖: TPM 入场预扣量;未填则库按 tpm//60 派生
|
||||
# LLM__QWEN__1__TTFT_TIMEOUT_S=30 # 须与 INTER_TOKEN 成对;0 < inter < ttft < timeout
|
||||
# LLM__QWEN__1__INTER_TOKEN_TIMEOUT_S=15
|
||||
# LLM__QWEN__1__ENABLE_THINKING=true # 三态: 缺省=不注入 / true=注入开启 / false=注入关闭
|
||||
# LLM__QWEN__1__ENABLE_THINKING=true # 三态: 缺省=不表态 / true=要求开启 / false=要求关闭
|
||||
# 本键是 REASONING_EFFORT 的语法糖: true ≡ auto、false ≡ none、缺省 ≡ 不表态
|
||||
# "要求开启"注入什么随 provider 段而定: openai/anthropic/google 三段的开启形态是
|
||||
# on_base={}——一个字节都不注入,走模型自己的默认档(该默认档若不推理,本键不会报错
|
||||
# 也不会开推理,见 CHANGELOG 1.3.3「已知限制」/ issue #21);要确保开启请配 REASONING_EFFORT
|
||||
# LLM__QWEN__1__REASONING_EFFORT=low # 本源默认推理档位;缺省=不表态(随模型自己的默认档)
|
||||
# 八档(封闭词汇): none | auto | minimal | low | medium | high | xhigh | max
|
||||
# none = 要求不推理(与"缺省不表态"是两回事);auto = 要求推理但不指定强度
|
||||
|
||||
+20
-8
@@ -10,24 +10,34 @@
|
||||
|
||||
| # | 位置 | 变更 | 谁会当场断 |
|
||||
|---|---|---|---|
|
||||
| 1 | `ThinkingCapability` | 构造签名 `can_disable: bool` → `supported_efforts: tuple[Effort, ...]` | 自建能力表、**按位置参数**构造的调用方 |
|
||||
| 1 | `ThinkingCapability` | 构造签名 `can_disable: bool` → `supported_efforts: tuple[Effort, ...]` | 自建能力表的调用方(**关键字与位置两种构造都断**) |
|
||||
| 2 | `ports.Transport.complete()` | 新增**无默认值**参数 `reasoning_effort` | 任何自建 transport 实现 |
|
||||
| 3 | `ports.TelemetryRecorder.record_llm_call()` | 新增无默认值参数 `reasoning_effort`(25 → 26 参) | 任何自建 recorder 实现 |
|
||||
| 4 | `thinking.resolve_thinking()` | 第三参数由 `bool` 换成 `Effort`,**返回类型由 `Mapping` 改为 `ThinkingResolution`** | 直调它的读侧代码一律断 |
|
||||
| 5 | `providers.ProviderProfile` | 两个字段 `thinking_on` / `thinking_off` → 单字段 `thinking: ThinkingWire` | 自建 profile 的调用方 |
|
||||
|
||||
第 1 条的 `can_disable` **保留为只读派生属性**(`Effort.NONE in supported_efforts`),只读它的代码一行不用改;不可兼容的只有位置参数构造。第 2、3 条按这两个端口的既有纪律**不设默认值**:库外没有第三方实现者,带默认值只会让漏传时静默落一个默认值。第 4 条的新返回值是 `ThinkingResolution(payload, applied_effort)`——原来那个 mapping 现在是 `.payload`,多出来的 `.applied_effort` 是开了 `nearest` 映射后**真正发出去**的那一档。
|
||||
第 1 条的 `can_disable` **保留为只读派生属性**(`Effort.NONE in supported_efforts`),只读它的代码一行不用改;**构造则两种写法都断**:
|
||||
|
||||
| 1.3.2 的写法 | 升级后 |
|
||||
|---|---|
|
||||
| `ThinkingCapability(can_disable=True, evidence="…")`(库自己那张表用的就是它) | `TypeError: ... got an unexpected keyword argument 'can_disable'` |
|
||||
| `ThinkingCapability(True, "…")` | `TypeError: 'bool' object is not iterable`——断在 `__post_init__` 的去重校验里,错误信息看不出真实原因 |
|
||||
| 迁移写法 | `ThinkingCapability(supported_efforts=(Effort.NONE, Effort.AUTO), evidence="…")` |
|
||||
|
||||
第 2、3 条按这两个端口的既有纪律**不设默认值**:库外没有第三方实现者,带默认值只会让漏传时静默落一个默认值。第 4 条的新返回值是 `ThinkingResolution(payload, applied_effort)`——原来那个 mapping 现在是 `.payload`,多出来的 `.applied_effort` 是开了 `nearest` 映射后**真正发出去**的那一档。
|
||||
|
||||
### 请先读这一条(二):不改一行代码也会变的四条行为
|
||||
|
||||
| # | 变更 | 影响 |
|
||||
|---|---|---|
|
||||
| 1 | `openai` / `anthropic` / `google` 三段的「开」由注入 `{"reasoning_effort":"medium"}` 改为**不注入任何档位**(`on_base={}`) | `ENABLE_THINKING=true` 的下游从此走模型自己的默认档。旧版那个 `medium` 是库替下游做的档位判断,而 `medium` 在 GLM / kimi / deepseek 的档位表里根本不存在,正是本版要消灭的东西。要指定强度请显式配 `REASONING_EFFORT` |
|
||||
| 2 | `openai` 段的**关闭形态**由「形态未知即报错」放宽为 OpenAI 标准形态 | 把别家模型挂在 `openai` 段下并配 `ENABLE_THINKING=true` 的下游:旧版在**装配期**报错,新版既不报错、也不注入任何字节 |
|
||||
| 3 | `kimi-k3` 由「不可关闭」改为**可关闭** | 1.3.x 此前给它配 `ENABLE_THINKING=false`(等价 `reasoning_effort=none`)会报错并把你指向 `low` 档;本版直接放行。改的依据是实测推翻了当初的保守登记:请求 `none` 后短提示词 5/5 轮 + 长上下文 3/3 轮无任何推理信号、completion 恒 9 token,与同模型 max 档的锚点可分 |
|
||||
| 4 | 缓存 key 加入 `reasoning_effort` | 只有**新配** `REASONING_EFFORT` 的源冷启动一次;只配 `ENABLE_THINKING` 或什么都没配的源,key 字面量逐字不变 |
|
||||
| 1 | `glm-5.3` / `glm-5.3-flash` / `gemini-3.1-pro` **首次进入能力表**,且三者都登记为**关不掉推理** | **本版唯一会打断存量配置的一条。** 1.3.2 里这三个型号未登记,给它们配 `ENABLE_THINKING=false` 会按 provider 形态尽力注入并**放行**(只发一条 warning);本版在**装配期**抛 `ThinkingUnsupportedError`。并排实测:`deepseek/glm-5.3 + ENABLE_THINKING=false` 在 1.3.2 返回 `{"thinking": {"type": "disabled"}}`,在本版当场报错 |
|
||||
| 2 | `openai` 段的**开启**方向由「形态未知即装配期报错」放宽为 `on_base={}` | 把任意兼容厂商挂在 `openai` 段下并配 `ENABLE_THINKING=true` 的下游:1.3.2 在装配期报错,本版放行且**一个字节都不注入**——走模型自己的默认档。若该模型默认不推理,这个配置既不报错也不开推理(见下方「已知限制」) |
|
||||
| 3 | `openai` 段的**关闭**方向由「形态未知即装配期报错」放宽为 `{"reasoning_effort": "none"}` | 同上但配 `ENABLE_THINKING=false` 的下游:1.3.2 在装配期报错,本版下发这个片段。放宽的依据是 `reasoning_effort` 是 OpenAI **官方**字段而非厂商方言,经网关的兼容端点不会把它打到不认识它的厂商 |
|
||||
| 4 | 缓存 key 加入 `reasoning_effort` | 只有**新配** `REASONING_EFFORT` 的源冷启动一次;只配 `ENABLE_THINKING` 或什么都没配的源,key 字面量逐字不变(已按 1.3.2 的实现逐字比对) |
|
||||
|
||||
**`minimax` 段是第 1 条的例外,本版对 minimax 下游没有任何行为变化。** 原本四段一并改,但真实网关实测显示 MiniMax-M3 在不带任何推理参数时**不推理**(5/5 轮),而 openai / anthropic / google 三家的模型默认推理。对 minimax 而言「不注入即为开」这个前提不成立,改了会让存量 `ENABLE_THINKING=true` 的调用**静默停止推理**,故该段的 `on_base` 维持旧的 `{"reasoning_effort": "medium"}` 逐字不变。
|
||||
第 1 条是设计上有意为之:调用方要的是「不推理」的语义保证,给不了就必须说,而不是让它继续静默烧推理 token——升级后当场失败,正是这三个型号本来就关不掉推理的证据。报错文案带一条能立刻照做的替代(该模型最省的那一档 + 该配的 env 键名),不把人推回 `extra_body` 那条绕过库的路。
|
||||
|
||||
**`qwen` / `deepseek` / `minimax` 三段的注入形态逐字未变。** 全量比对(4 个 1.3.2 已有的 provider 段 × 25 个模型 × `ENABLE_THINKING` 三态 = 300 种组合)显示,本版与 1.3.2 的差异**只有上表第 1、2、3 条**。`minimax` 的「开」尤其值得点名:它维持 `{"reasoning_effort": "medium"}` 逐字不变,因为真实网关实测显示 MiniMax-M3 在不带任何推理参数时**不推理**(5/5 轮),把它改成「不注入即为开」会让存量 `ENABLE_THINKING=true` 的调用静默停止推理。
|
||||
|
||||
### 新增能力
|
||||
|
||||
@@ -38,7 +48,9 @@
|
||||
| `{SCOPE}__{PROVIDER}__{N}__EFFORT_FALLBACK` | `error`(缺省,报错)或 `nearest`(映射到最近档并 warning)。默认报错的理由是钱:一次静默的 `medium → max` 在部分模型上是数倍账单 |
|
||||
| `chat(reasoning_effort=...)` | 请求级覆盖,优先级高于源级;裸字符串会在入口归一 |
|
||||
| `LLMResponse.applied_effort` | 本次**实际**跑在哪一档(开了 `nearest` 时与请求档分叉)。字段追加在末尾,既有字段只增不改名 |
|
||||
| 四个新 provider 段 `zhipu` / `moonshot` / `anthropic` / `google` | 连同既有 `qwen` / `deepseek` / `minimax` / `openai` 共八段 |
|
||||
| 四个新 provider 段 `zhipu` / `moonshot` / `anthropic` / `google` | 连同 1.3.2 已有的 `qwen` / `deepseek` / `minimax` / `openai` 共**八段**。四段都是新增,不改变任何存量配置的行为 |
|
||||
| 能力表由 **5 条扩到 24 条** | 1.3.2 只登记 5 个型号,其余一律走「按 provider 形态尽力注入 + warning」。本版新登记 19 个:qwen 4 款、deepseek 2 款、GLM 6 款、kimi 2 款、gpt 2 款、claude 2 款、gemini 1 款 |
|
||||
| `kimi-k3` **首次登记**为可关闭 | 它在 1.3.2 未登记(配 `false` 走尽力注入 + warning,不报错)。本版实测坐实可关:请求 `none` 后短提示词 5/5 轮 + 长上下文 3/3 轮无任何推理信号、completion 恒 9 token,与同模型 max 档(rt 33-146)的锚点可分。两源分歧由此了结——OpenRouter 的 `mandatory:false` 是对的,官方档位表没列 `none` 只是没列 |
|
||||
| 包根新增导出 `Effort` / `EFFORT_ORDER` / `ThinkingWire` / `ThinkingResolution` | 深路径 import 会被内部重组打断,一律从 `polygateway` 包根取 |
|
||||
|
||||
档位不支持时**报错必带可执行替代**:模型关不掉推理时,错误文案直接给出该模型最省的那一档和该配的 env 键名。只报错不给出路,下游只会退回 `extra_body`——而那正是 issue #20 的成因。
|
||||
|
||||
Reference in New Issue
Block a user