136 lines
8.2 KiB
Markdown
136 lines
8.2 KiB
Markdown
# Feature Specification: 对话抽屉 (Chat Drawer)
|
||
|
||
**Feature Branch**: `001-chat-drawer`
|
||
**Created**: 2025-12-03
|
||
**Status**: Draft
|
||
**Input**: User description: "希望把UI改成上图所示,增加一个可展开收起的对话抽屉,支持使用对话模型实现连续对话。并能记录对话记录"
|
||
|
||
## User Scenarios & Testing *(mandatory)*
|
||
|
||
### User Story 1 - 基本对话交互 (Priority: P1)
|
||
|
||
用户希望在画板右侧看到一个可展开/收起的对话抽屉,能够与AI进行连续对话,获取创作帮助和建议。
|
||
|
||
**Why this priority**: 这是核心功能,提供了最基本的对话能力,是实现所有其他功能的基础。用户可以立即开始使用AI对话功能。
|
||
|
||
**Independent Test**: 可以通过点击抽屉开关按钮,输入消息并接收AI回复来完全测试。能独立提供AI对话辅助的价值,无需依赖其他功能。
|
||
|
||
**Acceptance Scenarios**:
|
||
|
||
1. **Given** 用户在画板界面,**When** 用户点击右侧的抽屉展开按钮,**Then** 对话抽屉从右侧滑出显示
|
||
2. **Given** 对话抽屉已展开,**When** 用户点击收起按钮,**Then** 抽屉滑回收起状态
|
||
3. **Given** 对话抽屉已展开,**When** 用户在输入框输入消息并发送,**Then** 消息显示在对话区域,AI开始处理并返回回复
|
||
4. **Given** AI正在处理消息,**When** 用户等待,**Then** 显示"正在理解需求并梳理您提供的材料"的加载状态
|
||
5. **Given** 对话进行中,**When** 用户继续发送新消息,**Then** 保持上下文连续性,AI基于历史对话回复
|
||
|
||
---
|
||
|
||
### User Story 2 - 对话历史持久化 (Priority: P2)
|
||
|
||
用户希望对话记录能够保存,刷新页面或关闭应用后重新打开仍能看到之前的对话历史。
|
||
|
||
**Why this priority**: 提升用户体验,避免重复沟通,让用户可以回顾之前的对话内容和AI建议。这是P1功能的重要增强。
|
||
|
||
**Independent Test**: 可以通过创建对话、刷新页面、验证对话历史是否保留来独立测试。提供数据持久化价值。
|
||
|
||
**Acceptance Scenarios**:
|
||
|
||
1. **Given** 用户已进行多轮对话,**When** 用户刷新页面,**Then** 打开抽屉后能看到完整的历史对话记录
|
||
2. **Given** 用户关闭浏览器,**When** 用户重新打开应用,**Then** 对话历史仍然保留
|
||
3. **Given** 对话历史很长,**When** 用户滚动查看,**Then** 能流畅浏览所有历史消息
|
||
|
||
---
|
||
|
||
### User Story 3 - 多会话管理 (Priority: P3)
|
||
|
||
用户希望能够创建多个独立的对话会话,在不同话题或项目之间切换,每个会话独立保存对话历史。
|
||
|
||
**Why this priority**: 让用户能够组织不同的对话主题,避免不同话题的对话混杂在一起。这是高级功能,P1和P2已经能提供基本价值。
|
||
|
||
**Independent Test**: 可以通过创建新会话、切换会话、验证各会话独立性来测试。提供对话组织管理价值。
|
||
|
||
**Acceptance Scenarios**:
|
||
|
||
1. **Given** 用户在当前会话中,**When** 用户点击"新建会话",**Then** 创建一个空白会话,之前的会话保留
|
||
2. **Given** 存在多个会话,**When** 用户切换到不同会话,**Then** 显示对应会话的历史记录
|
||
3. **Given** 用户在会话列表,**When** 用户查看会话,**Then** 能看到会话的标题/预览和创建时间
|
||
4. **Given** 用户选中某个会话,**When** 用户删除会话,**Then** 该会话及其历史记录被移除
|
||
|
||
---
|
||
|
||
### User Story 4 - 消息操作功能 (Priority: P4)
|
||
|
||
用户希望能够对AI的回复进行操作,如复制内容、重新生成回复等。
|
||
|
||
**Why this priority**: 提升使用便利性,让用户能够更好地利用AI生成的内容。这是锦上添花的功能。
|
||
|
||
**Independent Test**: 可以通过对消息执行复制、重新生成等操作来测试。提供内容操作便利性价值。
|
||
|
||
**Acceptance Scenarios**:
|
||
|
||
1. **Given** AI已回复消息,**When** 用户点击复制按钮,**Then** 消息内容复制到剪贴板
|
||
2. **Given** AI已回复消息,**When** 用户点击重新生成,**Then** AI基于同样的用户输入生成新的回复
|
||
3. **Given** 用户对某条回复不满意,**When** 用户点击"停止生成",**Then** AI停止当前回复的生成
|
||
|
||
---
|
||
|
||
### Edge Cases
|
||
|
||
- 当网络断开时,用户发送消息会发生什么?(应显示错误提示,消息保留在输入框)
|
||
- 当对话历史非常长(如100+条消息)时,性能如何?(应实现虚拟滚动或分页加载)
|
||
- 当用户快速连续发送多条消息时,如何处理?(应排队处理,显示加载状态)
|
||
- 当抽屉展开时占用大量屏幕空间,画板区域过小怎么办?→ 抽屉宽度自适应(视口30%,最小320px,最大500px)
|
||
- 当localStorage存储空间不足时,历史记录如何处理?(应限制历史记录数量,或提供清理选项)
|
||
- 移动设备上抽屉如何显示?→ 全屏覆盖模式,抽屉打开时覆盖整个屏幕
|
||
|
||
## Requirements *(mandatory)*
|
||
|
||
### Functional Requirements
|
||
|
||
- **FR-001**: 系统必须在界面右侧提供一个可展开/收起的抽屉组件
|
||
- **FR-002**: 系统必须在抽屉中显示对话消息列表,区分用户消息和AI消息
|
||
- **FR-003**: 系统必须提供消息输入框,支持文本输入和发送
|
||
- **FR-004**: 系统必须支持连续对话,保持对话上下文
|
||
- **FR-005**: 系统必须支持流式响应,AI回复以逐字符/逐词方式实时显示,并在开始前显示加载状态(如"正在理解需求并梳理您提供的材料")
|
||
- **FR-006**: 系统必须将对话历史持久化存储在浏览器本地
|
||
- **FR-007**: 系统必须在应用重新加载后恢复对话历史
|
||
- **FR-008**: 系统必须支持创建多个独立的对话会话
|
||
- **FR-009**: 系统必须提供会话列表,显示会话标题(从首条用户消息自动截取生成)和时间
|
||
- **FR-010**: 系统必须支持切换和删除会话
|
||
- **FR-011**: 系统必须集成对话模型API(使用现有的AI服务配置)
|
||
- **FR-012**: 抽屉展开/收起动画必须流畅自然
|
||
- **FR-013**: 消息列表必须自动滚动到最新消息
|
||
- **FR-014**: 系统必须在消息发送失败时显示错误提示
|
||
- **FR-015**: 系统必须提供附件上传功能(回形针图标),支持上传图片、文档和文件,附件将发送给AI进行分析
|
||
- **FR-016**: 系统必须提供暂停生成按钮(如图中的暂停图标)
|
||
- **FR-017**: 系统必须在移动设备上以全屏覆盖模式显示对话抽屉
|
||
- **FR-018**: 桌面端抽屉宽度必须自适应(视口宽度的30%,最小320px,最大500px)
|
||
|
||
### Key Entities
|
||
|
||
- **ChatSession(对话会话)**: 代表一个独立的对话,包含会话ID、标题(从首条用户消息自动生成,截取前30字符)、创建时间、最后更新时间
|
||
- **ChatMessage(对话消息)**: 代表单条消息,包含消息ID、所属会话ID、角色(用户/AI)、内容、时间戳、状态(发送中/成功/失败)、附件列表(可选,包含文件名、类型、大小、数据)
|
||
- **DrawerState(抽屉状态)**: 代表抽屉的UI状态,包含是否展开、宽度(默认为视口宽度的30%,最小320px,最大500px)、当前活跃会话ID
|
||
|
||
## Clarifications
|
||
|
||
### Session 2025-12-03
|
||
|
||
- Q: Should AI responses stream incrementally or appear all at once? → A: Stream responses token-by-token as AI generates them (progressive display)
|
||
- Q: How should session titles be generated? → A: Auto-generate title from first user message content (truncate if long)
|
||
- Q: What is the scope of attachment functionality? → A: Full attachment support - images, documents, and files sent to AI for analysis
|
||
- Q: How should the drawer behave on mobile devices? → A: Full-screen overlay - drawer covers entire screen when opened on mobile
|
||
- Q: What should be the default drawer width on desktop? → A: Adaptive - 30% of viewport width (min 320px, max 500px)
|
||
|
||
## Success Criteria *(mandatory)*
|
||
|
||
### Measurable Outcomes
|
||
|
||
- **SC-001**: 用户能够在1秒内展开/收起对话抽屉
|
||
- **SC-002**: 用户发送消息后,AI回复的首字节响应时间不超过3秒
|
||
- **SC-003**: 对话历史能够存储至少50个会话,每个会话至少100条消息
|
||
- **SC-004**: 抽屉展开/收起动画流畅,帧率保持在60fps
|
||
- **SC-005**: 90%的用户能够在首次使用时成功完成一次对话交互
|
||
- **SC-006**: 页面刷新后,对话历史恢复时间不超过500毫秒
|
||
- **SC-007**: 支持移动端和桌面端响应式布局,在不同屏幕尺寸下正常使用
|