- **基础聊天界面(GUI)**
- 底部多行输入框:输入问题或聊天内容。
- 聊天消息展示区:按时间顺序显示对话,区分用户消息和 AI 消息。
- 发送按钮:点击后把输入内容发给 AI,并清空输入框。
- **与 DeepSeek 模型的问答能力**
- 使用 HTTP POST 调用 DeepSeek 的聊天接口,将用户输入和历史对话一起打包为 JSON 发送。
- 解析 DeepSeek 返回的 JSON,提取模型回复文本。
- 将 AI 回复渲染为聊天气泡插入到界面中。
- **多轮对话与历史记录**
- 在内存中维护一份对话列表,作为后续请求的上下文。
- 每次对话自动保存为本地 JSON 文件,包含消息角色、内容、时间戳和头像路径。
- 左侧“历史对话”列表可以随时打开旧对话并恢复到聊天窗口。
- **多模式 / 自定义模式**
- 内置多种预设模式(如专业 / 简洁 / 友好 / 分析 / 创意等),适合不同场景。
- 支持完全自定义:
- 自定义人设(System Prompt):决定 AI 的说话风格和角色定位;
- 专属欢迎语:每个模式有自己的欢迎文案;
- 模式持久化:自定义模式保存在本地 properties 文件,下次打开仍然存在。
- **推荐问题按钮**
- 每次 AI 回答后,根据内容自动生成 1~3 个可能的后续提问。
- 以按钮形式展示,点击即可直接继续追问,适合不知道该问什么的时候。
- **停止按钮(中断当前回答)**
- 当 AI 正在生成长回答时,可以点击输入框旁的“停止”按钮终止本次请求。
- 停止后会立即恢复输入状态,并插入一条“回答已被中断”的系统消息。
- **对话管理与清理(在其他图片有体现故没放图)**
- 顶部工具栏的 `➕` 按钮:新建一个空白对话,不影响已有历史记录。
- 顶部 `🗑️` 按钮:清空当前对话,并删除对应的历史对话文件。
- 左侧历史列表每一项右侧有小 `❌` 按钮,可以删除整条历史对话(包含对应 JSON 文件)。
- 聊天区中,每条消息右键菜单提供“删除该消息”,只移除当前气泡,不影响其他消息。
- **现代化界面与 Markdown 渲染**
- 气泡式聊天布局,左右对齐区分用户和 AI。
- 支持 Markdown:代码块、列表、加粗等都能正常显示,更适合技术类答案。
- 支持深色/浅色主题、字体大小调整,让阅读更舒适。
一次请求是如何流转的?
1. 用户在输入框中输入问题,点击“发送”。
2. `ModernChatGUI.sendMessage()`:
- 创建一条 `ChatMessage(role="user")`;
- 加到内存中的 `conversationHistory` 列表;
- 在界面上渲染一条“用户消息气泡”。
3. 创建并启动一个 `SwingWorker`(`currentWorker`):
- 在后台线程中调用 `DeepSeekAPI.sendChatRequest(conversationHistory)`;
- 把整段对话上下文一起发给 DeepSeek,获得新的回复文本。
4. `done()` 回到 UI 线程:
- 创建一条 `ChatMessage(role="assistant")`,保存当前模式的头像路径;
- 渲染 AI 消息气泡;
- 调用 `autoSaveConversation()` 写入 JSON 文件;
- 调用 `addSuggestedQuestions(response)` 生成推荐问题按钮。
5. 用户可以继续提问,形成一个完整的多轮对话闭环。
### 5.3 项目架构概览
可以简单理解为三层:
- **UI 层(界面与交互)**:
- `ModernChatGUI`:主窗口,负责布局、按钮事件、键盘事件。
- `MessageBubbleSimple` / `AIMessageBubble`:消息气泡的绘制与排版。
- `MarkdownRenderer`:把 AI 文本渲染成带格式的 HTML/组件。
- **业务层(状态与会话逻辑)**:
- `AIModeManager`:当前模式、所有可选模式、自定义模式的保存与加载。
- `ConversationHistory`:在内存中维护 `List`,并负责与 JSON 文件互相转换。
- `ChatMessage`:一条消息的领域对象(角色、内容、时间戳、头像路径)。
- **基础设施层(API 与存储实现)**:
- `DeepSeekAPI`:负责 HTTP 调用和 JSON 解析,是与外部服务交互的唯一入口。
- `org.json` 等第三方库:支撑 JSON 的读写。