|
|
@@ -530,7 +530,17 @@ export function useAiChat() {
|
|
|
parseSSEEvent(buffer, aiMessage)
|
|
|
}
|
|
|
} catch (err: any) {
|
|
|
- aiMessage.content += `\n\n[连接错误: ${err.message || '未知错误'}]`
|
|
|
+ const errText = `\n\n[连接错误: ${err.message || '未知错误'}]`
|
|
|
+ aiMessage.content += errText
|
|
|
+ // 同步写入 segments,确保 segments 渲染分支下也能显示错误
|
|
|
+ if (!aiMessage.segments) aiMessage.segments = []
|
|
|
+ const last = aiMessage.segments.at(-1)
|
|
|
+ if (last && last.kind === 'text') {
|
|
|
+ last.content += errText
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ aiMessage.segments.push({ kind: 'text', content: errText })
|
|
|
+ }
|
|
|
} finally {
|
|
|
isStreaming.value = false
|
|
|
// 每次消息完成后保存到 IndexedDB
|
|
|
@@ -668,9 +678,21 @@ export function useAiChat() {
|
|
|
catch { /* ignore */ }
|
|
|
break
|
|
|
}
|
|
|
- case 'error':
|
|
|
- aiMessage.content += `\n\n[错误: ${payload.content || '未知'}]`
|
|
|
+ case 'error': {
|
|
|
+ const errText = `\n\n[错误: ${payload.content || '未知'}]`
|
|
|
+ aiMessage.content += errText
|
|
|
+ // 同步写入 segments:当本轮已产生 tool/text 片段时,渲染走 segments 分支,
|
|
|
+ // 若不同步写入,错误信息将不会显示(只存在于 content 中)。
|
|
|
+ if (!aiMessage.segments) aiMessage.segments = []
|
|
|
+ const last = aiMessage.segments.at(-1)
|
|
|
+ if (last && last.kind === 'text') {
|
|
|
+ last.content += errText
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ aiMessage.segments.push({ kind: 'text', content: errText })
|
|
|
+ }
|
|
|
break
|
|
|
+ }
|
|
|
}
|
|
|
} catch {
|
|
|
// 非 JSON 数据忽略
|