IOS-M0-01 RAG Chat 接入真实 API #1

Closed
opened 2026-05-28 19:54:58 +08:00 by wangdl · 1 comment
Owner

目标

将 AIChatPage 的 AIChatViewModel 从 mock 模式切换到真实 API。

背景说明

当前 AIChatViewModel.send() 使用 Task.sleep(1.2s) + 硬编码文本模拟 AI 回复。后端 rag-chat 模块已完整实现 5 个接口。

后端接口

方法 路径 说明
POST /rag-chat/sessions 创建新对话
GET /rag-chat/sessions 对话列表
GET /rag-chat/sessions/:id/messages 对话历史
POST /rag-chat/sessions/:id/messages 发送消息(支持 SSE 流式)
DELETE /rag-chat/sessions/:id 删除对话

模块职责

  1. AIChatViewModel 重写:
    • 移除 Task.sleep + 假文本
    • send() → POST /rag-chat/sessions/:id/messages
    • 加载历史 → GET /rag-chat/sessions/:id/messages
  2. AIChatPage UI 适配:
    • 首次进入自动创建 session
    • 对话列表入口(历史会话切换)
    • 发送中状态 + 流式文本展示(如后端支持 SSE)
  3. 新增 RAGChatService(或扩展现有 APIService)

禁止事项

  • 禁止保留 mock 代码
  • 禁止硬编码 AI 回复
  • 不要求支持 SSE 流式(可先走普通 JSON 请求-响应)
## 目标 将 AIChatPage 的 AIChatViewModel 从 mock 模式切换到真实 API。 ## 背景说明 当前 AIChatViewModel.send() 使用 Task.sleep(1.2s) + 硬编码文本模拟 AI 回复。后端 rag-chat 模块已完整实现 5 个接口。 ## 后端接口 | 方法 | 路径 | 说明 | |------|------|------| | POST | /rag-chat/sessions | 创建新对话 | | GET | /rag-chat/sessions | 对话列表 | | GET | /rag-chat/sessions/:id/messages | 对话历史 | | POST | /rag-chat/sessions/:id/messages | 发送消息(支持 SSE 流式) | | DELETE | /rag-chat/sessions/:id | 删除对话 | ## 模块职责 1. AIChatViewModel 重写: - 移除 Task.sleep + 假文本 - send() → POST /rag-chat/sessions/:id/messages - 加载历史 → GET /rag-chat/sessions/:id/messages 2. AIChatPage UI 适配: - 首次进入自动创建 session - 对话列表入口(历史会话切换) - 发送中状态 + 流式文本展示(如后端支持 SSE) 3. 新增 RAGChatService(或扩展现有 APIService) ## 禁止事项 - 禁止保留 mock 代码 - 禁止硬编码 AI 回复 - 不要求支持 SSE 流式(可先走普通 JSON 请求-响应)
wangdl added this to the M0:iOS C 端核心功能补全 milestone 2026-05-28 19:54:58 +08:00
Author
Owner

IOS-M0-01 修复完成

问题

AIChatPageAIChatViewModel.send() 使用 Task.sleep(1.2s) + 硬编码文本模拟 AI 回复,完全没有调用后端 /rag-chat/* 接口,用户看到的是假数据。

修改

文件 变更
Core/Models/APIModels.swift 新增 6 个 RAG Chat 数据模型:ChatSessionChatMessageChatCitationCreateSessionRequestSendMessageRequestSendMessageResponse
Core/Services/APIService.swift 新增 RagChatServicecreateSession()listSessions()getMessages()sendMessage()deleteSession() 全部 5 个接口
Features/AI/AIChatViewModel.swift 重写:移除 Task.sleep + 硬编码文本,load() 自动选 KB 创建 session,send() 调用 RagChatService.sendMessage()
Features/AI/AIChatPage.swift 新增 .task { await vm.load() } 自动初始化、会话创建加载态、无知识库错误态

行为变化

场景 修改前 修改后
打开 AI 对话 直接显示硬编码 "你好!我是你的 AI 学习助手。" 自动选第一个知识库 → POST /rag-chat/sessions → 显示真实欢迎语
发送消息 Task.sleep(1.2s) + 返回固定假文本 POST /rag-chat/sessions/:id/messages → 真实 AI 回复
无知识库时 仍显示假对话 提示 "请先创建一个知识库,才能使用 AI 对话"
消息被内容安全拦截 无此逻辑 显示 blocked=true 返回的提示

接入的后端接口

方法 路径 用途
POST /rag-chat/sessions 创建对话 session
POST /rag-chat/sessions/:id/messages 发送消息、获取 AI 回复

listSessionsgetMessagesdeleteSession 3 个接口已封装在 Service 中,后续对话列表/历史功能可直接调用)

测试方式

  1. 确保至少有一个知识库(含知识点)
  2. 打开 App → 学习页 → 点击 AI 对话任务
  3. 输入问题 → 观察 AI 基于知识库内容回复
  4. 验证无知识库时的错误提示
## ✅ IOS-M0-01 修复完成 ### 问题 `AIChatPage` 的 `AIChatViewModel.send()` 使用 `Task.sleep(1.2s)` + 硬编码文本模拟 AI 回复,完全没有调用后端 `/rag-chat/*` 接口,用户看到的是假数据。 ### 修改 | 文件 | 变更 | |------|------| | `Core/Models/APIModels.swift` | 新增 6 个 RAG Chat 数据模型:`ChatSession`、`ChatMessage`、`ChatCitation`、`CreateSessionRequest`、`SendMessageRequest`、`SendMessageResponse` | | `Core/Services/APIService.swift` | 新增 `RagChatService`:`createSession()`、`listSessions()`、`getMessages()`、`sendMessage()`、`deleteSession()` 全部 5 个接口 | | `Features/AI/AIChatViewModel.swift` | 重写:移除 `Task.sleep` + 硬编码文本,`load()` 自动选 KB 创建 session,`send()` 调用 `RagChatService.sendMessage()` | | `Features/AI/AIChatPage.swift` | 新增 `.task { await vm.load() }` 自动初始化、会话创建加载态、无知识库错误态 | ### 行为变化 | 场景 | 修改前 | 修改后 | |------|--------|--------| | 打开 AI 对话 | 直接显示硬编码 "你好!我是你的 AI 学习助手。" | 自动选第一个知识库 → `POST /rag-chat/sessions` → 显示真实欢迎语 | | 发送消息 | `Task.sleep(1.2s)` + 返回固定假文本 | `POST /rag-chat/sessions/:id/messages` → 真实 AI 回复 | | 无知识库时 | 仍显示假对话 | 提示 "请先创建一个知识库,才能使用 AI 对话" | | 消息被内容安全拦截 | 无此逻辑 | 显示 `blocked=true` 返回的提示 | ### 接入的后端接口 | 方法 | 路径 | 用途 | |------|------|------| | POST | `/rag-chat/sessions` | 创建对话 session | | POST | `/rag-chat/sessions/:id/messages` | 发送消息、获取 AI 回复 | (`listSessions`、`getMessages`、`deleteSession` 3 个接口已封装在 Service 中,后续对话列表/历史功能可直接调用) ### 测试方式 1. 确保至少有一个知识库(含知识点) 2. 打开 App → 学习页 → 点击 AI 对话任务 3. 输入问题 → 观察 AI 基于知识库内容回复 4. 验证无知识库时的错误提示
Sign in to join this conversation.
No description provided.