修复: 流式重试N+1气泡根治(UX-260618-15第一批方案A)
- stream_recv: InitFailed加error字段,5处重试路径移除AiError emit(retryable交agentic统一emit) - agentic: 重试loop只emit AiStreamRetry,Fatal/全candidate耗尽emit最终AiError(单气泡聚合) - useAiEvents: AiStreamRetry改首次创建+后续更新(N+1气泡消除) - 注释残留修正(stream_recv :251/:299 旧"emit AiError"→"返回InitFailed") N+1独立气泡降为「1重试气泡+1最终错误气泡」
This commit is contained in:
@@ -175,12 +175,23 @@ export function handleEvent(event: AiChatEvent) {
|
||||
break
|
||||
|
||||
case 'AiStreamRetry': {
|
||||
// CR-30-2 / F-260616-07(d) / 决策 a1: 流前失败重试中——后端 emit AiError(Init Err)
|
||||
// 后再 emit 此事件。前端更新错误气泡内容为「重试 n/m」,对齐决策"错误气泡内更新"。
|
||||
// UX-260618-15: 流前失败重试中——后端 emit AiStreamRetry 携带 attempt/max_attempts。
|
||||
// 方案 A 根治 N+1 气泡:后端重试过程不再先 emit AiError(emit 权交 agentic 重试耗尽/Fatal 时
|
||||
// 统一发最终错误),故首次 AiStreamRetry 到达时末条不是 isError,需创建新错误气泡;
|
||||
// 后续 AiStreamRetry 到达时末条已是 isError,仅更新 content(单气泡聚合)。
|
||||
// 看门狗已在上方 NO_RESET_WATCHDOG 之外(此事件不在集合内)reset,不卡整流超时。
|
||||
const lastErr = state.messages[state.messages.length - 1]
|
||||
if (lastErr && lastErr.isError) {
|
||||
lastErr.content = t('ai.aiStreamRetry', { attempt: event.attempt, max: event.max_attempts })
|
||||
const lastMsg = state.messages[state.messages.length - 1]
|
||||
const retryText = t('ai.aiStreamRetry', { attempt: event.attempt, max: event.max_attempts })
|
||||
if (lastMsg && lastMsg.isError) {
|
||||
lastMsg.content = retryText
|
||||
} else {
|
||||
state.messages.push({
|
||||
id: `err-${nextMsgId()}`,
|
||||
role: 'assistant',
|
||||
content: retryText,
|
||||
isError: true,
|
||||
timestamp: Date.now(),
|
||||
} as AiMessage)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user