Repository navigation
feat: support GPT-5 and GPT-6 reasoning effort configuration - #11295
Conversation
E2E test reportResult: VERIFIED_FIXED — 21/21 scenarios passed. Tested on macOS with Node.js 22.22.2. The baseline was globally installed Qwen Code 0.23.0; verification ran the locally built Request validation: 11/11 passedA loopback recording mock served deterministic responses while each scenario ran with isolated configuration and runtime directories and mock credentials.
All 11 processes completed successfully with an ACP validation: 10/10 passedEach model used an independent active session. The check initialized and authenticated ACP, created a session, selected the model, inspected its reasoning options/default, and attempted an unsupported choice.
The mock server and child processes exited after testing. No real provider inference or visual Web Shell interaction was performed. Additional validationBuild, typecheck, bundle, changed-file ESLint and Prettier checks passed. Focused unit tests passed: 262 core and 825 CLI tests. Independent code review found no Criticals or Suggestions. |
Live E2E report — GPT-5 and GPT-6 AstraReal inference used the selected models from the existing user settings, their configured gateway and credentials, and isolated configuration/runtime/workspace directories. Original settings were unchanged. No secrets or private endpoint addresses are included here.
Each successful primary response was exactly Astra was reproduced before the extension: the GPT-5-only bundle sent nested high, reduced max to xhigh, and omitted effort with a sampling budget even though the gateway answered. After the fix, high/max use the correct flat field, and high coexists with the 1024 budget. The later low/medium/xhigh run completed five-tier coverage. An active ACP session independently verified medium as the initial UI value, exactly five choices, mandatory-thinking metadata, rejection of none with error -32602, and successful high/max selections. The tests establish parameter transmission and gateway acceptance. They do not prove internal reasoning depth or quality differences; the CLI logger does not retain independently usable reasoning-token counts. Live tool calling and live daemon-to-Web Shell integration were not tested. Existing PR screenshots remain explicitly identified as ACP fixture replay. Validation: build, typecheck, bundle, changed-file lint/formatting, 277 core tests and 818 CLI tests passed. Final independent code review found C=0, S=0. The original 21 mock E2E scenarios remain documented in the earlier report. Reproduction prompt: 中文说明真实端到端报告 — GPT-5 和 GPT-6 Astra测试使用用户已有设置中的所选模型、配置网关和凭据,并隔离配置、运行及工作目录。原始设置未修改。此报告不包含密钥或私有端点地址。
成功的主响应均准确为 扩展前已复现 Astra 问题:GPT-5 专用 bundle 会发送嵌套 high、将 max 降为 xhigh,并在有采样预算时丢弃 effort,尽管网关仍会回答。修复后 high/max 使用正确的平铺字段,high 与 1024 预算并存;后续 low/medium/xhigh 补测完成五档覆盖。实际 ACP 会话独立验证了 UI 初始 medium、准确的五档列表、强制思考元数据、以 -32602 错误拒绝 none,以及 high/max 选档成功。 测试确认参数传递和网关接受情况,不证明内部推理深度或质量差异;CLI 日志未保留可独立核验的 reasoning token 计数。未测试真实工具调用或实际 daemon 与 Web Shell 的联调。PR 现有截图继续明确标注为 ACP 记录回放。 验证:构建、类型检查、打包、改动文件的 lint/格式检查,以及 core 277 项和 CLI 818 项单测全部通过。最终独立代码审查 C=0、S=0。之前的报告保留了 21 项模拟端到端场景结果。 复现提示词为上方英文原文。每次测试限制一个主轮次、零次主工具调用和 75 秒墙钟时间。GPT-5 真实测试使用原始 PR bundle,修复后 Astra 测试使用新的 bundle,精确 SHA-256 见上方;后续仅修改文档、注释及测试类型标注。 |
E2E review follow-up — a9b2b4bd36VERIFIED_FIXED. Reproduced the review findings against the exact previous PR state (
Validation completed before committing:
The full bundle was unchanged during E2E verification: 833 JavaScript files, manifest SHA-256 This follow-up used isolated configuration/runtime directories and local recording endpoints with mock credentials. User settings and real provider credentials were not used. Earlier real GPT-5.5/GPT-5.6/GPT-6 results remain historical evidence for those builds; no new live-provider acceptance is claimed here. Raw high overrides display an enabled default tier (medium), while the raw high request remains unchanged; full raw-tier synchronization is outside this PR. 中文验证报告已在精确的上一版 PR 状态 45 项端到端场景全部通过:31 项请求场景、14 个 ACP 会话,共记录 82 次本机模拟 API 调用;另有 9 项强制工具约束和 4 项持久化预览检查全部通过。max 在 Sol → GPT-5.4 → Sol 间切换及重载后保留,实际档位依次适配为 xhigh、恢复为 max;关闭偏好经过 Astra 后也能保留并恢复。用户与工作区配置均在进程退出后重新核对。原始关闭覆盖阻止选择 high 时,RPC 会拒绝并回滚。 GPT 网关请求、强制工具字段、预算和空值覆盖、模型变体及补丁版本均通过检查。原始 high 不再显示思考关闭,但界面仍显示已启用的默认档位 medium;请求中的原始 high 保持不变,本 PR 不扩大为完整原始档位同步。 提交前通过了 2,178 项定向单元测试(core 458、CLI 1,720)、完整构建、打包、类型检查、lint 和格式检查。两项变异检查移除对应保护后均按预期失败,恢复后通过。连续两轮完整 diff 反向自审和两轮独立反向复审均无新增问题,原有四条 Critical 均对最终代码逐条确认已修复。 测试前后的完整 bundle 清单及 diff hash 一致。本轮仅使用隔离目录、本机模拟端点和模拟凭据,未使用用户配置或真实凭据;不将此前真实 provider 测试冒充为本次新提交的真实调用结果。 |
R2 review follow-up verificationCommit:
The new request/ACP witnesses cover closed known-model recognition, provider prefixes, empty flat placeholders, preserved nested null/false/off/high raw data, native/OpenRouter differences, mandatory flat none in both layers and with retained nested data, exact default-tier false confirmation, and successful GPT-5.4/Pro selection. Max/off preference persistence, model switching/reload, Qwen controls and generic fallback were rechecked. R2-3 uses a small local reporting helper; the existing CLI/SDK raw-override reporting boundary was not generalized. For R2-7, nested null deliberately remains an explicit whole-object raw override; its wire semantics are preserved and documented, while blocked native tier changes now reject. It was not changed into a no-op. Provenance: full PR diff SHA-256 This round used isolated settings and local mock endpoints only. The prior GPT-5.5/GPT-5.6 Sol/GPT-6 Astra live results remain historical evidence in the PR description; GPT-5.4's live route remains unavailable. These checks establish request fields and UI behavior, not internal reasoning compute. The GPT-5.6 and GPT-6 images hosted in the wenshao fork assets branch are retained. 中文说明本轮 9 条评论已按修复或明确保留语义处理,并修复反向审计发现的 GPT-5.4 思考开关无法开启问题。提交前通过 3,313 项测试、完整构建/打包/类型检查及 lint/格式检查;8 类变异均能触发回归断言。最终 bundle 通过 90 项请求/ACP 场景、2 项浏览器回放和 13 项无网络检查,共记录 200 次本机模拟 API 调用。发现修复后连续两轮完整自审与最终独立反向复审均无新增问题。 嵌套 null 继续作为原始整对象覆盖透传,未扩展为无操作;被该覆盖阻断的原生端点档位选择会明确拒绝。CLI/SDK 既有覆盖报告范围未作通用化改造。真实模型验证记录保留为历史结果,本轮未使用用户凭据或额外调用真实 provider。 |
CI smoke follow-upFixed in Reproduced the exact assertion on the published parent before editing. After the correction, the full browser smoke suite passed 50/50 with CI's 8 workers and default retry settings: 50 attempts, no retries, skips, flaky results or global errors. The original failing case, mandatory controls, welcome resets and toggle-only controls all passed. 112 ChatEditor unit tests, full build, bundle, workspace/integration typecheck, changed-file ESLint/Prettier and diff checks also passed. Two consecutive reverse self-audits were clean before committing. Source hashes stayed unchanged throughout browser verification and all test listeners were closed. GitHub CI passed on this commit. The previously failing Web Shell smoke job reports 50 passed (2.2m) using 8 workers, with no retries. All 22 completed non-skipped checks passed; only the automatic PR review is still running. 中文说明已修正上一轮遗漏的一行冒烟测试期望:Qwen3.8 开启思考应发送已声明的默认档位 |
R3 review and conflict verificationVerified commit: 21fdaa53ce. Merged main at 078b924, preserving its explicit model reasoning capabilities. All 12 R3 review threads are addressed, including both Critical findings. Further reverse audit found and fixed two Welcome preference bugs before commit: switch-derived tiers could reset saved off state, and implicit model-switch resets could erase saved max/none. The final Welcome behavior discards cross-model switch intent and incompatible pending choices, preserves the target’s existing preview/preference, and migrates compatible explicit choices. It does not synthesize a reset from the source preview.
Validation transparency: an attempted typecheck overlapped build cleanup and failed on missing dist declarations; the authoritative full typecheck was run after build and passed. The first final smoke run passed 52/53: its remaining old test required the implicit preference reset that this fix removes. After updating that test to expect the existing Medium preference and no config request, the full 53/53 passed with no automatic retries in about 1.2 minutes. The original failure is retained, not counted as a pass. Prior raw-matrix browser fixture corrections remain documented in the local report. All this round’s requests used isolated local mock endpoints and mock credentials; the original user settings were not modified. Historical GPT-5.5, GPT-5.6 Sol, and all-five-tier GPT-6 Astra live-provider results remain in the live report and PR body. Those results establish outgoing fields and gateway acceptance, not internal compute differences. No new paid provider tests were needed for this review round. 中文说明验证提交:21fdaa53ce。已合并 main 的 078b924,并保留显式模型推理能力。R3 的 12 条评论均已处理,包括两条 Critical。提交前反向审计另外发现并修复了欢迎页的两处偏好问题:开关来源的档位可能重置已保存的关闭状态,模型切换时合成的重置请求可能清除已保存的 max/none。 最终欢迎页会丢弃跨模型开关意图及不兼容的待提交选择,保留目标现有预览和偏好;明确选择的兼容档位仍可迁移,不会根据来源模型的预览合成重置命令。 构建、bundle、全工作区及集成测试类型检查、变更文件 ESLint、Prettier 和空白检查通过。3,392 项定向单测通过:core 675、CLI 1,739、Web Shell 978;最终前端实现重新执行了完整相关测试,core/CLI 源码及测试与上一轮完整通过版本一致。合并后的核心实现通过 41 个真实 bundle ACP 场景(696 断言)、106 项捕获设置和错误断言、18 个 headless 请求场景(54 断言)及 32 项无网络检查。 最终 bundle 本轮通过 9/9 个真实 ACP 场景(32 断言、11 次本地模拟 API 调用)及 6/6 个关键浏览器场景:3 个开关目标偏好、2 个无待提交意图的保存偏好、1 个不兼容明确档位。要求不写配置的场景均未发送推理配置请求;明确选择 xhigh 的真实 ACP 对照验证了持久化及实际请求字段。 15 个故意引入的实现变体被行为断言捕获;后续开关意图 3 个、隐式重置 4 个回归用例也在修复前确认失败。最初持久化变体的夹具 TypeError 不计入有效反证,修正夹具后重新确认了正确基线及断言失败。最终连续两轮自查和两轮独立完整反向审查未发现问题;独立审查另验证了 480 组实际 pipeline/provider 组合和 192 组 App 回调组合。冒烟合同修订又通过两轮审查。 验证过程说明:一次类型检查与构建清理并发,因 dist 声明暂时缺失而失败;构建完成后独立执行的正式全量类型检查已通过。最终第一轮冒烟为 52/53,剩余旧用例要求清除偏好,与本次移除隐式重置的行为相反;改为验证保留 Medium 且没有配置请求后,完整 53/53 通过,无自动重试,用时约 1.2 分钟。原失败记录保留,不计作通过。 本轮所有请求均使用隔离的本地模拟端点和凭据,没有修改原始用户设置。之前 GPT-5.5、GPT-5.6 Sol 与 GPT-6 Astra 完整五档的真实网关测试记录保留在 PR 正文及历史报告中;它们证明发出的字段及网关接受情况,不证明内部计算量差异。本轮无需再次调用付费网关。 |
|
R4 verification for Fixed the Thinking switch accepting an ineffective ON action and clearing saved effort preferences. The server now marks ON unavailable when a raw override blocks configured tiers and the owning session’s reset default cannot enable thinking. The off switch is disabled, including for configured capabilities without a default tier and toggle-only models. OFF remains available while thinking is on; legitimate raw-on restoration and explicitly requested default resets keep their existing behavior. The default source belongs to the session or request, including after a provider entry is removed or another workspace changes the agent cache.
All requests used isolated local mock endpoints. The original user settings were untouched, paid provider tests were not repeated, and the GPT-5.6/GPT-6 images and historical real-provider evidence remain in the PR description. Earlier diagnostic fixture/type errors and a same-package coverage-directory collision remain recorded and are excluded from final passing totals. 中文:修复开启思考无效却确认成功、并清除已保存档位的问题。无法完成的开启操作现在会被禁用,覆盖省略默认档位及仅提供开关的合法配置;正常开启、关闭和显式 default 重置保持原有行为。初版修复在独立第二轮审计发现遗漏后被撤回,未提交,并重新计数审计。最终通过 27 个实际 ACP 场景、560 条断言、9 个构建后浏览器场景和 1,808 项单测;禁用的开关不会发送配置请求。当前验证未修改原始设置,也未重复付费模型调用。 |
|
CI repair verification for The failed Lint & Static job checked out the prior PR head but invoked the new main-branch freshness check, whose script was missing from that head. The browser smoke failure was a history-reading-anchor race under slow rendering: with the same 4× CPU throttling condition as main’s regression, the old PR source reproduced the exact 286px displacement (expected at most 2px). Merged main at
The original non-throttled reproduction passed nine local executions; those results did not rule out the failure and were kept separately from the precise throttled reproduction. Original user settings were not changed, no paid model calls were repeated, and prior GPT-5.6/GPT-6 images and live-provider evidence are retained. Remote verification is complete: Qwen Code CI run 34288267339 passed on this exact commit. Both previously failing jobs are green: Lint & Static and Linux Web Shell smoke. The remote log confirms all seven main-branch gate files are current; Linux smoke passed 58/58 in 58 first attempts, including the formerly failing 200-record case. At final verification the PR had 21 successful checks and no failed or pending checks. |
|
Follow-up status, 中文:下方曾延期的冷启动 Welcome 开关预览问题已在 R6 review fixes and verificationCommitted as
The final eight-file diff matches the audited SHA-256 Remote verification on this exact head: Qwen Code CI run completed successfully. The completed smoke-job log reports 58 tests using two workers and Deferred R6 follow-up inventoryThis PR is beyond five review rounds, so this round fixes correctness/regressions and retains the review's deferred inventory for follow-up. The Welcome toggle preview limitation fails closed; broader tier-lock metadata, unknown raw tiers, documentation refinements, diagnostic wording, additional test isolation/naming and generic TUI ladder work are not expanded into this patch. No deferred item is being silently treated as fixed.
中文:重复的偏好误删评论、OpenRouter 状态错误、Welcome 首条消息失败均已处理,并修复了提交前审计新发现的 raw-on 组合问题。两轮主审计和两轮独立审计干净后提交;本地 2,937 项单测、27 个 ACP 场景及 65 个浏览器场景通过。基础 GPT-5 的 none 评论已按官方逐型号资料说明为误报,其余延期项逐条保留在上方。远程主 CI 已通过;日志确认 WebShell smoke 58 项均首次通过,两个 worker,用时 3.9 分钟。PR 共 23 项检查通过、无失败,自动评阅仍在运行,另有按条件跳过的任务。 |
qqqys
left a comment
There was a problem hiding this comment.
Read-only review pass at head 9c48225e. The newest commit answers the four Criticals round 6 filed, but no review round has ruled on this head — the automatic review was still in flight when this pass ran — and I could not trace those four to closure inside my budget on a 3,034-line diff. So this is a COMMENT: nothing new is being alleged, and what follows separates what I verified from what remains unruled.
What I verified at this head. The table-imposed mandatory-thinking coercion R5-1 was anchored on is still present and unchanged in shape: getModelConfiguration returns { ...configured, canDisable: false } when the GPT table says thinkingMandatory and the caller supplied a declared capability (model-configuration.ts:272-277), alongside the table-only branch that adds canDisable: false when there is no declared capability (:278-287). The fix commit states that table-imposed mandatory thinking no longer deletes a saved off preference over declared capabilities, while an explicit canDisable: false and an incompatible configured max keep their stricter reconciliation — so the change must live in the downstream reconciliation that decides whether a persisted model.reasoningEffort is deleted, not at this coercion site. I did not reach that code within budget, so I record R5-1 as unconfirmed rather than fixed or still standing: the mechanism the finding named is still here, and the part that would answer it is somewhere I did not read. Relatedly, the pipeline's mandatory strip is still gated on thinkingMandatory, now derived from both the generator's own flag and the GPT table (pipeline.ts:987-989) and consulted before the flat reasoning_effort: 'none' rewrites (:1010-1020, :1051-1055), which is consistent with the fix report but does not by itself settle whether a user's raw none survives.
What remains unruled. Round 6 (04:45Z, at the previous head) filed four Criticals: R5-1 on both duplicate threads (a persisted global model.reasoningEffort: 'none' becoming unsupported for a table-mandatory GPT model and being deleted from every writable scope — the data-loss-shaped one, and the reason I spent my budget there), R6-1 (the Welcome model-switch carry-over gating on reasoningPreviewSupports, which never reads the new canEnable capability, so an explicit tier intent migrates onto a target that cannot apply it), R6-2 (on OpenRouter a sampling-layer flat reasoning_effort is authoritative enough that the pipeline drops the configured nested tier, while getGptReasoningOverrideState did not report that shape), and R6-3 (base gpt-5, gpt-5-mini and gpt-5-nano newly classified thinkingMandatory: true, so the pre-existing mandatory strip deletes a user's raw reasoning_effort: 'none'). The fix commit reports the first three closed and adjudicates R6-3 a false positive on vendor-documentation grounds — that the GPT-5 family guide groups base/mini/nano under minimal/low/medium/high and none arrives only with 5.1, with the sources now recorded in the design doc. That adjudication is a vendor-contract judgment I cannot verify from this repository, and it is precisely the kind of claim that needs an independent ruling rather than a reviewer's deference, because if it is wrong the strip is deleting a configuration users are entitled to set.
One deferred item is itself labelled Critical. The convergence-posture inventory retained for follow-up includes packages/web-shell/client/components/ChatEditor.tsx:1133 — [probe] Critical [fails-closed] [new-surface] Welcome/toggle enable-value path: previews never advertise …, and the fix report is explicit that no deferred item is being silently treated as fixed and that the Welcome toggle preview limitation fails closed. Retaining a Critical as follow-up past five rounds is a legitimate posture, but it is a maintainer's risk acceptance to make, not something this pass can clear.
The scan gap. I read the two sites above and no more of a diff that adds 3,034 lines across 32 files, with roughly 520 lines of production code spanning packages/core/src/core/** (openaiContentGenerator/pipeline.ts, reasoning-effort.ts, provider/default.ts, provider/dashscope.ts), packages/cli/src/acp-integration/** (acpAgent.ts, model-configuration.ts, session/Session.ts) and packages/web-shell/client/** (App.tsx, ChatEditor.tsx, daemon/session/mappers.ts), plus ~2,300 lines of new tests and five design/user docs. Under a Critical-only remit an unscanned surface is not a clean surface, and this one carries a preference-deletion path, a wire-shape mapping across three provider protocols, and two UI controls that can silently no-op — the three places this PR's own Critical history keeps producing findings.
One thing in this PR's favour that is worth stating. It is maintainer-authored, so AGENTS.md's external-PR core tier — the one that would otherwise require escalation before approving a change to packages/core/src/core/** — does not apply, and the verification behind this head is unusually strong: 2,937 focused unit tests, 27 built-CLI ACP scenarios with 200 assertions covering all twelve mandatory ids plus tiered, toggle-only, switch/reload and strict-declaration counterexamples, built WebShell effective-tier scenarios, four Welcome browser cases, a complete Chromium smoke at 58/58 with one worker and no retries, full build, bundle, workspace and integration typecheck, repository lint and formatting, two consecutive clean reverse self-audit passes, and a recorded SHA-256 for the final eight-file diff. Remote CI on this exact head passed with nothing failing.
CI at this head. 24 checks pass and 98 are skipped, four route dispatches are cancelled from superseded runs, and one lane — the automatic review — is still in flight. Nothing fails, and nothing among the completed legs is attributable to a defect introduced by this PR.
Next step: the in-flight review round is the cheapest path to a ruling on R5-1, R6-1, R6-2 and R6-3 at this head, and R6-3 in particular needs someone to check the vendor tier tables rather than accept the rebuttal. If that round times out again, the alternative is an explicit maintainer risk acceptance naming those four, the deferred ChatEditor.tsx:1133 Critical, and the unscanned surface above.
中文说明:本次在 head 9c48225e 上评审,结论为 COMMENT。最新提交回应了第 6 轮提出的四项 Critical,但本 head 上没有任何评审轮次作出裁决——本次复核运行时自动评审仍在进行——而在一份新增 3034 行的 diff 上,我无法在预算内把这四项追踪到闭合。因此这是一次 COMMENT:不提出任何新主张,以下把"我已核实的"与"仍未裁决的"分开陈述。我在本 head 上核实到的部分。 R5-1 所锚定的那处"由表强制的思考不可关闭"仍然原样存在:当 GPT 表声明 thinkingMandatory 且调用方提供了已声明的能力时,getModelConfiguration 返回 { ...configured, canDisable: false }(model-configuration.ts:272-277),旁边是没有已声明能力时补上 canDisable: false 的纯表分支(:278-287)。修复提交称"表强制的思考不再越过已声明能力删除已保存的关闭偏好",而显式的 canDisable: false 与不兼容的配置 max 保留其更严格的调和——因此该改动必然位于决定"是否删除已持久化 model.reasoningEffort"的下游调和逻辑中,而不在这一处强制点。我在预算内没有读到那段代码,所以把 R5-1 记为无法确认,而不是已修复或仍存在:该发现点名的机制仍在这里,而能回应它的部分位于我未读之处。与此相关,pipeline 的强制剥离仍以 thinkingMandatory 为门,该值现在同时来自生成器自身的标志与 GPT 表(pipeline.ts:987-989),并在扁平 reasoning_effort: 'none' 改写之前被查询(:1010-1020、:1051-1055);这与修复报告一致,但本身并不足以判定用户原始的 none 是否得以保留。仍未裁决的部分。 第 6 轮(04:45,针对上一个 head)提出四项 Critical:R5-1(两个重复线程——已持久化的全局 model.reasoningEffort: 'none' 对表内强制思考的 GPT 模型变为不支持,并从每个可写作用域中被删除;这是带数据丢失形态的一项,也是我把预算花在那里的原因)、R6-1(Welcome 的模型切换继承以 reasoningPreviewSupports 为门,而它从不读取本 PR 新增的 canEnable 能力,因此一个显式档位意图会被迁移到无法应用它的目标上)、R6-2(在 OpenRouter 上,采样层的扁平 reasoning_effort 权威到足以让 pipeline 丢弃已配置的嵌套档位,而 getGptReasoningOverrideState 未报告该形态)、R6-3(base gpt-5、gpt-5-mini、gpt-5-nano 被新分类为 thinkingMandatory: true,于是既有的强制剥离会删除用户原始的 reasoning_effort: 'none')。修复提交报告前三项已闭合,并把 R6-3 裁定为误报,理由是厂商文档——GPT-5 家族指南把 base/mini/nano 归在 minimal/low/medium/high 之下,而 none 自 5.1 才引入,来源已记录进设计文档。该裁定是一个我无法从本仓库核实的厂商契约判断,而它恰恰是需要独立裁决、而非评审者予以尊重的那类主张:如果它是错的,那么被删除的正是用户有权设置的配置。有一项被延后的条目本身即标注为 Critical。 收敛姿态下保留为后续项的清单中包含 packages/web-shell/client/components/ChatEditor.tsx:1133 — [probe] Critical [fails-closed] [new-surface] Welcome/toggle enable-value path: previews never advertise …,且修复报告明确说明没有任何延后项被静默当作已修复、Welcome 开关预览的局限是 fail-closed 的。超过五轮后把一项 Critical 留作后续是合理的姿态,但这属于维护者的风险接受,不是本次复核能够清除的。扫描缺口。 除上述两处外,我没有再读这份新增 3034 行、涉及 32 个文件的 diff 的任何部分;其中约 520 行生产代码横跨 packages/core/src/core/**(openaiContentGenerator/pipeline.ts、reasoning-effort.ts、provider/default.ts、provider/dashscope.ts)、packages/cli/src/acp-integration/**(acpAgent.ts、model-configuration.ts、session/Session.ts)与 packages/web-shell/client/**(App.tsx、ChatEditor.tsx、daemon/session/mappers.ts),另有约 2300 行新测试与五份设计/用户文档。在 Critical-only 口径下,未扫描的面不等于干净的面,而这一面恰好包含一条偏好删除路径、跨三种 provider 协议的线格式映射,以及两个可能静默无操作的 UI 控件——正是本 PR 自己的 Critical 历史反复产生发现的那三处。有一点对本 PR 有利,值得写明。 它由维护者本人提交,因此 AGENTS.md 的外部 PR core 档位(否则会在批准一个改动 packages/core/src/core/** 的 PR 前要求上报)并不适用;且本 head 背后的验证异常充分:2937 个聚焦单元测试、27 个基于已构建 CLI 的 ACP 场景与 200 条断言(覆盖全部 12 个强制 id,以及分档、仅开关、开关/重载与严格声明的反例)、已构建 WebShell 的有效档位场景、4 个 Welcome 浏览器用例、以单 worker 无重试完成的 58/58 Chromium 冒烟、完整构建与打包、workspace 与集成的类型检查、仓库级 lint 与格式化、连续两次干净的反向自审,以及最终八文件 diff 的 SHA-256 记录。针对本 head 的远端 CI 亦通过且无失败。CI:本 head 上 24 项通过、98 项跳过,四次 route 派发因运行被取代而取消,一项——自动评审——仍在进行;无失败,已完成的检查中也没有可归因于本 PR 的缺陷。下一步:正在进行的那一轮评审是对本 head 上 R5-1、R6-1、R6-2、R6-3 作出裁决最省事的路径,其中 R6-3 尤其需要有人去核对厂商的档位表,而不是接受该反驳。若那一轮再次超时,替代方案是由维护者给出明确的风险接受,点名这四项、被延后的 ChatEditor.tsx:1133 Critical,以及上述未扫描面。
doudouOUC
left a comment
There was a problem hiding this comment.
Independent read-only review at head 9c48225e, including the delta commit over the round-6 anchor 5602d9a9. No blocking issues found; approving.
Delta commit 9c48225e verified against the three findings it claims to close.
- R5-1 (saved-off preference reconciliation) —
Session.ts:10778now preserves a savednonepreference whenever the model is in the GPT capability table, unless the configured capabilities explicitly declarecanDisable: false. Verified against the newit.eachrows inSession.test.ts:gpt-6-astrawith declared capabilities and no explicitcanDisableretainsreasoningEffort: 'none'in both settings scopes with zerosetValuewrites; thecanDisable: falserow keeps the strict clearing (2 writes). The split ofgptCapabilities(built-in table hit) fromconfiguredReasoning(operator declaration) is the right predicate boundary. - R6-2 (OpenRouter flat-override reporting) —
model-configuration.ts:getGptReasoningOverrideStatenow extracts the effective tier from the merged flat value (efforts.find(tier => tier === flat)), reportsenabledfrom the flat value instead ofdefaultEnabledwhen it isn't the removed-placeholder case, and only setsuseDefaultEffortwhen no concrete tier was recovered. The new test rows pin the merged-precedence case (samplingParams high+extra_body low→ reportslow), the flat-nonecase (enabled: false, no tier), and the mandatory-model flat-noneremoval case (Astra →enabled: true, default tier). - R6-1 (Welcome pending-tier rejection) —
App.tsx:reasoningPreviewSupportsnow rejects any pending enabling intent whencanEnable === false && !enabled, and rejects concrete tiers whencanEnable === falseorenableValue === 'default'(a raw override owns the tier). The expandedit.eachmatrix covers the toggle source,canEnable: false, andenableValue: 'default'rows both directions, including the no-config-request assertion for rejected carries. - R6-3 — the false-positive disposition is correctly grounded: the GPT-5 family guide lists minimal/low/medium/high for base/mini/nano with
noneintroduced in GPT-5.1, the sources are now recorded in the design doc, and the table entry (efforts: ['low','medium','high'], thinkingMandatory: true) is exactly the mappable subset of the shared CLI ladder (which has nominimaltier).
The round-6 deferred Critical is closed by this head. The bot's only Critical-axis deferral (Welcome/toggle enable-value path, fails-closed/new-surface) is the reasoningPreviewSupports fix above — verified in code and tests, not just claimed.
Core surfaces re-verified at this head, not just the delta. The normalization in getGptReasoningCapabilities (batch-tag strip before normalize(), dated-snapshot and patch-version collapse after) correctly leaves unknown minor versions and non-GPT models at generic behavior. flattenGptReasoningEffort runs after the extra_body merge so raw nested reasoning (including null) retains whole-object priority, raw flat values beat configured effort, and only placeholder (nullish/empty) flat slots accept the configured tier; OpenRouter and raw-nested-bearing configs skip flattening entirely, and DashScope gets the same flattening for GPT models it serves. The mandatory-none cleanup emits flat none only for non-mandatory GPT models without configured capabilities and off OpenRouter — forced-tool constraints are not dropped. supportedReasoningEffortsFor prefers declared capabilities over the GPT table, so explicit operator configuration keeps its tier restrictions.
CI and threads at this head. 23 checks SUCCESS, 26 SKIPPED, one bot review lane in flight (not a merge gate). 39/39 review threads resolved. reviewDecision still shows CHANGES_REQUESTED from the bot's round-6 review at the previous head; the bot's re-review of this head is in progress. Remaining deferred items from the bot are Suggestion-level follow-ups explicitly recorded as non-blocking under the convergence posture.
Not re-verified locally: the full unit/E2E matrices (CI ran them green at this exact head, and the author's R6 report covers the built-bundle ACP/browser scenarios).
中文说明:本次在 head 9c48225e 上独立只读审查(含相对 round-6 锚点 5602d9a9 的 delta 提交),结论为 APPROVE,无阻塞问题。delta 提交声称关闭的三项发现均对照代码与新增测试核实:R5-1 保存的 off 偏好在 GPT 表强制思考但配置未显式 canDisable: false 时保留(两个 settings 域零写入),显式 canDisable: false 仍走严格清除;R6-2 OpenRouter 扁平覆盖现在上报合并后的实际档位(extra_body 优先于 samplingParams),扁平 none 上报 enabled: false,强制思考模型的占位 none 移除路径不变;R6-1 Welcome 挂起档位在 canEnable === false 或 enableValue === 'default' 时被拒绝且不发送配置请求。R6-3 的误报判定有 OpenAI 官方文档依据且已记入设计文档(GPT-5 基础家族为 minimal/low/medium/high,none 自 GPT-5.1 引入;CLI 阶梯无 minimal 档,表中 low/medium/high 是可映射子集)。bot 第 6 轮唯一 deferred 的 Critical(Welcome/toggle enable-value 路径)正是本次 reasoningPreviewSupports 修复所关闭的。核心面(normalize 顺序、flatten 在 extra_body 合并之后、OpenRouter/raw nested 跳过、DashScope 同步扁平化、mandatory-none 清理不丢 forced-tool 约束、声明能力优先于 GPT 表)均在本 head 重新核实。CI 23 项通过、其余跳过、1 项 bot 评审进行中(非门禁);39 条 threads 全部 resolved;reviewDecision 的 CHANGES_REQUESTED 来自 bot 对旧 head 的第 6 轮评审,其对新 head 的重审正在进行。其余 deferred 项均为 Suggestion 级跟进,非阻塞。
Independent local verification (Linux) —
|
| Step | Result |
|---|---|
gpt-5.4 ← max |
rejected — Unknown reasoning effort: max. Choose one of: none, low, medium, high, xhigh |
gpt-6-astra ← none |
rejected — Choose one of: low, medium, high, xhigh, max |
gpt-5-pro ← low |
rejected — Choose one of: high |
astra max → switch to gpt-5.4 |
active tier clamps to xhigh, saved preference kept |
| switch back to astra | max restored |
gpt-5.4 ← none, detour through astra, back |
none still selected |
| persistence | written as model.reasoningEffort in user settings, qwenCode/reasoningSelectionPersisted acknowledged |
I also enumerated the capability table straight out of the built core: the 12 mandatory-thinking ids documented in model-providers.md match the code exactly, and GPT-5.4, whitespace, azure/openai/…, gpt-5.4.2.3, gpt-5.6-sol-2026-03-01 and openai/gpt-6-astra:batch all normalise correctly while gpt-6, gpt-6-astra-mini, gpt-5.7 and gpt5.4 correctly stay generic.
3. Web Shell controls — Chromium on Linux
The repo's mock daemon was fed configOptions captured verbatim from a real ACP session of the built PR CLI (no hand-written fixtures), then driven with Playwright.
gpt-5.4 opens with thinking off and the tiers disabled; gpt-5.6-sol offers the full ladder with a switchable toggle; gpt-6-astra offers the full ladder with the toggle on and disabled and no "Thinking off" entry. Selecting Max emits exactly one {configId:'reasoning_effort', value:'max', persist:true} write on both models. The repository's own web-shell.smoke.spec.ts also passed 34/34 here with workers=1 retries=0.
4. Negative controls
Each mutation reverts one production hunk, rebuilds core and the bundle, and re-runs the affected scenario — so the check discriminates the fix rather than confirming green:
| Mutation | Scenario | Unmutated head | Mutated head |
|---|---|---|---|
drop flattenGptReasoningEffort(result) in default.ts |
gpt-5.4 high | reasoning_effort: "high" |
back to nested reasoning |
drop flattenGptReasoningEffort(merged) in dashscope.ts |
gpt-5.4 high @ DashScope | reasoning_effort: "high" |
back to nested reasoning |
revert the samplingParams re-injection in pipeline.ts |
high + 1024-token budget | reasoning_effort: "high" |
effort gone |
drop the GPT reasoning_effort = 'none' branch in pipeline.ts |
gpt-5.4 off | reasoning_effort: "none" |
no field at all |
5. Tests and static gates on Linux (head)
| Gate | Result |
|---|---|
| Changed-file unit tests | 3,437 passed — core 675 (6 files), CLI 1,765 (5 files), Web Shell 997 (3 files) |
Full packages/core suite |
24,043 tests, 3 failed — the same 3 fail on the merge base (see below) |
| Web Shell Chromium smoke | 34/34, first attempt, workers=1 retries=0 |
eslint --max-warnings 0 on all 27 changed TS/TSX files |
pass |
prettier --check on all 32 changed files |
pass |
tsc --noEmit for packages/core and packages/cli |
pass |
The three full-suite failures are skill-curator > reports skippedErrors when rename fails transiently, session-writer-lease > classifies an unreadable owned lock as unavailable and git-branches > types the refusal with a lock hint when the index is wedged. All three simulate a permission failure, and the rig runs as root, so the chmod never bites. The identical set fails on the merge base — environmental, not caused by this PR.
Non-blocking observations
N1 — the new declared-capabilities narrowing branch has no observable effect. With capabilities.reasoning = {efforts:['low','medium','high']} declared on gpt-6-astra and a configured max, the request carries no reasoning field at all — neither the clamped high nor the raw max. The reason is ordering: applyConfiguredReasoningEffort in pipeline.ts runs before the provider, and it drops an effort that is not in the declared list rather than clamping it, so the new configured && !configured.toggleOnly ? configured.efforts : gpt.efforts branch in default.ts:151 never sees an out-of-range tier. Evidence that this is pre-existing rather than a regression: the merge base produces the identical body, and so does a non-GPT model with the same declaration. The widening direction (declaring max on gpt-5.4) works and is also identical on both arms. This turns the deferred note "The new declared-capabilities clamp branch is untested" into "it is also unobservable end to end" — worth either a test that pins the intended narrowing behaviour or a note that the pipeline owns it.
N2 — a batch tag followed by another tag falls back to generic. gpt-5.4:batch resolves to the GPT-5.4 capabilities, but gpt-5.4:batch:foo does not (:batch(?=:|$) strips it, leaving gpt-5.4:foo, which no longer normalises). Harmless if only the trailing form occurs in practice; worth a line in the design doc if not.
N3 — the only merge blocker is a stale bot review. All 39 review threads are resolved, no check is failing at 9c48225, and an approving human review is on record; reviewDecision is still CHANGES_REQUESTED because of qwen-code-ci-bot's review left at 5602d9a9, two heads ago. Also, since this round covers Linux, the Tested on table in the description can be updated.
中文说明
独立本地验证(Linux)—— 9c48225e64
在本地从源码构建了两条臂:merge-base 1f890086f1 与 PR head 9c48225e64,并用独立搭建的验证环境进行对比。本 PR 之前的各轮验证都在 macOS 上完成,PR 描述里的 Tested on 表格至今仍标注 Linux 未测试,因此本轮刻意做成当前 head 上的 Linux 验证,同时补充与 merge base 的线级、ACP 级 A/B,以及通过变异确认修复确实承载行为。
结论:未发现阻塞问题。 PR 描述和 docs/users/configuration/model-providers.md 中声明的行为,全部在真实 HTTP 网关和真实 ACP 会话上复现成立。末尾有三条非阻塞观察。
环境
Linux 6.12 / Node 22.22.2。两个 worktree 均按 core → acp-bridge → channel-base → sdk → web-shell(3 次 vite)→ web-templates → channels → esbuild 完整构建,各自产出真实的 dist/cli.js。下面所有运行都使用构建后的 bundle CLI、隔离的 QWEN_HOME/QWEN_RUNTIME_DIR 和假凭据。openrouter.ai 与 dashscope.aliyuncs.com 在私有 mount namespace 内(unshare -m + bind-mount /etc/hosts)解析到回环地址,从而真实走到按主机名分支的 provider 逻辑,且不影响宿主机的解析。
1. 出站请求体 —— 24 个场景,双臂对比
以 headless(-p)方式运行 bundle CLI,打到一个本地录制型 HTTP 服务(实现 Chat Completions),对比的是流式那一轮的请求体。24 个场景在两条臂上都完成了整轮对话(模型返回 42),所以下面每一种请求形态都确实被端到端接受了。
图见上方 fig2。描述中的每一项都复现成立,merge base 也复现了全部「修复前」症状:
- 已知 GPT 模型由嵌套对象改为平铺
reasoning_effort;max按模型解析(gpt-5.1 → high、gpt-5.4 → xhigh、gpt-5.6-sol / gpt-6-astra → max),而 base 把四者都压成嵌套xhigh;gpt-5-pro把low抬到high。 - 采样预算或无关采样参数不再吞掉档位 —— base 在这两种情况下都完全丢失了 effort。
- 允许关闭的模型发送
reasoning_effort: 'none',强制思考的模型什么都不发;OpenRouter 的 effort 与关闭都保留嵌套reasoning形态。 - 占位符两行暴露了 base 上两个真实缺陷:merge base 会把字面量
reasoning_effort: null和reasoning_effort: ""发到线上,head 改为使用配置档位。 - 标识符归一化(
openai/…前缀、日期快照、:batch、数字补丁号)都能命中模型能力;而gpt-5.9、gpt-5.4-turbo保持通用嵌套路径,与 base 逐字节一致。 - DashScope 兼容网关承载 GPT 时同样平铺。
另有 10 个场景仅在 head 上运行,全部符合文档中的优先级:兄弟 budget_tokens 与平铺字段共存(reasoning_effort: "max" + reasoning: {"budget_tokens":50000});extra_body 平铺覆盖优先于 samplingParams 平铺;原始嵌套(含 null)保持整对象覆盖;强制思考模型不下发任何关闭值;在 OpenRouter 上采样层平铺覆盖会抑制配置的嵌套 effort,而仅 extra-body 的平铺覆盖不会。
2. ACP 控件 —— 10 个模型,双臂对比
在 --experimental-acp 模式下从 session/new 读取,每个模型一个独立进程。图见上方 fig3。
最后一行是对照组:一个无关的 Qwen 模型在两臂上完全一致,说明改动限定在 GPT 表内。同一个真实 ACP 会话里的 15 步交互矩阵也全部通过:
| 步骤 | 结果 |
|---|---|
gpt-5.4 ← max |
拒绝 —— Unknown reasoning effort: max. Choose one of: none, low, medium, high, xhigh |
gpt-6-astra ← none |
拒绝 —— Choose one of: low, medium, high, xhigh, max |
gpt-5-pro ← low |
拒绝 —— Choose one of: high |
astra 存 max → 切到 gpt-5.4 |
生效档位收敛到 xhigh,已保存偏好保留 |
| 切回 astra | max 恢复 |
gpt-5.4 ← none,绕道 astra 再切回 |
仍为 none |
| 持久化 | 写入用户设置的 model.reasoningEffort,并回执 qwenCode/reasoningSelectionPersisted |
我还直接从构建后的 core 枚举了能力表:model-providers.md 中记录的 12 个强制思考模型 id 与代码完全一致;GPT-5.4、前后空格、azure/openai/…、gpt-5.4.2.3、gpt-5.6-sol-2026-03-01、openai/gpt-6-astra:batch 都能正确归一化,而 gpt-6、gpt-6-astra-mini、gpt-5.7、gpt5.4 正确地保持通用行为。
3. Web Shell 控件 —— Linux 上的 Chromium
用仓库自带的 mock daemon,喂入从构建后 PR CLI 的真实 ACP 会话中逐字捕获的 configOptions(没有手写夹具),再用 Playwright 驱动。图见上方 fig1。
gpt-5.4 打开时思考关闭、档位置灰;gpt-5.6-sol 提供完整档位且开关可切换;gpt-6-astra 提供完整档位,开关处于开启且被禁用状态,并且没有「Thinking off」项。在这两个模型上选择 Max 都只发出一次 {configId:'reasoning_effort', value:'max', persist:true} 写入。仓库自带的 web-shell.smoke.spec.ts 在此环境下也 34/34 通过(workers=1 retries=0)。
4. 反向对照(变异)
每个变异回退一处生产代码,重新构建 core 和 bundle,再重跑受影响场景 —— 以此证明检查能区分修复本身,而不只是「绿了」:
| 变异 | 场景 | 未变异 head | 变异后 head |
|---|---|---|---|
删除 default.ts 中 flattenGptReasoningEffort(result) |
gpt-5.4 high | reasoning_effort: "high" |
退回嵌套 reasoning |
删除 dashscope.ts 中 flattenGptReasoningEffort(merged) |
gpt-5.4 high @ DashScope | reasoning_effort: "high" |
退回嵌套 reasoning |
回退 pipeline.ts 中 samplingParams 重新注入 |
high + 1024 token 预算 | reasoning_effort: "high" |
effort 丢失 |
删除 pipeline.ts 中 GPT reasoning_effort = 'none' 分支 |
gpt-5.4 关闭思考 | reasoning_effort: "none" |
无该字段 |
5. Linux 上的测试与静态门(head)
| 门 | 结果 |
|---|---|
| 改动文件单测 | 3,437 通过 —— core 675(6 文件)、CLI 1,765(5 文件)、Web Shell 997(3 文件) |
packages/core 全量 |
24,043 项,3 项失败 —— merge base 上同样这 3 项失败(见下) |
| Web Shell Chromium smoke | 34/34,首次通过,workers=1 retries=0 |
27 个改动 TS/TSX 文件 eslint --max-warnings 0 |
通过 |
32 个改动文件 prettier --check |
通过 |
packages/core 与 packages/cli 的 tsc --noEmit |
通过 |
那 3 项全量失败分别是 skill-curator > reports skippedErrors when rename fails transiently、session-writer-lease > classifies an unreadable owned lock as unavailable 和 git-branches > types the refusal with a lock hint when the index is wedged。三者都在模拟权限失败,而验证环境以 root 运行,chmod 对 root 无效。merge base 上失败集合完全相同 —— 属于环境因素,与本 PR 无关。
非阻塞观察
N1 —— 新增的「已声明能力收窄」分支没有可观察效果。 在 gpt-6-astra 上声明 capabilities.reasoning = {efforts:['low','medium','high']} 并配置 max 时,请求里完全没有 reasoning 相关字段 —— 既不是收窄后的 high,也不是原始的 max。原因是顺序:pipeline.ts 的 applyConfiguredReasoningEffort 先于 provider 执行,对不在声明列表中的档位是丢弃而非收窄,因此 default.ts:151 新增的 configured && !configured.toggleOnly ? configured.efforts : gpt.efforts 分支永远看不到越界档位。这不是回归:merge base 产生完全相同的请求体,一个非 GPT 模型配相同声明也是如此。放宽方向(在 gpt-5.4 上声明 max)可用,且两臂一致。这把延期项中的「新增的已声明能力收窄分支未被测试」补充为「端到端也观察不到效果」—— 建议要么补一条固定预期收窄行为的测试,要么在文档中说明该行为归 pipeline 所有。
N2 —— batch 标签后再跟标签会退回通用行为。 gpt-5.4:batch 能命中 GPT-5.4 能力,但 gpt-5.4:batch:foo 不能(:batch(?=:|$) 剥离后剩下 gpt-5.4:foo,不再归一化)。如果实践中只出现结尾形态则无害,否则建议在设计文档里补一句。
N3 —— 目前唯一的合并阻塞是一条过期的 bot review。 39 条 review thread 全部已解决,9c48225 上没有失败的检查,并且已有一条人工 approve 记录;reviewDecision 仍是 CHANGES_REQUESTED,来源是 qwen-code-ci-bot 留在两个 head 之前的 5602d9a9 上的评审。另外,既然本轮覆盖了 Linux,描述里的 Tested on 表格可以更新。
🤖 Generated with Claude Code — Claude Opus 5 (1M context)
Cold Welcome reasoning follow-upFixed in This closes the deferred cold Welcome toggle issue discussed in the read-only review. It was distinct from the model-switch carry-over fix: the later approval incorrectly treated the cold-preview issue as already closed at Before this change, a saved off preference plus a raw reasoning override made cold Welcome select medium when turning thinking on; the actual session rejected that selection and released the newly allocated session before sending the first prompt. Both cold provider-preview producers now project the target provider's raw state and enable constraints. An allowed reset selects default; a raw configuration that prevents enabling disables ON before session creation. Resolved provider defaults take precedence over ignored top-level generation settings, and ACP reads the preference for its own workspace.
The browser workflows cover raw nested high with saved off, raw flat none, ordinary settings and a provider with empty generation settings overriding a top-level raw disable. The raw-off scenario leaves the switch disabled and still sends the first prompt. The other three apply the accepted enable selection and receive the first reply. Before the fix, the two raw scenarios failed and both ordinary/precedence controls passed. All six final runtime workflows used the real bundled CLI; browser workflows used the real daemon, built UI and Chromium. Only inference was mocked on loopback: six local inference requests, zero external provider calls. The production sources and all 1,044 dist files stayed unchanged during verification. Documentation wording and a test assertion/format changed during the run, so the blanket all-tracked-files hash check initially reported a difference; this was checked against the manifest and is not claimed as an unchanged whole checkout. Final bundle SHA-256: Remote verification on this exact head: Qwen Code CI completed successfully, including Linux unit tests, Lint & Static, no-AK integration and Web Shell E2E smoke. The smoke log reports 58/58 passed with two workers in 4.2 minutes; the preceding transcript document browser gate passed all 5 tests. Serve A/B, Web-shell Visuals, TUI parity/no-flicker and SDK Java also passed. At this update, PR checks show 22 passed, zero failed and 9 conditional skips; automatic PR review is still in progress. Earlier CI results remain evidence for their own preceding commits. 中文:本次修复的是此前延期的冷启动 Welcome 预览缺口,与已修复的模型切换继承问题不同。此前 APPROVE 将两者合并认定为已修复,范围过宽;这次补齐两处预览生成路径,并通过真实 daemon、最终构建 UI 和 Chromium 验证首条消息。806 项相关单测、4 个浏览器流程及 2 个直接 ACP 流程通过。提交前主审计和独立审计各连续两轮无新问题。所有推理请求均为本机 mock,没有新的真实模型调用;新提交的远程主 CI 已全部通过:Linux 单测、静态检查、无 API Key 集成、5 项文档浏览器检查和 58/58 项 Web Shell 冒烟测试(两个 worker,4.2 分钟)。Serve A/B、可视化、TUI 和 Java SDK 流程也已通过。当前 22 项检查通过、无失败、9 项按条件跳过;自动评审仍在运行。 |
|
@qwen-code /triage |
qqqys
left a comment
There was a problem hiding this comment.
Read-only review at head 9355b21d. Verdict: COMMENT — not an approval. One previously reported blocking item is still present in the code at this head as an unresolved factual dispute, and the review budget ran out before the rest could be confirmed.
Confirmed against the code at this head
Still blocking — the gpt-5 / gpt-5-mini / gpt-5-nano mandatory-thinking strip.
packages/core/src/core/reasoning-effort.ts:59-67 classifies all three ids as thinkingMandatory: true, and packages/core/src/core/openaiContentGenerator/pipeline.ts:1120-1129 then deletes a flat reasoning_effort of none whenever thinkingMandatory holds. So a user's explicit raw flat none for those three ids is removed from the wire with nothing replacing it, and this diff also removes the test that used to pin the preserve behaviour (should preserve reasoning_effort none when thinking is disabled). The author declined the change and cited vendor model pages listing minimal/low/medium/high for the GPT-5 family; the reporter cited the generic SDK union. Which value those three ids actually accept is an external fact this review could not settle inside its budget, and it decides whether this path prevents an API rejection or silently discards a user setting. It needs a maintainer decision, and whichever way it goes, a test that pins what reaches the wire for exactly those three ids.
No longer blocking — the Welcome carry-over. packages/web-shell/client/App.tsx:1368-1377 now returns false from reasoningPreviewSupports when the preview reports canEnable: false and is not already enabled, and that gate is what the carry-over paths consume (:8945, :9179, :9781). The reported "renders thinking ON on a target that cannot be enabled" path is closed at this head.
Partially confirmed — persisted none surviving a model switch or reload. packages/cli/src/acp-integration/session/Session.ts:10752-10753 derives configuredReasoning from the declared capability and treats a model as table-driven only when no capability was declared, and the clear guard at :10781 keys on the declared canDisable; getModelConfiguration (packages/cli/src/acp-integration/model-configuration.ts:270-289) forces canDisable: false only onto the returned merged object, not onto the declared one. That is consistent with the claimed fix, but the full reconcile path across both writable settings scopes was not traced end to end, so this is recorded as not fully confirmed rather than as fixed.
Not verified at this head: the OpenRouter sampling-layer flat reasoning_effort reporting path (getGptReasoningOverrideState in model-configuration.ts versus the flat-over-nested precedence in pipeline.ts).
Gates not completed in this run
The independent Critical-only scan of this head was not performed. The head moved after the previously reviewed commit and grew: packages/cli/src/serve/workspace-providers-status.ts (+15/-5) and its new workspace-providers-status.test.ts (+115) are new and were not read at all, and acpAgent.ts (+90/-22) and model-configuration.ts (+215/-9) both grew. No new Critical is claimed in either direction for that unreviewed surface.
CI
Test, lint, integration, serve A/B and the TUI/web-shell visual gates pass at this head; web-shell E2E Smoke and review-pr are still pending. No failure attributable to this PR was observed, and CI is not the reason for this verdict.
Suggested next step
Settle the gpt-5 family thinkingMandatory question with a maintainer decision plus a wire-level test for those three ids, then the remaining two items (the reconcile scope trace and the OpenRouter override reporting) can be confirmed in one pass at a single head.
|
Follow-up to review 5152051695, against the unchanged head GPT-5 family support. The model-specific official evidence supports retaining the current mandatory-thinking classification. The GPT-5 family guide explicitly names Exact-model test coverage. The current request-level test matrix already checks that raw Remaining review scope. This review confirms the Welcome carry-over fix and explicitly leaves the persistence trace, OpenRouter reporting, and the new cold-preview surface partially or wholly unverified. The R6 report records the persistence/OpenRouter evidence; the cold Welcome follow-up records both preview producers and the real daemon/Chromium and direct ACP verification on the current change. An incomplete review is not approval, but its unverified sections do not establish additional defects either. CI update. Qwen Code CI on this exact head has now completed successfully, including all 58 Web Shell smoke tests. Serve A/B, Web-shell Visuals, TUI checks and SDK Java also passed. Automatic PR review is still running at the time of this reply. The proposed disposition is to retain the documented model classification, add the two exact-model request cases, and use the existing evidence for a focused completion of the remaining review. Maintainer confirmation of the compatibility policy is welcome; the current evidence does not substantiate the claim that these three models must accept 中文说明官方 GPT-5 家族指南明确将基础款、mini、nano 列在一起,支持 当前请求层测试已覆盖 GPT-5 移除原始 本轮确认了 Welcome carry-over 已修复,其余相关路径明确写的是未核查完成,应结合已有报告定点补完核查。主 CI 已全部通过,包括 58 项 Web Shell 冒烟测试;自动评审仍在运行。建议保留实现、补齐两个型号的请求测试,并由维护者确认兼容策略。 |
doudouOUC
left a comment
There was a problem hiding this comment.
Read-only review at head 9355b21d. Verdict: APPROVE, one non-blocking Suggestion inline.
Delta commit verified. 9355b21d (fix: align cold reasoning previews with session controls) is the only commit on top of the previously reviewed 9c48225e. Both cold preview call sites (serve workspace-providers-status.ts and acpAgent workspaceProviders) now resolve the target provider's generationConfig and pass it into buildModelReasoningConfigPreview; the two getGptReasoningOverrideState calls (with/without the effective reasoning state) correctly derive display state and enableValue/canEnable constraints, and the new it.each matrix plus the acpAgent test pin the claimed behaviors, including the settings-file no-write assertion.
Core surfaces re-verified at this head. Normalize order (:batch strip → shared normalize → dated-snapshot/patch-version collapse) leaves unknown minors and non-GPT models at generic behavior. flattenGptReasoningEffort runs after the extra_body merge, fills only placeholder flat slots, drops just the effort key, and is skipped entirely for OpenRouter and raw-nested-bearing configs; DashScope applies the same flattening for GPT models it serves. The mandatory-none cleanup keeps tool_choice=required handling gated on explicitThinkingMandatory only, so GPT-table mandatory models do not newly trigger the DashScope forced-tool drop. Declared capabilities keep priority over the built-in table in both supportedReasoningEffortsFor and getModelConfiguration.
R6-3 disposition stands. The design doc now records the vendor sources: the GPT-5 family page lists minimal/low/medium/high for gpt-5/gpt-5-mini/gpt-5-nano, and none was introduced with GPT-5.1. Keeping those three mandatory (stripping an unsupported flat none rather than emitting a value the API rejects) is the correct call; qqqys's follow-up approval reached the same conclusion.
CI: all gate checks SUCCESS at this head; review-pr bot lane still in flight (not a merge gate). The outstanding CHANGES_REQUESTED review decision is the stale bot round-6 review at d01fd784, whose findings were closed by 9c48225e + this head.
The inline Suggestion is display-only, self-heals at session creation, and does not block merge.
| : {}), | ||
| ...(enableOverride?.blocksTierChange | ||
| ? { | ||
| ...(effectiveReasoning === false ? { enabled: false } : {}), |
There was a problem hiding this comment.
[Suggestion] cold preview 与 live session 在「provider 默认关闭 thinking」场景下显示不一致。
当 provider 条目仅配置 generationConfig: { reasoning: false }(无 raw override、无已保存的 reasoningEffort 偏好)时:
- 此处
enabled: false的修正嵌套在enableOverride?.blocksTierChange条件内。该场景下第一次getGptReasoningOverrideState调用因reasoning === false在函数顶部早退返回undefined(override不生效),第二次调用(reasoning: undefined)在没有任何 raw 键时也返回undefined(enableOverride不生效)→ 两个 spread 均跳过,buildModelReasoningConfigOption回退到reasoning.defaultEnabled !== false(如 gpt-5.5 为true)→ preview 显示medium(开)。 - 而 live session(acpAgent.ts 中
reasoningEnabled = generation.reasoning !== false && ...→false)显示none(关),pipeline 线上行为也是对该模型发reasoning_effort: 'none'。
即 cold preview 显示「开」,live 与线上行为是「关」——正是本提交要消除的 cold/live 不对齐场景之一。影响仅限展示层(session 创建后自愈),且需特定配置组合触发,故为 Suggestion,不阻塞合并。
建议:将 effectiveReasoning === false → enabled: false 的投影移出 blocking 条件、放在 override spread 之后即可(effectiveReasoning === false 时 override 必为 undefined,不会与 raw override 的显示态冲突;无 raw override 时不应附加 canEnable,因为 session 内仍可正常开启)。同时建议在 workspace-providers-status.test.ts 的 it.each 矩阵中补一行无 raw override 的 { reasoning: false } 用例固定该行为。



What this PR does
Adds model-specific reasoning effort configuration for a closed set of known GPT-5 models and GPT-6 Astra. Shared model normalization handles provider prefixes, routing tags, whitespace, numeric patch versions, and dated snapshots. Unknown family suffixes and future minor versions keep the generic provider behavior. ACP and Web Shell advertise supported tiers, thinking requirements, and default state. Astra exposes low, medium, high, xhigh, and max, defaults to medium, and has no off option.
Maps configured effort to the Chat Completions
reasoning_effortfield, including on DashScope-compatible gateways serving GPT models. Unsupported tiers clamp to the known model's supported range; unrelated sampling parameters and sibling reasoning budgets survive. OpenRouter retains its nested protocol, and explicit raw request overrides retain their priority. Nullish and empty-string flat placeholders allow configured effort; raw nested values, including null, remain whole-object overrides. Mandatory-thinking cleanup removes unsupported flat none without dropping forced-tool constraints. Shared preferences survive model switches and reloads when using the built-in GPT capabilities. Explicit configured capabilities retain their tier restrictions, defaults, disable-field ownership, and persistence reconciliation. GPT capability lookup handles batch tags locally, leaving other models’ token limits and modalities unchanged.Controls report supported native flat overrides and OpenRouter nested effort values as their effective raw tier. Opaque native nested overrides show the model default. An explicit tier request blocked by a raw override fails without retaining a live change or saving a preference, even when it matches the displayed value. The thinking switch normally selects the advertised default tier, enabling models whose API default is off. With a blocking raw override, the switch restores configured defaults after off only when those defaults permit thinking. If the raw state or the session’s configured reasoning default disables thinking, the off switch is disabled and the saved preference is retained, including when configured capabilities omit a default tier or expose only a toggle. Default resolution uses the owning session or request, including after a provider entry is removed, so another workspace cannot alter this decision. ACP default always keeps its reset semantics. Welcome switch-on intent belongs to its source model and is discarded when the model changes, preserving the target’s existing preference, while an explicitly selected compatible tier still carries over. Model switching does not synthesize reset commands from saved max or none preferences.
The merge preserves explicit model reasoning capabilities from main. Validated GPT tiers are translated after raw request parameters merge, so a cleared flat field cannot swallow an accepted tier and raw nested whole-object overrides retain their priority.
A saved off preference survives mandatory GPT model switches even when capabilities are declared, unless the declaration explicitly forbids disabling. OpenRouter sampling flat overrides report their effective tier. Welcome rejects pending tiers that a raw override prevents changing, whether the target is off or already on, so the first prompt proceeds using the target state.
Why it's needed
GPT models currently expose generic effort choices and defaults that do not match their capabilities. Requests send the internal nested reasoning object instead of the Chat Completions field, while configuring sampling parameters can drop effort entirely. A selected effort can therefore be ignored or rejected.
Reviewer Test Plan
How to verify
Configure GPT-5.4 with high effort and a completion-token sampling budget. Confirm the request carries flat high effort alongside the budget, without an injected nested reasoning object.
Set the shared effort preference to max for GPT-5.1, GPT-5.4, GPT-5.6, and GPT-6 Astra. Confirm their outgoing efforts are high, xhigh, max, and max, respectively. Confirm explicit raw effort overrides retain their priority, except unsupported flat none on mandatory-thinking models.
Inspect ACP reasoning controls when switching models. Confirm GPT-5.4 defaults to thinking off, GPT-5.5 defaults to medium, and GPT-6 Astra starts at medium with all five tiers. Astra and other mandatory-thinking models must reject off. Unsupported new picker selections should be rejected. Save max, switch from GPT-5.6 Sol to GPT-5.4 and back, and verify that the original preference survives while the active tier clamps to xhigh and returns to max. Likewise, a saved off preference should survive a temporary switch to Astra.
Turn thinking on in Web Shell for a default-off GPT-5.4 session. Confirm it selects medium and enables the effort picker. Turn it off again and confirm the request sends none; OpenRouter must instead retain its nested disable field. Verify raw flat overrides and nullish/empty flat placeholders preserve their documented precedence.
Verify GPT high/max and sampling budgets through a DashScope-compatible gateway. Forced-tool requests must retain required selection on GPT Pro/Astra unless an explicit provider restriction applies. Confirm existing Qwen controls and generic provider behavior remain consistent with the baseline.
Check unknown GPT suffixes/future versions keep generic controls, while provider-prefixed known Sol/Astra models get their model capabilities. With Astra on a native endpoint and a raw flat none override in either layer, confirm the control shows medium and rejects xhigh. With native-endpoint raw nested reasoning, including null, confirm the raw value remains unchanged and blocked tier changes reject, even when selecting the displayed default.
With native flat overrides or OpenRouter nested effort, enabled, and token-budget overrides, verify blocked tier changes reject and settings stay unchanged. Turn an opaque GPT-5.5 configuration off and back on: its raw default must be restored when that default permits thinking; selecting a tier must still reject. With raw flat none, OpenRouter nested disable, or a configured reasoning default of false combined with a blocking raw override, the ON action must be disabled, send no configuration request when clicked, and retain saved preferences in both user and workspace settings, including configured tiers without a default and toggle-only controls. An explicit default command must still reset the preference. On Welcome, turn Qwen thinking on, switch to GPT-5.4, and submit: the target keeps its existing preference without persisting Qwen’s xhigh or clearing a saved off preference. An explicit xhigh selection remains transferable.
Declare a GPT model’s reasoning capabilities explicitly. Verify its permitted tier list and native disable field are preserved. Null/empty flat fields still allow selected effort, raw nested overrides still own their object, and a non-GPT batch route keeps its original output limits and modalities.
On Welcome, explicitly select xhigh on another model, then select a target whose raw parameters fix its effort. Check both an off/cannot-enable target and an already-on High target: the preview must retain the target state and the first prompt must send without a rejected tier write. A compatible target without a raw restriction should still carry xhigh.
Start a cold Welcome workspace with a saved off preference and a provider raw reasoning override. If the raw default permits thinking, turning ON should use the accepted default reset and the first message should receive a reply. If raw settings prevent enabling, ON should remain disabled and the first message should still succeed without changing the saved preference. A provider with empty generation settings must keep ordinary controls even when top-level settings contain a raw disable.
Evidence (Before & After)
The baseline used globally installed Qwen Code 0.23.0; verification used the local bundle with a recording mock endpoint and active ACP sessions.
Web Shell controls (GPT-5.6 Sol and GPT-6 Astra). Chromium screenshots of the current Web Shell replaying unchanged reasoning options recorded from active PR ACP sessions through the repository's mock daemon. Both models start at Medium; the screenshots show Max selected. GPT-5.6 Sol allows thinking to be toggled, while GPT-6 Astra keeps it enabled and locks the switch. Playwright verified all five tiers, the initial Medium value, both thinking-switch states, and the persisted Max selection requests.
Request fields (Before & After). Comparisons generated from new recording-mock-endpoint runs for these exact two model identifiers. Each covers High, Max, and High with a 1024 completion-token budget. All six current-bundle request scenarios and both ACP capture scenarios passed; the global Qwen Code 0.23.0 baseline reproduced the nested-field, max-clamping, and sampling-effort-loss problems. Only relevant request fields are shown; real provider verification is reported separately below.
Earlier review verification (R2). Passed 3,313 unit tests (648 core, 1,746 CLI, 919 Web Shell), full build, bundle, workspace/integration typecheck, and changed-file lint/formatting. Eight deliberate mutation categories failed the expected regression assertions when protections were removed; original model, wire, ACP and UI regressions were also observed before the fixes. The rebuilt CLI passed 90 request/ACP E2E scenarios (51 wire and 39 ACP), 2 Chromium replay scenarios, and 13 no-network checks; 200 local mock API calls were recorded, including one fixture-only rerun. After the audit findings were fixed, two consecutive full-diff self-audits and the final independent reverse review found no further issue. R2 verification report. Prior verification remains available in the earlier follow-up report.
Cold Welcome follow-up (current,
9355b21d). Cold reasoning previews now preserve saved off preferences while advertising the accepted default reset or disabling an unavailable ON action. Passed 806 related unit tests, 4 real daemon/Chromium workflows and 2 direct ACP workflows, each receiving the first reply. Full build/bundle, full typecheck, changed-file lint/formatting and two consecutive self-audit and independent audit passes completed before commit. Only inference was mocked on loopback; there were no new external model calls. Reproduction, verification and current CI status.Historical R6 review verification (
9c48225e). Fixed saved-off preference loss, OpenRouter raw-tier reporting, and Welcome first-prompt failures, including a raw-on combination found in pre-commit reverse audit. Passed 2,937 unit tests, 27 built CLI ACP scenarios / 200 assertions, 3 final built-WebShell scenarios, 4 Welcome browser cases and all 58 Chromium smoke cases on the first attempt. Full build/bundle, full typecheck, repository lint/formatting and two consecutive root and independent clean audits passed before commit. R6 verification, deferred inventory and CI status.Historical R5 CI and main integration verification. Merged the current main gate and its slow-rendering history-anchor fix, then corrected three obsolete mock references exposed by integration. Passed full build/bundle, full typecheck, repository lint/formatting, 3,441 focused unit tests and 9 lint-gate tests. All 58 Chromium smoke cases passed on their first attempt, including the 4× CPU throttled case that reproduced the original 286px failure. The existing GPT effort matrix also passed: 27 ACP scenarios / 560 assertions and 9 built-WebShell scenarios, with two consecutive clean self-audits and independent review passes. R5 verification and CI status.
Historical R4 switch correction verification. Unavailable ON actions are now disabled and retain both settings scopes; legitimate raw-on restoration and explicit default reset remain supported. Verification passed 1,808 unit tests, 27 actual ACP scenarios with 560 assertions, and 9 built-WebShell browser scenarios with 129 local mock requests. Full build/bundle, final CLI build, full typecheck, lint and formatting passed. Two consecutive reverse self-audits and independent review found no remaining actionable issue. R4 verification report and limits.
Historical R3 review and conflict verification. Merged main while preserving configured model capabilities, addressed all 12 review threads, and fixed the additional Welcome preference issues found in reverse audit. Build, bundle, full typecheck, lint, formatting, and 3,392 focused unit tests pass. The core/CLI matrix passed 41 ACP cases, 18 headless wire cases and 32 no-network checks; the final bundle additionally passed 9 ACP cases, 6 key browser scenarios and the full 53-test smoke suite without automatic retries. Two consecutive root and independent audit passes found no remaining issue. The first final smoke run exposed an old test that required the implicit preference reset being removed; its corrected contract was independently reviewed before the full passing rerun. Full R3 verification and limitations.
Real provider verification (historical, before R2 review fixes). GPT-5.5 and GPT-5.6 Sol each passed five scenarios using their existing settings. GPT-6 Astra passed the same five scenarios after the extension; the earlier GPT-5-only bundle reproduced nested high, max reduced to xhigh, and effort omitted with a sampling budget. All successful primary replies were exactly
42with no tool calls. The following table records actual outgoing fields:A follow-up Astra run also passed low, medium, and xhigh, completing live coverage of all five tiers. Each tier was transmitted unchanged in flat
reasoning_effortand accepted by the configured gateway. The CLI log does not retain independently usable reasoning-token counts, so these results do not establish differences in internal computation. Across the successful GPT-5 and post-fix GPT-6 tests, 18 primary requests and 20 automatic-memory background requests completed.GPT-5.4 could not complete live verification: its configured route returned HTTP 502 with
unknown provider for model gpt-5.4, and it was absent from the authenticated model list. The max case was aborted; off and budget cases were skipped. This is reported as blocked, not passed.Tested on
Environment (optional)
Node.js 22.22.2 on macOS, using the bundled CLI and isolated configuration/runtime directories. Mock tests use loopback endpoints and mock credentials; live tests use the selected models' existing provider settings and credentials without changing the original settings.
Risk & Scope
Linked Issues
None; requested directly.
中文说明
本 PR 的改动
为已知的 GPT-5 模型和 GPT-6 Astra 增加模型专属推理 effort 配置。能力清单明确列举型号,共享规范化逻辑处理 provider 前缀、路由标签、空白、数字补丁版本和日期快照;未知后缀及未来 minor 版本保留通用 provider 行为。ACP 和 Web Shell 展示支持的档位、思考要求及默认状态。Astra 提供 low、medium、high、xhigh、max 五档,默认 medium,不提供关闭选项。
将配置的 effort 映射为 Chat Completions 的
reasoning_effort字段,包括通过 DashScope 兼容网关访问 GPT 的路径。不支持的档位会适配到已知模型范围,同时保留其他采样参数和 reasoning 预算。OpenRouter 保留嵌套协议,显式原始请求参数保持覆盖优先级。平铺字段的空值和空字符串允许配置档位生效;嵌套原始值(包括 null)保留整对象覆盖语义。强制思考清理会移除不支持的平铺 none,且不会移除强制工具约束。使用内置 GPT 能力时,共享偏好在切换模型和重载后保留;显式配置的模型能力仍决定档位限制、默认值、关闭字段和偏好清理规则。batch 标签仅在 GPT 能力查询中处理,其他模型的 token 限制和模态保持原有行为。控件将原生端点的已知平铺覆盖档位,以及 OpenRouter 的已知嵌套 effort 显示为实际原始档位;原生端点的不透明嵌套覆盖显示模型默认值。被原始覆盖阻断的显式选档会失败,不保留运行时改动、不保存偏好,即使所选值恰好等于当前显示值。思考开关通常选择已声明的默认档位,让 API 默认关闭的模型能够开启;存在阻断覆盖时,只有默认值允许思考,开关才会在关闭后恢复默认配置。若原始参数或该会话配置的默认值关闭思考,关闭状态的开关会被禁用并保留已保存的偏好,包括省略默认档位或仅提供开关的能力配置。默认值始终来自所属会话或请求,即使 provider 配置项被删除,也不会受其他工作区影响。ACP default 始终保留重置语义。欢迎页开启意图绑定来源模型,换模型时丢弃该待提交意图并保留目标已有偏好;用户明确选择的兼容档位仍可沿用。模型切换不会把已保存的 max 或 none 偏好转换成重置命令。
合并保留了 main 的显式模型推理能力。GPT 档位通过能力验证后,在原始请求参数合并完成后再转换,避免空平铺字段吞掉已确认的档位,并保留原始嵌套参数的整对象覆盖优先级。
已保存的关闭偏好在切换到声明了能力的强制思考 GPT 模型时也会保留,除非该声明显式禁止关闭。OpenRouter 的采样层平铺覆盖会显示实际档位。欢迎页会丢弃被原始参数阻断的待提交档位,无论目标当前关闭还是已开启,首条消息都按目标现有状态继续发送。
为什么需要
GPT 模型当前展示的通用 effort 档位和默认值与模型能力不符。请求发送的是内部嵌套 reasoning 对象,而不是 Chat Completions 要求的字段;配置采样参数还可能让 effort 完全丢失。因此,用户选择的 effort 可能被忽略或拒绝。
审阅者测试计划
如何验证
为 GPT-5.4 配置 high effort 和 completion-token 采样预算。确认请求同时包含平铺的 high effort 和预算,且没有自动注入的嵌套 reasoning 对象。
分别为 GPT-5.1、GPT-5.4、GPT-5.6 和 GPT-6 Astra 设置统一 max 偏好。确认实际 effort 分别为 high、xhigh、max 和 max;显式原始 effort 覆盖参数保留优先级,但强制思考模型不接受平铺的 none。
切换模型并检查 ACP 推理控件。确认 GPT-5.4 默认关闭思考,GPT-5.5 默认 medium,GPT-6 Astra 初始选中 medium 并提供全部五档。Astra 和其他强制思考模型必须拒绝关闭;新选择的不支持档位应被拒绝。保存 max,从 GPT-5.6 Sol 切换到 GPT-5.4 再切回,确认原始偏好保留,而当前档位先适配为 xhigh、再恢复为 max。同样,已保存的关闭偏好应在临时切换到 Astra 后保留。
在默认关闭的 GPT-5.4 Web Shell 会话中开启思考,确认选中 medium 且档位按钮可用。再次关闭时,请求应发送 none;OpenRouter 则使用嵌套关闭字段。确认原始平铺覆盖参数、空值及空字符串占位符合已说明的优先级。
通过 DashScope 兼容网关验证 GPT high/max 与采样预算。除非存在显式 provider 限制,GPT Pro/Astra 的强制工具请求必须保留 required 选择。确认现有 Qwen 控件和通用 provider 行为与基线一致。
确认未知 GPT 后缀和未来版本保留通用控件,带 provider 前缀的已知 Sol/Astra 型号获得正确能力。在原生端点的 Astra 任一原始参数层配置平铺 none,确认控件显示 medium 并拒绝 xhigh。原生端点上的嵌套原始 reasoning(包括 null)保持原样,阻断的档位选择应被拒绝,包括选择恰好等于所显示默认值的档位。
使用原生平铺覆盖,以及 OpenRouter 嵌套 effort、enabled 和 token 预算覆盖,确认被阻断的选档报错且设置不变。将带不透明覆盖的 GPT-5.5 先关闭再开启,默认值允许思考时应恢复原始配置,但显式选档仍被拒绝。原始平铺 none、OpenRouter 嵌套关闭参数,或同时存在阻断的原始覆盖与 reasoning 为 false 的配置默认值时,关闭状态的开关应禁用,点击不应发送配置请求,用户和工作区两层偏好应保留;明确发送 default 命令仍应重置偏好。欢迎页开启 Qwen 思考后切到 GPT-5.4 并发送,应保留目标已有偏好,不把 Qwen 的 xhigh 保存过去,也不清除已保存的关闭偏好;明确选择 xhigh 的对照场景仍可沿用。
显式声明 GPT 模型的推理能力,确认允许的档位和原生关闭字段被保留。平铺空值仍允许所选档位生效,原始嵌套覆盖仍拥有整对象优先级,非 GPT batch 路由保留原来的输出限制和模态。
在欢迎页明确选择其他模型的 xhigh 后,切换到由原始参数固定档位的目标。分别检查关闭且不可开启、以及已开启 High 的目标:预览应保留目标状态,首条消息不应因无效选档失败;没有原始限制的兼容目标仍可沿用 xhigh。
修改前后证据
基线使用全局安装的 Qwen Code 0.23.0;修复验证使用本地 bundle、可记录请求的模拟端点和实际 ACP 会话。
Web Shell 控件(GPT-5.6 Sol 和 GPT-6 Astra)。 截图来自 Chromium 中的当前 Web Shell,通过仓库的模拟 daemon 回放 PR 实际 ACP 会话所记录的推理选项,未修改这些选项。两个模型均初始选中 Medium;截图展示选择 Max 后的状态。GPT-5.6 Sol 允许切换思考开关,GPT-6 Astra 则保持开启并锁定开关。Playwright 已验证完整五档、初始 Medium、两种思考开关状态,以及选择 Max 时发出的持久化配置请求。
请求字段(修改前后)。 对比图来自针对这两个精确模型标识重新采集的模拟端点请求。每个模型覆盖 High、Max,以及 High 与 1024 completion-token 预算并用。当前 bundle 的六项请求场景及两项 ACP 采集场景全部通过;全局 Qwen Code 0.23.0 基线复现了嵌套字段、max 被降低和采样参数导致 effort 丢失的问题。仅展示相关请求字段;真实 provider 验证在下文单独报告。
历史 R2 评论验证。 通过 3,313 项单元测试(core 648 项、CLI 1,746 项、Web Shell 919 项)、完整构建、打包、workspace/集成测试类型检查,以及改动文件的 lint/格式检查。8 类刻意移除保护的变异均触发预期回归断言;模型识别、请求字段、ACP 和 UI 问题也已在修复前复现。重新构建的 CLI 通过 90 项请求/ACP E2E 场景(51 项 wire、39 项 ACP)、2 项 Chromium 回放和 13 项无网络检查;共记录 200 次本机模拟 API 调用,包括一次修正测试期望后的单例重跑。 审计发现修复后,连续两轮完整 diff 自审及最终独立反向复审均未发现新问题。 详情见R2 验证报告;此前验证保留在上一轮报告。
冷启动 Welcome 补充验证(当前,
9355b21d)。 冷启动推理预览保留已保存的关闭偏好,并提供可接受的 default 重置值或禁用不可用的开启操作。806 项相关单测、4 个真实 daemon/Chromium 流程及 2 个直接 ACP 流程通过,每个流程均收到首条回复。完整构建和打包、全量类型检查、变更文件 Lint/格式检查,以及提交前主审计和独立审计各连续两轮通过。仅推理服务使用本机 mock,没有新增外部模型调用。复现、验证和当前 CI 状态。历史 R6 评论验证(
9c48225e)。 修复保存的关闭偏好误删、OpenRouter 原始档位显示以及欢迎页首条消息失败,并修复提交前反向审计发现的 raw-on 组合问题。2,937 项单测、27 个实际 ACP 场景 / 200 条断言、3 个最终构建后浏览器场景、4 个欢迎页场景和全部 58 项 Chromium 冒烟测试首次通过;完整构建、打包、类型检查、全仓 Lint/格式以及主审计和独立审计各连续两轮干净后才提交。R6 验证、延期清单和 CI 状态。R5 CI 与主线合并验证(历史)。 合并主线的新 CI 检查和慢渲染历史锚点修复,并纠正合并验证暴露的三处过期 mock 引用。完整构建、打包、全量类型检查、全仓 Lint/格式、3,441 项定向单测及 9 项 CI 检查脚本测试通过。58 个 Chromium 冒烟场景全部首次通过,包括曾准确复现 286px 偏移的 4 倍 CPU 降速场景。原 GPT effort 矩阵的 27 个 ACP 场景、560 条断言和 9 个构建后浏览器场景同样通过;连续两轮自审和独立复审均无遗留问题。R5 验证及 CI 状态。
历史 R4 思考开关修复验证。 无法完成的开启操作会被禁用并保留两层设置,合法原始参数恢复及显式 default 重置保持正常。通过 1,808 项单测、27 个实际 ACP 场景及 560 条断言、9 个构建后 Web Shell 浏览器场景,共 129 次本机模拟请求。完整构建与打包、最终 CLI 构建、全量类型检查、Lint 和格式检查通过。连续两轮反向自审及独立复审未发现遗留问题。R4 验证记录与范围。
历史 R3 评论和冲突验证。 已合并 main 并保留显式模型能力,处理全部 12 条评论,并修复反向审计额外发现的欢迎页偏好问题。构建、bundle、全量类型检查、Lint、格式及 3,392 项定向单测通过。核心/CLI 矩阵通过 41 个 ACP 场景、18 个 headless 请求场景及 32 项无网络检查;最终 bundle 另外通过 9 个 ACP 场景、6 个关键浏览器场景和完整 53 项冒烟测试,无自动重试。连续两轮自查和独立审查未发现遗留问题。最终第一轮冒烟暴露了一个要求执行已移除隐式重置的旧用例;修正合同经独立审查后,全套重跑通过。完整 R3 验证记录及限制。
真实 provider 验证(R2 评论修复前的历史记录)。 GPT-5.5 和 GPT-5.6 Sol 各使用已有设置通过五项场景。扩展后的 GPT-6 Astra 也通过相同五项场景;扩展前的 GPT-5 专用 bundle 复现了 high 使用嵌套字段、max 被降为 xhigh、采样预算导致 effort 丢失的问题。所有成功的主请求均准确回复
42,无工具调用。下表列出实际发出的字段:随后补测的 Astra low、medium、xhigh 也全部通过,完成五档真实覆盖。每档均原样写入平铺的
reasoning_effort,并被配置网关接受。CLI 日志未保留可独立核验的 reasoning token 计数,因此这些结果不证明内部计算量的差异。成功的 GPT-5 和修复后 GPT-6 测试共完成 18 个主请求及 20 个自动记忆后台请求。GPT-5.4 未能完成真实验证:配置的路由返回 HTTP 502 和
unknown provider for model gpt-5.4,经过认证的模型列表也没有该模型。max 场景已中止,关闭及预算场景已跳过。该结果记录为受阻,未记为通过。测试平台
环境
macOS、Node.js 22.22.2;使用打包后的 CLI 和隔离的配置及运行目录。模拟测试使用回环端点和模拟凭据;真实测试使用所选模型已有的 provider 配置和凭据,未修改原始设置。
风险与范围
关联 Issue
无;由用户直接提出。