H0-14 P1 | RAG Chat SSE 流式输出 + DeepSeek V4 Pro 思考过程展示 #71

Closed
opened 2026-06-06 14:41:33 +08:00 by wangdl · 2 comments
Owner

背景

当前 AI 对话使用同步 fetch() 一次性取结果,response_format: json_object 模式下 DeepSeek V4 Pro 不输出 reasoning_content(思考过程)。iOS 端全链路阻塞等待,无流式效果。

需求

后端

  1. DeepSeekProvider 新增 generateStream()stream: true,去掉 response_format,ReadableStream 逐 chunk yield
  2. AiProvider 接口新增 generateStream() 方法
  3. AiGatewayService 新增 generateStream():透传 provider stream,流结束后汇总 usage
  4. RagChatService 新增 sendMessageStream():调 gateway stream,保存最终 AI 回复到 DB
  5. POST /api/rag-chat/sessions/:id/stream SSE endpoint

数据流

SSE chunk: { "type": "thinking", "content": "让我分析知识点..." }
SSE chunk: { "type": "thinking", "content": "根据《继承法》..." }
SSE chunk: { "type": "content", "content": "你好!" }
SSE chunk: { "type": "done", "usage": {...} }

关联

  • iOS: wangdl/ios-projects — SSE 流式接收 + 思考过程 UI
  • API: deepseek.com/v1/chat/completions (stream=true)
## 背景 当前 AI 对话使用同步 `fetch()` 一次性取结果,`response_format: json_object` 模式下 DeepSeek V4 Pro 不输出 `reasoning_content`(思考过程)。iOS 端全链路阻塞等待,无流式效果。 ## 需求 ### 后端 1. `DeepSeekProvider` 新增 `generateStream()`:`stream: true`,去掉 `response_format`,ReadableStream 逐 chunk yield 2. `AiProvider` 接口新增 `generateStream()` 方法 3. `AiGatewayService` 新增 `generateStream()`:透传 provider stream,流结束后汇总 usage 4. `RagChatService` 新增 `sendMessageStream()`:调 gateway stream,保存最终 AI 回复到 DB 5. `POST /api/rag-chat/sessions/:id/stream` SSE endpoint ### 数据流 ``` SSE chunk: { "type": "thinking", "content": "让我分析知识点..." } SSE chunk: { "type": "thinking", "content": "根据《继承法》..." } SSE chunk: { "type": "content", "content": "你好!" } SSE chunk: { "type": "done", "usage": {...} } ``` ## 关联 - iOS: wangdl/ios-projects — SSE 流式接收 + 思考过程 UI - API: deepseek.com/v1/chat/completions (stream=true)
Author
Owner

后端实现完成 (2026-06-06)

改动文件

文件 变更
ai-provider.interface.ts 新增 StreamChunk 类型 + generateStream() 方法
deepseek.provider.ts 实现 generateStream()stream: true,ReadableStream 逐 chunk yield,reasoning_content → thinking
ai-gateway.service.ts 新增 generateStream():透传 provider stream + 记录用量
rag-chat.service.ts 新增 sendMessageStream():流式调用 + 保存最终回复到 DB
rag-chat.controller.ts 新增 POST /api/rag-chat/sessions/:id/stream SSE endpoint

SSE 数据格式

data: {"type":"thinking","content":"让我分析..."}
data: {"type":"content","content":"你好!"}
data: {"type":"done","usage":{"inputTokens":100,"outputTokens":50}}

待完成

iOS 端 SSE 接收 + 思考过程 UI (ios-projects #38)

## 后端实现完成 (2026-06-06) ### 改动文件 | 文件 | 变更 | |------|------| | `ai-provider.interface.ts` | 新增 `StreamChunk` 类型 + `generateStream()` 方法 | | `deepseek.provider.ts` | 实现 `generateStream()`:`stream: true`,ReadableStream 逐 chunk yield,reasoning_content → thinking | | `ai-gateway.service.ts` | 新增 `generateStream()`:透传 provider stream + 记录用量 | | `rag-chat.service.ts` | 新增 `sendMessageStream()`:流式调用 + 保存最终回复到 DB | | `rag-chat.controller.ts` | 新增 `POST /api/rag-chat/sessions/:id/stream` SSE endpoint | ### SSE 数据格式 ``` data: {"type":"thinking","content":"让我分析..."} data: {"type":"content","content":"你好!"} data: {"type":"done","usage":{"inputTokens":100,"outputTokens":50}} ``` ### 待完成 iOS 端 SSE 接收 + 思考过程 UI (ios-projects #38)
Author
Owner

后端完成 (2026-06-06)

新增端点

POST /api/rag-chat/sessions/:id/stream — SSE 流式输出

改动文件

  • ai-provider.interface.ts — StreamChunk 类型 + generateStream()
  • deepseek.provider.ts — stream:true,ReadableStream yield thinking/content
  • ai-gateway.service.ts — generateStream() 透传 + 记录用量
  • rag-chat.service.ts — sendMessageStream() 流式调用
  • rag-chat.controller.ts — SSE endpoint

状态

完成。

## 后端完成 (2026-06-06) ### 新增端点 `POST /api/rag-chat/sessions/:id/stream` — SSE 流式输出 ### 改动文件 - `ai-provider.interface.ts` — StreamChunk 类型 + generateStream() - `deepseek.provider.ts` — stream:true,ReadableStream yield thinking/content - `ai-gateway.service.ts` — generateStream() 透传 + 记录用量 - `rag-chat.service.ts` — sendMessageStream() 流式调用 - `rag-chat.controller.ts` — SSE endpoint ### 状态 ✅ 完成。
Sign in to join this conversation.
No description provided.