fix: v0.8.0 修订 — 思考用户意图优先 · 移除元信息硬门控 · 实施清单入库
CI / 类型检查 + Lint + 单元测试 (push) Failing after 9m8s
CI / 全量测试 (Electron ABI) (push) Failing after 6m8s
CI / 产物编译验证 (push) Successful in 11m1s

- DeepSeek/MiMo/Agnes 移除 supportsThinking 元信息硬门控:思考参数完全遵循用户配置
  (事故复盘中 vision-exp 元信息标注不支持思考、实际产生了 8189 token 推理内容,
  元信息不可靠;预算耗尽由引擎降级重试兜底,元信息不符仅告警不拦截)
- Ollama 保留 /api/show 能力探测门控(服务端硬协议约束:向不支持思考的模型发
  think 每次请求 400,属协议正确性而非意图覆盖),探测失败 fail-open
- LLM 设置提示文案修订:元信息不符仍按用户配置发送,降级重试自动兜底
- 测试契约反向钉住:vision-exp + 用户开启→照发 enabled+reasoning_effort;
  关闭/未配置→显式 disabled;Ollama 探测 false→不发 think / null→fail-open
- 补录 docs/v0.8.0-迭代实施清单.md(含逐项验证记录与本次修订记录;
  首次提交时该文件因故未入库,本次补齐)
- 验证:typecheck 0 错误 / lint 0 问题 / 系统 Node 2146 通过 / thinking 矩阵 101 用例全绿
This commit is contained in:
2026-09-05 20:49:20 +08:00
parent 5b9d4d19b3
commit 839860083f
9 changed files with 312 additions and 56 deletions
+12 -7
View File
@@ -203,13 +203,12 @@ export class DeepSeekAdapter extends OpenAICompatibleAdapter {
}
// Thinking 模式
// v0.8.0 P0-3 根治: 模型能力门控 —— MODEL_INFO.supportsThinking === false 的
// 模型(如 deepseek-v4-flash-vision-exp)一律不发思考参数并显式 disabled,
// 防止思考消耗输出预算(生产事故:vision-exp 8192 输出预算被 max 档思考
// 全部烧光 → finish_reason=length 空回复 → 会话静默停止)。
const modelThinkingSupported =
DeepSeekAdapter.MODEL_INFO[this.config.defaultModel]?.supportsThinking !== false;
const wantThinking = request.params.thinkingEnabled === true && modelThinkingSupported;
// v0.8.0 修订(用户意图优先): 思考参数完全遵循用户配置,不再按
// supportsThinking 元信息硬门控 —— 事故复盘中 vision-exp 元信息标注
// "不支持思考"、实际却产生了推理内容,元信息不可靠。预算耗尽风险由
// 引擎空响应守卫的降级重试链路兜底(关闭思考重试一次 → 仍失败则
// OUTPUT_LENGTH_EXCEEDED 明确报错)。元信息与配置不符时仅告警不拦截。
const wantThinking = request.params.thinkingEnabled === true;
// API 默认 thinking.type = "enabled",必须显式发送 disabled 才能关闭
if (!wantThinking) {
body.thinking = { type: 'disabled' };
@@ -223,6 +222,12 @@ export class DeepSeekAdapter extends OpenAICompatibleAdapter {
};
// DeepSeek API 仅支持 high / max 两档,low/medium 映射为 high
body.reasoning_effort = effortMap[request.params.thinkingEffort ?? 'high'] ?? 'high';
// 元信息标注不支持思考但用户开启 —— 告知降级兜底路径(不拦截)
if (DeepSeekAdapter.MODEL_INFO[this.config.defaultModel]?.supportsThinking === false) {
log.warn(
`[DeepSeek] model "${this.config.defaultModel}" metadata says thinking unsupported — sending thinking params per user config (degraded retry handles budget exhaustion)`,
);
}
// v0.8.0 P0-3: 思考会占用输出预算 —— 钳制后预算过小时显式告警
//(思考 token 计入 max_tokens,预算过小会出现"思考耗尽正文为零"截断)
if (maxTokens < 8192) {