| 问题 | 状态 | 修改文件 | 改动行数 |
|---|---|---|---|
| 智能图表生成状态感知 | ✅ 已修复 | chat-message-display-optimized.tsx |
~60 行 |
| 聊天窗口高度限制 | ✅ 已修复 | chat-panel-optimized.tsx |
1 行 |
- 大模型显示"空闲"
- 图表仍显示"生成中"
- 实际图表已生成
Token 限制导致流式输出中断,状态未同步
双重检测机制:
-
自动检测(主要)
- 流结束时自动完成
- 无需用户操作
- 适用于 90% 场景
-
超时检测(辅助)
- 5分钟后显示提示
- 提供手动完成按钮
- 保底方案
正常场景:
生成中 → 已完成
提示:图表生成完成,已实时渲染到画布
Token 限制场景:
生成中 → 已完成(自动)
提示:流式输出已结束,图表已自动应用到画布
超时场景:
生成中 → 显示黄色提示框
提示:长时间无响应,流式输出可能已结束
操作:点击"应用当前图表"按钮 → 已完成
- 消息多时窗口无限增长
- 可能超出视口
缺少显式高度限制
添加 style={{ maxHeight: '100%' }}
消息少 → 正常显示
消息多 → 出现滚动条
新消息 → 自动滚动到底部
# 测试1:正常生成
1. 发送:"帮我画一个简单的流程图"
2. 观察状态是否正确变为"已完成"
# 测试2:Token 限制
1. 发送:"帮我画一个包含50个节点的复杂系统架构图"
2. 观察是否自动完成
3. 提示信息是否正确
# 测试3:超时检测
1. 开启网络限速(Chrome DevTools → Network → Slow 3G)
2. 发送图表请求
3. 等待5分钟
4. 观察是否显示超时提示
5. 点击"应用当前图表"按钮# 测试1:少量消息
1. 发送 3-5 条消息
2. 确认布局正常
# 测试2:大量消息
1. 发送 20+ 条消息
2. 确认出现滚动条
3. 滚动功能正常
# 测试3:窗口调整
1. 调整浏览器窗口大小
2. 确认布局适应文件:components/chat-message-display-optimized.tsx
关键代码:
// 行 93-107:流结束自动完成
useEffect(() => {
if (
!isGenerationBusy &&
!isComparisonRunning &&
localState === "input-streaming" &&
displayDiagramXml?.length > 0
) {
setLocalState("output-available");
setAutoCompletedByStreamEnd(true);
}
}, [isGenerationBusy, isComparisonRunning, localState, displayDiagramXml]);
// 行 119-131:超时检测
useEffect(() => {
// 5分钟后显示超时提示
const timer = setTimeout(() => {
if (localState === "input-streaming") {
setShowTimeoutHint(true);
}
}, 300000);
return () => clearTimeout(timer);
}, [localState]);文件:components/chat-panel-optimized.tsx
关键代码:
// 行 1119-1122:添加高度限制
<div
className="flex-1 min-h-0 overflow-y-auto ..."
style={{ maxHeight: '100%' }}
>
<ChatMessageDisplay ... />
</div>如果需要回滚修复:
删除以下内容:
autoCompletedByStreamEndstateshowTimeoutHintstatestreamingStartTimeRefref- 流结束检测 useEffect
- 超时检测 useEffect
handleManualComplete函数- 超时提示 UI
- 状态提示信息中的自动完成判断
删除:
style={{ maxHeight: '100%' }}- CPU:可忽略(< 0.1%)
- 内存:< 1KB
- 渲染:无额外开销
- 网络:无影响
| 浏览器 | 最低版本 | 测试状态 |
|---|---|---|
| Chrome | 90+ | ✅ 兼容 |
| Firefox | 88+ | ✅ 兼容 |
| Safari | 14+ | ✅ 兼容 |
| Edge | 90+ | ✅ 兼容 |