feat(ai-service): implement SSE state machine and error handling [AC-AISVC-08, AC-AISVC-09]
- Integrate state machine in API layer for proper event sequencing - Ensure message* -> final/error -> close sequence - Prevent events after final/error - Convert streaming exceptions to error events - Add comprehensive state machine tests - 117 tests passing
This commit is contained in:
parent
66fa2d2677
commit
00953196c9
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
- [x] Phase 1: 基础设施(FastAPI 框架与多租户基础) (100%) ✅
|
- [x] Phase 1: 基础设施(FastAPI 框架与多租户基础) (100%) ✅
|
||||||
- [x] Phase 2: 存储与检索实现(Memory & Retrieval) (100%) ✅
|
- [x] Phase 2: 存储与检索实现(Memory & Retrieval) (100%) ✅
|
||||||
- [ ] Phase 3: 核心编排(Orchestrator & LLM Adapter) (40%) 🔄
|
- [ ] Phase 3: 核心编排(Orchestrator & LLM Adapter) (60%) 🔄
|
||||||
- [ ] Phase 4: 流式响应(SSE 实现与状态机) (0%) ⏳
|
- [ ] Phase 4: 流式响应(SSE 实现与状态机) (0%) ⏳
|
||||||
- [ ] Phase 5: 集成与冒烟测试(Quality Assurance) (0%) ⏳
|
- [ ] Phase 5: 集成与冒烟测试(Quality Assurance) (0%) ⏳
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ last_updated: "2026-02-24"
|
||||||
## Phase 4: 流式响应(SSE 实现与状态机)
|
## Phase 4: 流式响应(SSE 实现与状态机)
|
||||||
- [x] T4.1 在 API 层实现基于 `Accept` 头的响应模式自动切换逻辑 `[AC-AISVC-06]` ✅ **2026-02-24 完成**
|
- [x] T4.1 在 API 层实现基于 `Accept` 头的响应模式自动切换逻辑 `[AC-AISVC-06]` ✅ **2026-02-24 完成**
|
||||||
- [x] T4.2 实现 SSE 事件生成器:根据 Orchestrator 的增量输出包装 `message` 事件 `[AC-AISVC-07]` ✅ **2026-02-24 完成**
|
- [x] T4.2 实现 SSE 事件生成器:根据 Orchestrator 的增量输出包装 `message` 事件 `[AC-AISVC-07]` ✅ **2026-02-24 完成**
|
||||||
- [ ] T4.3 实现 SSE 状态机:确保 `final` 或 `error` 事件后连接正确关闭,且顺序不乱 `[AC-AISVC-08, AC-AISVC-09]`
|
- [x] T4.3 实现 SSE 状态机:确保 `final` 或 `error` 事件后连接正确关闭,且顺序不乱 `[AC-AISVC-08, AC-AISVC-09]` ✅ **2026-02-24 完成**
|
||||||
- [ ] T4.4 实现流式输出过程中的异常捕获,并转化为 `event: error` 输出 `[AC-AISVC-09]`
|
- [x] T4.4 实现流式输出过程中的异常捕获,并转化为 `event: error` 输出 `[AC-AISVC-09]` ✅ **2026-02-24 完成**
|
||||||
|
|
||||||
## Phase 5: 集成与冒烟测试(Quality Assurance)
|
## Phase 5: 集成与冒烟测试(Quality Assurance)
|
||||||
- [ ] T5.1 编写集成测试:模拟多租户并发请求,验证数据存储与检索的严格物理/逻辑隔离 `[AC-AISVC-10, AC-AISVC-11]`
|
- [ ] T5.1 编写集成测试:模拟多租户并发请求,验证数据存储与检索的严格物理/逻辑隔离 `[AC-AISVC-10, AC-AISVC-11]`
|
||||||
|
|
@ -128,3 +128,43 @@ last_updated: "2026-02-24"
|
||||||
- [x] AC-AISVC-07: AI 中台多次发送 event: message 事件,每次携带增量文本(delta)
|
- [x] AC-AISVC-07: AI 中台多次发送 event: message 事件,每次携带增量文本(delta)
|
||||||
- [x] AC-AISVC-08: 生成完成后发送 event: final 事件
|
- [x] AC-AISVC-08: 生成完成后发送 event: final 事件
|
||||||
- [x] AC-AISVC-09: 错误时发送 event: error 事件
|
- [x] AC-AISVC-09: 错误时发送 event: error 事件
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## T4.3 & T4.4 完成详情
|
||||||
|
|
||||||
|
### 实现内容
|
||||||
|
1. **API 层状态机集成** (`app/api/chat.py`)
|
||||||
|
- [AC-AISVC-08, AC-AISVC-09] 在 `_handle_streaming_request` 中集成状态机
|
||||||
|
- 状态机确保事件顺序:message* -> final/error -> close
|
||||||
|
- 禁止 final/error 后发送任何事件
|
||||||
|
- 异常自动转换为 error 事件
|
||||||
|
|
||||||
|
2. **状态机行为保证**
|
||||||
|
- `INIT -> STREAMING`: 开始流式输出
|
||||||
|
- `STREAMING -> FINAL_SENT`: 发送 final 后关闭
|
||||||
|
- `STREAMING -> ERROR_SENT`: 发送 error 后关闭
|
||||||
|
- `FINAL_SENT/ERROR_SENT -> CLOSED`: 最终关闭状态
|
||||||
|
- 线程安全:使用 asyncio.Lock 保证并发安全
|
||||||
|
|
||||||
|
3. **异常处理机制**
|
||||||
|
- 流式输出过程中的任何异常都被捕获
|
||||||
|
- 异常自动转换为 `event: error` 事件
|
||||||
|
- 确保 error 事件只发送一次
|
||||||
|
- 连接在 error 后正确关闭
|
||||||
|
|
||||||
|
4. **单元测试** (`tests/test_sse_state_machine.py`)
|
||||||
|
- 状态机转换测试(9 个测试)
|
||||||
|
- SSE 事件序列测试(3 个测试)
|
||||||
|
- 错误处理测试(3 个测试)
|
||||||
|
- 并发安全测试(2 个测试)
|
||||||
|
- Orchestrator 集成测试(2 个测试)
|
||||||
|
|
||||||
|
### 测试结果
|
||||||
|
```
|
||||||
|
117 passed in 4.24s
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验收标准覆盖
|
||||||
|
- [x] AC-AISVC-08: 生成完成后发送一次 event: final,随后关闭连接
|
||||||
|
- [x] AC-AISVC-09: 错误时发送 event: error,并终止事件流
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ last_updated: "2026-02-24"
|
||||||
### Phase 3: 核心编排(Orchestrator & LLM Adapter)
|
### Phase 3: 核心编排(Orchestrator & LLM Adapter)
|
||||||
- [x] T3.1 实现 LLM Adapter:封装 `langchain-openai` 或官方 SDK,支持 `generate` 与 `stream_generate` `[AC-AISVC-02, AC-AISVC-06]` ✅
|
- [x] T3.1 实现 LLM Adapter:封装 `langchain-openai` 或官方 SDK,支持 `generate` 与 `stream_generate` `[AC-AISVC-02, AC-AISVC-06]` ✅
|
||||||
- [x] T3.2 实现 Orchestrator:实现上下文合并逻辑(H_local + H_ext 的去重与截断策略) `[AC-AISVC-14, AC-AISVC-15]` ✅
|
- [x] T3.2 实现 Orchestrator:实现上下文合并逻辑(H_local + H_ext 的去重与截断策略) `[AC-AISVC-14, AC-AISVC-15]` ✅
|
||||||
- [ ] T3.3 实现 Orchestrator:实现 RAG 检索不足时的置信度下调与 `shouldTransfer` 逻辑 `[AC-AISVC-17, AC-AISVC-18, AC-AISVC-19]`
|
- [x] T3.3 实现 Orchestrator:实现 RAG 检索不足时的置信度下调与 `shouldTransfer` 逻辑 `[AC-AISVC-17, AC-AISVC-18, AC-AISVC-19]` ✅
|
||||||
- [ ] T3.4 实现 Orchestrator:整合 Memory、Retrieval 与 LLM 完成 non-streaming 生成闭环 `[AC-AISVC-01, AC-AISVC-02]`
|
- [ ] T3.4 实现 Orchestrator:整合 Memory、Retrieval 与 LLM 完成 non-streaming 生成闭环 `[AC-AISVC-01, AC-AISVC-02]`
|
||||||
- [ ] T3.5 验证 non-streaming 响应字段完全符合 `openapi.provider.yaml` 契约 `[AC-AISVC-02]`
|
- [ ] T3.5 验证 non-streaming 响应字段完全符合 `openapi.provider.yaml` 契约 `[AC-AISVC-02]`
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue