fix(desktop): hide model selector in Tauri runtime — SaaS token pool routes models
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Model selector was cosmetic-only in desktop mode: chatStream never passes model param to backend. Hiding prevents user confusion and 404 errors when selecting models not in SaaS token pool. Also adds E2E test report covering 168 messages, 4 bugs found (P0 fixed).
This commit is contained in:
@@ -31,6 +31,7 @@ import { ReasoningBlock } from './ai/ReasoningBlock';
|
||||
import { StreamingText } from './ai/StreamingText';
|
||||
import { ChatMode } from './ai/ChatMode';
|
||||
import { ModelSelector } from './ai/ModelSelector';
|
||||
import { isTauriRuntime } from '../lib/tauri-gateway';
|
||||
import { SuggestionChips } from './ai/SuggestionChips';
|
||||
import { PipelineResultPreview } from './pipeline/PipelineResultPreview';
|
||||
import { PresentationContainer } from './presentation/PresentationContainer';
|
||||
@@ -540,12 +541,14 @@ export function ChatArea({ compact, onOpenDetail }: { compact?: boolean; onOpenD
|
||||
}
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
{!isTauriRuntime() && (
|
||||
<ModelSelector
|
||||
models={models.map(m => ({ id: m.id, name: m.name, provider: m.provider }))}
|
||||
currentModel={currentModel}
|
||||
onSelect={setCurrentModel}
|
||||
disabled={isStreaming}
|
||||
/>
|
||||
)}
|
||||
<Button
|
||||
variant="primary"
|
||||
size="sm"
|
||||
|
||||
118
docs/PRE_RELEASE_E2E_TEST_REPORT.md
Normal file
118
docs/PRE_RELEASE_E2E_TEST_REPORT.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# ZCLAW 发布前 E2E 测试报告
|
||||
|
||||
> 日期: 2026-04-09
|
||||
> 测试方式: Chrome DevTools MCP + Tauri MCP 端到端自动化
|
||||
> 测试目标: 模拟真实用户操作,验证核心功能稳定性
|
||||
|
||||
## 测试概览
|
||||
|
||||
| 指标 | 值 |
|
||||
|------|-----|
|
||||
| 总消息数 | 168 条 |
|
||||
| 用户消息 | 84 条 |
|
||||
| AI 回复 | 84 条(19 条真实内容 + 65 条空响应/错误) |
|
||||
| 测试时长 | ~2 小时 |
|
||||
| 测试模型 | GLM-4.7(前18轮), deepseek-chat / glm-4-flash(后续,错误) |
|
||||
|
||||
## 测试场景
|
||||
|
||||
### 场景 1: 随机话题对话(16 轮)
|
||||
- 状态: 部分成功
|
||||
- 问题: GLM-4.7 响应慢(~67s/轮),部分超时
|
||||
- 发现: 历史消息中的 "Sending..." 标签导致完成检测误判
|
||||
|
||||
### 场景 2: 教育行业连续对话(89 轮脚本,模拟小学班主任王老师)
|
||||
- 6 个阶段: 身份建立 → 教学深化 → 班级管理 → 期末收尾 → 新学期展望 → 深度验证
|
||||
- 前 18 轮(GLM-4.7): 全部成功,对话质量极高
|
||||
- 后 65 轮: 全部失败(模型错误导致空回复)
|
||||
|
||||
## 发现的 BUG
|
||||
|
||||
### P0: 模型选择器桌面端误导用户
|
||||
|
||||
**状态**: 已修复
|
||||
|
||||
**问题**: Tauri 桌面端的模型选择器让用户以为可以切换模型,但实际模型由 SaaS Token 池决定,前端选择不传后端。
|
||||
|
||||
**影响**: 用户选择 "GLM-4.7" 但实际可能调用 "glm-4-flash"(不存在),导致 404 错误和空回复。
|
||||
|
||||
**根因**: `StreamChatRequest`(Rust)和 `chatStream`(TS)均无 `model` 参数。模型由后端 agent 配置决定。
|
||||
|
||||
**修复**: 在 `ChatArea.tsx` 中对 Tauri 运行时隐藏模型选择器。
|
||||
|
||||
**文件**: `desktop/src/components/ChatArea.tsx`
|
||||
|
||||
### P1: API 错误时 assistant 消息内容为空
|
||||
|
||||
**问题**: 当 LLM 返回错误(404/429)时,assistant 消息的 `content` 为空字符串,错误信息仅显示在 UI 的错误气泡中,不存入 Store。
|
||||
|
||||
**影响**:
|
||||
- 对话历史中的空消息无法追溯错误原因
|
||||
- 记忆系统可能索引空内容
|
||||
- 侧边栏消息预览显示为空白
|
||||
|
||||
**建议**: 将错误信息存入 `message.content` 或 `message.error` 字段。
|
||||
|
||||
### P2: 429 Rate Limit 未优雅处理
|
||||
|
||||
**问题**: DeepSeek API 60 RPM 限流触发后,前端直接显示错误,没有重试/退避机制。
|
||||
|
||||
**影响**: 自动化测试中高频发送消息时容易触发限流。
|
||||
|
||||
**建议**: 前端实现指数退避重试(2s → 4s → 8s),最多 3 次。
|
||||
|
||||
### P3: 错误消息的"重试"按钮堆叠
|
||||
|
||||
**问题**: 连续多轮失败后,UI 中堆叠了 7+ 个"重试"按钮(见截图),影响可读性。
|
||||
|
||||
**建议**: 错误消息应可折叠,或只保留最后一个错误的"重试"按钮。
|
||||
|
||||
## 对话质量评估(前 18 轮 GLM-4.7)
|
||||
|
||||
### 上下文记忆测试
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| 记住用户身份(王老师) | PASS |
|
||||
| 记住班级信息(38人、三年级2班) | PASS |
|
||||
| 记住学生名字(张小明、刘小花) | PASS |
|
||||
| 引用之前讨论的内容 | PASS |
|
||||
| 教学建议的专业性 | PASS |
|
||||
| 情感支持和沟通技巧 | PASS |
|
||||
|
||||
### 典型回复示例
|
||||
|
||||
**第 8 轮(注意力评估建议)**: AI 正确识别了"家校表现一致"这一关键信号,建议"温和、专业、不贴标签"地沟通,并提供了具体话术模板。
|
||||
|
||||
**第 17 轮(公开课选课文)**: AI 综合考虑了班级中张小明(需要动觉学习)和刘小花(需要信心建立)的情况,推荐了三个选项并分析利弊。
|
||||
|
||||
## 内存和性能
|
||||
|
||||
| 指标 | 值 | 评价 |
|
||||
|------|-----|------|
|
||||
| 初始内存 | 30 MB | 正常 |
|
||||
| 40 条消息时 | 32 MB | 稳定 |
|
||||
| 160 条消息时 | 31-35 MB | 无泄漏 |
|
||||
| GC 后 | 回落到 31 MB | 正常 |
|
||||
| 平均 AI 响应时间 (GLM-4.7) | 67s | 偏慢,但非 BUG |
|
||||
| 平均 AI 响应时间 (deepseek) | 1.3s | API 报错,非真实响应 |
|
||||
|
||||
## 修复记录
|
||||
|
||||
| 修改 | 文件 | 说明 |
|
||||
|------|------|------|
|
||||
| 隐藏桌面端模型选择器 | `desktop/src/components/ChatArea.tsx` | `isTauriRuntime()` 条件渲染 |
|
||||
|
||||
## 未修复项(后续跟进)
|
||||
|
||||
1. **P1**: API 错误时 assistant 消息内容为空 — 需要修改 streamStore 的错误处理
|
||||
2. **P2**: 429 Rate Limit 重试机制 — 需要在 chatStream 中实现退避
|
||||
3. **P3**: 错误消息堆叠 — UI 优化
|
||||
|
||||
## 测试环境
|
||||
|
||||
- OS: Windows 11 Pro (10.0.26200)
|
||||
- 显示器: 5120x2880 @ 2.5x scale
|
||||
- 应用版本: ZCLAW 0.1.0
|
||||
- 后端: Tauri 2.x + Rust kernel
|
||||
- 运行时模型: SaaS Token 池路由
|
||||
Reference in New Issue
Block a user