fix(consult): treat pinched answers as failed and restore reply actions

Incomplete Flash generations were billed as completed consultations. Fail
those runs, keep the partial text, and reuse the rectification like/copy/rerun
bar on ordinary chat replies.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-19 19:37:02 +08:00
parent c38f11dbd3
commit 7d667fecbf
17 changed files with 487 additions and 89 deletions
+32
View File
@@ -4569,4 +4569,36 @@
- 防复发:停止收集不得只做口头确认;下一步必须来自 `next_user_action.on_user_stop`
- 相关记录:BUG-179、BUG-292
- 复发自:BUG-179(禁止正文写时间后,若卡片未出现就没有任何排盘结果)
- 修复版本:40a59504
## BUG-305 | 咨询生成半截结束仍被当成成功回答并扣点
- 状态:resolved
- 首次发现:2026-08-19
- 最近更新:2026-08-19
- 影响面:普通咨询 `POST /api/consult``streamAgentResponse`、咨询页 NDJSON 收口、DeepSeek V4 Flash 生成预算
- 用户现象:staging 一次咨询回答停在半截标题,输入框随即恢复可输入,界面看起来像已经答完。服务端把该条助手消息按成功咨询写入会话。
- 触发条件:网页个人咨询,模型为 DeepSeek V4 Flash。计算工具已成功,随后组织回答时输出在句中停止。观测到会话更新约 2.5 分钟后收口,公开回执 `stepBudget.truncated=false`,客户端收到 `run.completed`
- 根因:两层。其一,`finish_reason=length` 与超时中断后的半截正文仍走 `run.completed``complete_consultation_response`,公开回执故意不含 `modelFinishReason`,界面无法区分正常结束与夹断。其二,咨询 `agent.stream` 未设可见输出预算,也未关闭 Flash 默认 thinking;隐藏推理与可见正文共用 `max_tokens`,更容易在标题中途 `length` 停住。`AGENT_TIMEOUT_MS = 110_000` 与路由 `maxDuration = 120` 仍可能在组答阶段掐流,旧逻辑同样把已发出的半截当成功。
- 修复:可见正文在 `length` 结束,或超时/中止时已有输出,改为 `run.failed` / `answer_truncated`,保留已流出文本,账务走 `cancel`。咨询流设置 `maxOutputTokens = 8192`,并对当前供应商与 `openai` 兼容键关闭 thinking。客户端保存半截助手消息并提示未完成、不会扣点,不再要求 `run.completed` 才落盘。
- 验证:`frontend/tests/consultation-agentic-runtime.test.ts` 覆盖 `length` 与超时半截不得 `run.completed`、不得调用 `onComplete``consultation-workflow-contract.test.ts` 锁定输出预算与 thinking disabled`consultation-recovery.test.ts``chat-stream-layout.test.ts` 锁定半截落盘与提示;`agent-observability.test.ts``answer_truncated` 纳入已知错误码。
- 防复发:有可见正文不等于咨询完成。`finish_reason=length`、超时半截不得再映射为 `run.completed`。咨询生成必须显式保留可见 token 预算;不得依赖 Flash 默认 thinking 与提供方默认 `max_tokens`。公开回执仍不得带 `modelFinishReason`,失败码必须能单独说明夹断。
- 相关记录:BUG-280、BUG-277
- 复发自:无
- 修复版本:待提交
## BUG-306 | 普通咨询 Agent 回答下方缺少赞踩复制重跑操作栏
- 状态:resolved
- 首次发现:2026-08-19
- 最近更新:2026-08-19
- 影响面:普通咨询会话消息列表、`ChatMessageActions`、生时校正消息操作栏
- 用户现象:生时纠正每条 Agent 回答下方有赞、踩、复制和重跑图标,普通咨询同一位置没有。
- 触发条件:打开普通咨询会话,查看已完成的助手回答。
- 根因:BUG-049 / BUG-185 只把操作栏接到生时校正消息列表。普通咨询 `page.tsx` 只渲染 `ChatMessageRow`,没有复用同一组操作。
- 修复:抽出共用 `ChatMessageActions`。普通咨询与生时校正共用赞踩互斥、复制和仅最新回答可重跑。普通咨询重跑去掉最后一条助手消息后走现有 `/api/consult`(会扣点),失败则恢复原文;生时校正仍走免费原位 regenerate。
- 验证:`frontend/tests/chat-message-actions.test.ts``chat-stream-layout.test.ts``rectification-agentic-entry.test.ts`
- 防复发:普通咨询与生时校正的可见操作必须共用同一组件;不得再复制一套图标按钮。
- 相关记录:BUG-049、BUG-094、BUG-185
- 复发自:无
- 修复版本:待提交