feat(aia): Complete AIA V2.0 with universal streaming capabilities

Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
This commit is contained in:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,32 +1,32 @@
# Day 5: 全文复筛后端API开发完成
# Day 5: 鍏ㄦ枃澶嶇瓫鍚庣<EFBFBD>API寮€鍙戝畬鎴?
> **文档版本:** v1.0
> **鏂囨。鐗堟湰锛?* v1.0
> **寮€鍙戞棩鏈燂細** 2025-11-23
> **寮€鍙戦樁娈碉細** 鍏ㄦ枃澶嶇瓫妯″潡 - 鍚庣<E98D9A>API瀹炵幇
> **状态:** ✅ 完成
> **鐘舵€侊細** 鉁?瀹屾垚
---
## 📋 开发目标
## 馃搵 寮€鍙戠洰鏍?
实现全文复筛模块的5个核心API接口包括任务管理、进度查询、结果获取、决策更新和Excel导出功能。
瀹炵幇鍏ㄦ枃澶嶇瓫妯″潡鐨?涓<>牳蹇傾PI鎺ュ彛锛屽寘鎷<E5AF98>换鍔<E98D94>鐞嗐€佽繘搴︽煡璇€€佺粨鏋滆幏鍙栥€佸喅绛栨洿鏂板拰Excel瀵煎嚭鍔熻兘銆?
---
## ✅ 完成功能
## 鉁?瀹屾垚鍔熻兘
### 1. API设计与文档
### 1. API璁捐<EFBFBD>涓庢枃妗?
**文件**: `docs/03-业务模块/ASL-AI智能文献/02-技术设计/02-API设计规范.md`
**鏂囦欢**: `docs/03-涓氬姟妯″潡/ASL-AI鏅鸿兘鏂囩尞/02-鎶€鏈<E282AC><E98F88>璁?02-API璁捐<E79281>瑙勮寖.md`
**鏇存柊鍐呭<E98D90>**:
- 鏂板<E98F82>"鍏ㄦ枃澶嶇瓫绠$悊"绔犺妭
- 瀹氫箟5涓猂ESTful API鎺ュ彛瑙勮寖
- 包含完整的请求/响应格式
- 鍖呭惈瀹屾暣鐨勮<EFBFBD>姹?鍝嶅簲鏍煎紡
- 璇︾粏鐨勯敊璇<E6958A>爜瀹氫箟
- 鎻愪緵curl娴嬭瘯绀轰緥
**版本**: v2.0 v3.0
**鐗堟湰**: v2.0 鈫?v3.0
---
@@ -34,9 +34,9 @@
#### 2.1 FulltextScreeningController
**文件**: `backend/src/modules/asl/fulltext-screening/controllers/FulltextScreeningController.ts` (652行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/controllers/FulltextScreeningController.ts` (652琛?
**实现的5个API**:
**瀹炵幇鐨?涓狝PI**:
1. **`POST /api/v1/asl/fulltext-screening/tasks`**
- 鍔熻兘: 鍒涘缓鍏ㄦ枃澶嶇瓫浠诲姟
@@ -46,35 +46,35 @@
2. **`GET /api/v1/asl/fulltext-screening/tasks/:taskId/progress`**
- 鍔熻兘: 鏌ヨ<E98F8C>浠诲姟杩涘害
- 返回: 实时进度、成功/失败数、Token消耗、成本统计
- 杩斿洖: 瀹炴椂杩涘害銆佹垚鍔?澶辫触鏁般€乀oken娑堣€椼€佹垚鏈<E59E9A>粺璁?
3. **`GET /api/v1/asl/fulltext-screening/tasks/:taskId/results`**
- 鍔熻兘: 鑾峰彇浠诲姟缁撴灉
- 支持: 分页、状态过滤、排序
- 返回: 详细的文献处理结果、双模型输出、冲突信息
- <EFBFBD>寔: 鍒嗛〉銆佺姸鎬佽繃婊ゃ€佹帓搴?
- 杩斿洖: 璇︾粏鐨勬枃鐚<E69E83><E9909A>鐞嗙粨鏋溿€佸弻妯″瀷杈撳嚭銆佸啿绐佷俊鎭?
4. **`PUT /api/v1/asl/fulltext-screening/results/:resultId/decision`**
- 鍔熻兘: 浜哄伐澶嶆牳鏇存柊鍐崇瓥
- 支持: 纳入/排除决策、理由记录
- 记录: 复核人员和时间
- <EFBFBD>寔: 绾冲叆/鎺掗櫎鍐崇瓥銆佺悊鐢辫<E990A2>褰?
- 璁板綍: 澶嶆牳浜哄憳鍜屾椂闂?
5. **`GET /api/v1/asl/fulltext-screening/tasks/:taskId/export`**
- 鍔熻兘: 瀵煎嚭Excel鎶ュ憡
- 格式: 4个Sheet的完整报告
- 鏍煎紡: 4涓猄heet鐨勫畬鏁存姤鍛?
- 涓嬭浇: 娴佸紡浼犺緭
**关键特性**:
- Zod参数验证
- ✅ 统一错误处理
- ✅ 详细日志记录
- ✅ 分页支持
- ✅ 异步任务管理
**鍏抽敭鐗规€?*:
- 鉁?Zod鍙傛暟楠岃瘉
- 鉁?缁熶竴閿欒<E996BF>澶勭悊
- 鉁?璇︾粏鏃ュ織璁板綍
- 鉁?鍒嗛〉鏀<E38089>
- 鉁?寮傛<E5AFAE>浠诲姟绠
---
### 3. Excel瀵煎嚭鏈嶅姟
**文件**: `backend/src/modules/asl/fulltext-screening/services/ExcelExporter.ts` (352行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/services/ExcelExporter.ts` (352琛?
**鍔熻兘瀹炵幇**:
@@ -92,32 +92,32 @@
#### Sheet 3: PRISMA缁熻<E7BC81>
- 绛涢€夋祦绋嬪浘鏁版嵁
- 各阶段文献数量
- 鍚勯樁娈垫枃鐚<EFBFBD>暟閲?
- 鎺掗櫎鍘熷洜缁熻<E7BC81>
#### Sheet 4: 鎴愭湰缁熻<E7BC81>
- 模型使用统计DeepSeek vs Qwen
- Token消耗明细
- 成本分析(单篇/总计)
- 妯″瀷浣跨敤缁熻<EFBFBD>锛圖eepSeek vs Qwen锛?
- Token娑堣€楁槑缁?
- 鎴愭湰鍒嗘瀽锛堝崟绡?鎬昏<E98EAC>锛?
- 澶勭悊鏃堕棿缁熻<E7BC81>
**技术亮点**:
- ExcelJS库实现
- ✅ 样式优化(表头、边框、对齐)
- ✅ 列宽自适应
- ✅ 数据格式化
**鎶€鏈<EFBFBD>寒鐐?*:
- 鉁?ExcelJS搴撳疄鐜?
- 鉁?鏍峰紡浼樺寲锛堣〃澶淬€佽竟妗嗐€佸<E282AC>榻愶級
- 鉁?鍒楀<E98D92><EFBFBD>€傚簲
- 鉁?鏁版嵁鏍煎紡鍖?
---
### 4. 璺<>敱娉ㄥ唽
**文件**: `backend/src/modules/asl/fulltext-screening/routes/fulltext-screening.ts` (73行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/routes/fulltext-screening.ts` (73琛?
**鍔熻兘**:
- 娉ㄥ唽5涓狝PI璺<49>
- 缁熶竴鍓嶇紑: `/api/v1/asl/fulltext-screening`
- 闆嗘垚Controller鏂规硶
- 错误处理中间件
- 閿欒<EFBFBD>澶勭悊涓<EFBFBD>棿浠?
**闆嗘垚鍒癆SL妯″潡**:
- 鏂囦欢: `backend/src/modules/asl/routes/index.ts`
@@ -129,18 +129,18 @@
#### 5.1 REST Client娴嬭瘯
**文件**: `backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http` (273行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http` (273琛?
**测试用例**: 31
- 创建任务: 8个场景
- 查询进度: 5个场景
**娴嬭瘯鐢ㄤ緥**: 31涓?
- 鍒涘缓浠诲姟: 8涓<38>満鏅?
- 鏌ヨ<EFBFBD>杩涘害: 5涓<35>満鏅?
- 鑾峰彇缁撴灉: 10涓<30>満鏅<E6BA80>紙鍒嗛〉銆佽繃婊ゃ€佹帓搴忥級
- 更新决策: 5个场景
- 导出Excel: 3个场景
- 鏇存柊鍐崇瓥: 5涓<35>満鏅?
- 瀵煎嚭Excel: 3<EFBFBD>満鏅?
#### 5.2 自动化集成测试
#### 5.2 <EFBFBD>姩鍖栭泦鎴愭祴璇?
**文件**: `backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts` (294行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts` (294琛?
**娴嬭瘯娴佺▼**:
1. 鍒涘缓娴嬭瘯椤圭洰
@@ -151,9 +151,9 @@
6. 鏇存柊澶嶆牳鍐崇瓥
7. 瀵煎嚭Excel鎶ュ憡
#### 5.3 端到端测试(简化版)
#### 5.3 <EFBFBD>埌绔<EFBFBD>祴璇曪紙绠€鍖栫増锛?
**文件**: `backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts` (235行)
**鏂囦欢**: `backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts` (235琛?
**鐗圭偣**:
- 浣跨敤鐪熷疄PICOS鏁版嵁
@@ -199,29 +199,29 @@ try {
}
```
**效果**: ✅ 系统可以在PDF提取服务不可用时继续工作
**鏁堟灉**: 鉁?绯荤粺鍙<E7B2BA>互鍦≒DF鎻愬彇鏈嶅姟涓嶅彲鐢ㄦ椂缁х画宸ヤ綔
---
### 闂<><E99782>2: TypeScript绫诲瀷閿欒<E996BF>
**错误1**: 相对导入路径缺少`.js`扩展名
**閿欒<EFBFBD>1**: 鐩稿<EFBFBD>瀵煎叆璺<EFBFBD>緞缂哄皯`.js`鎵╁睍鍚?
```
当"--moduleResolution"为"node16"时,相对导入路径需要显式文件扩展名
褰?--moduleResolution"涓?node16"鏃讹紝鐩稿<EFBFBD>瀵煎叆璺<EFBFBD>緞闇€瑕佹樉寮忔枃浠舵墿灞曞悕
```
**修复**: 所有相对导入添加`.js`扩展名
**<EFBFBD><EFBFBD>**: 鎵€鏈夌浉瀵瑰<EFBFBD>鍏ユ坊鍔燻.js`鎵╁睍鍚?
**閿欒<E996BF>2**: Zod enum瀹氫箟閿欒<E996BF>
```
对象字面量只能指定已知属性,并且"errorMap"不在类型中
瀵硅薄瀛楅潰閲忓彧鑳芥寚瀹氬凡鐭ュ睘鎬э紝骞朵笖"errorMap"涓嶅湪绫诲瀷涓?
```
**淇<><E6B787>**: 浣跨敤姝鐨刞z.enum([...])`<EFBFBD>
**错误3**: Literature字段名错误
**閿欒<EFBFBD>3**: Literature瀛楁<EFBFBD>鍚嶉敊璇?
```
类型上不存在属性"year"
绫诲瀷涓婁笉瀛樺湪灞炴€?year"
```
**淇<><E6B787>**: 鏀逛负`publicationYear`鍖归厤Prisma schema
@@ -231,23 +231,23 @@ try {
## 馃搳 浠爜缁熻<E7BC81>
### 鏂板<E98F82>鏂囦欢
- Controller: 1个文件,652
- Service (ExcelExporter): 1个文件,352
- Routes: 1个文件73行
- 测试文件: 3个文件602
- **总计**: 1679行代码
- Controller: 1<EFBFBD>枃浠讹紝652琛?
- Service (ExcelExporter): 1<EFBFBD>枃浠讹紝352琛?
- Routes: 1<EFBFBD>枃浠讹紝73琛?
- 娴嬭瘯鏂囦欢: 3涓<33>枃浠讹紝602琛?
- **鎬昏<EFBFBD>**: 1679琛屼唬鐮?
### 淇<>敼鏂囦欢
- API设计文档: +400
- LLM12FieldsService: +18行(fallback机制)
- ASL路由: +5
- API璁捐<EFBFBD>鏂囨。: +400琛?
- LLM12FieldsService: +18琛岋紙fallback鏈哄埗锛?
- ASL<EFBFBD>: +5琛?
### 鍒犻櫎鏂囦欢
- 临时测试脚本: 4个清理完成
- 涓存椂娴嬭瘯鑴氭湰: 4涓<34>紙娓呯悊瀹屾垚锛?
---
## 🎯 技术亮点
## 馃幆 鎶€鏈<E282AC>寒鐐?
### 1. Zod鍙傛暟楠岃瘉
@@ -269,11 +269,11 @@ const createTaskSchema = z.object({
**浼樺娍**:
- 绫诲瀷瀹夊叏
-<>姩閿欒<E996BF>娑堟伅
- 默认值支持
- 榛樿<EFBFBD>鍊兼敮鎸?
### 2. 寮傛<E5AFAE>浠诲姟绠
任务在后台异步执行避免阻塞HTTP请求
浠诲姟鍦ㄥ悗鍙板紓姝ユ墽琛岋紝閬垮厤闃诲<EFBFBD>HTTP璇锋眰锛?
```typescript
// 绔嬪嵆杩斿洖浠诲姟ID
@@ -288,7 +288,7 @@ await this.fulltextScreeningService.createAndProcessTask(...);
### 3. 娴佸紡Excel瀵煎嚭
使用流式传输,避免大文件内存占用:
浣跨敤娴佸紡浼犺緭锛岄伩鍏嶅ぇ鏂囦欢鍐呭瓨鍗犵敤锛?
```typescript
const buffer = await workbook.xlsx.writeBuffer();
@@ -300,7 +300,7 @@ reply
### 4. 璇︾粏閿欒<E996BF>澶勭悊
统一的错误处理和日志记录:
缁熶竴鐨勯敊璇<EFBFBD><EFBFBD>鐞嗗拰鏃ュ織璁板綍锛?
```typescript
try {
@@ -318,56 +318,56 @@ try {
## 馃攧 API璋冪敤娴佺▼
### 完整流程图
### 瀹屾暣娴佺▼鍥?
```
鐢ㄦ埛鎿嶄綔
前端: 点击"开始全文复筛"
鈫?
鍓嶇<EFBFBD>: 鐐瑰嚮"寮€濮嬪叏鏂囧<E98F82>绛?
鈫?
璋冪敤: POST /api/v1/asl/fulltext-screening/tasks
鈫?
鍚庣<EFBFBD>: FulltextScreeningController.createTask()
鈫?
鍚庣<EFBFBD>: FulltextScreeningService.createAndProcessTask()
↓ (异步后台执行)
鈫?(寮傛<E5AFAE>鍚庡彴鎵ц<E98EB5>)
鍚庣<EFBFBD>: processTaskInBackground()
(for each literature)
鈫?(for each literature)
鍚庣<EFBFBD>: screenLiterature()
鈫?
鍚庣<EFBFBD>: LLM12FieldsService.processDualModels()
提取: extractFullTextStructured() (Nougat PyMuPDF Fallback)
鈫?
鎻愬彇: extractFullTextStructured() (Nougat 鈫?PyMuPDF 鈫?Fallback)
鈫?
璋冪敤: DeepSeek-V3 API (骞惰<E9AA9E>)
璋冪敤: Qwen-Max API (骞惰<E9AA9E>)
鈫?
楠岃瘉: MedicalLogicValidator
楠岃瘉: EvidenceChainValidator
楠岃瘉: ConflictDetectionService
鈫?
淇濆瓨: AslFulltextScreeningResult
鈫?
鏇存柊: Task杩涘害
鈫?
鍓嶇<EFBFBD>: 杞<><E69D9E> GET /api/v1/asl/fulltext-screening/tasks/:taskId/progress
鈫?
鍓嶇<EFBFBD>: 鏄剧ず瀹炴椂杩涘害
鈫?
浠诲姟瀹屾垚
鈫?
鍓嶇<EFBFBD>: GET /api/v1/asl/fulltext-screening/tasks/:taskId/results
鈫?
鍓嶇<EFBFBD>: 鏄剧ず缁撴灉鍒楄〃
用户: 复核并更新决策
鈫?
鐢ㄦ埛: 澶嶆牳骞舵洿鏂板喅绛?
鈫?
璋冪敤: PUT /api/v1/asl/fulltext-screening/results/:resultId/decision
鈫?
鐢ㄦ埛: 瀵煎嚭Excel
鈫?
璋冪敤: GET /api/v1/asl/fulltext-screening/tasks/:taskId/export
鈫?
涓嬭浇: 4-Sheet Excel鎶ュ憡
```
@@ -377,18 +377,18 @@ try {
### 1. LLM璋冪敤娴佺▼楠岃瘉
**状态**: 代码已实现,未在真实环境完整验证
**鐘舵€?*: 浠爜宸插疄鐜帮紝鏈<E7B49D>湪鐪熷疄鐜<E79684><E9909C>瀹屾暣楠岃瘉
**鍘熷洜**:
- LLM调用需要30秒-2分钟
- 命令行测试超时
- LLM璋冪敤闇€瑕?0绉?2鍒嗛挓
- 鍛戒护琛屾祴璇曡秴鏃?
- PDF鎻愬彇鏈嶅姟璺<E5A79F>緞闂<E7B79E><E99782>
**璁″垝**: 鍓嶇<E98D93>寮€鍙戝畬鎴愬悗锛岄€氳繃UI鐣岄潰杩涜<E69DA9>瀹屾暣娴嬭瘯
### 2. PDF鎻愬彇鏈嶅姟璋冭瘯
**状态**: 已添加fallback但根本原因未解决
**鐘舵€?*: 宸叉坊鍔爁allback锛屼絾鏍规湰鍘熷洜鏈<E6B49C>В鍐?
**闂<><E99782>**: Windows璺<73>緞澶勭悊
```
@@ -399,11 +399,11 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf'
### 3. 寮傛<E5AFAE>浠诲姟鐩戞帶
**状态**: 后端支持,需前端轮询配合
**鐘舵€?*: 鍚庣<E98D9A><EFBFBD>寔锛岄渶鍓嶇<E98D93><EFBFBD><E69D9E>閰嶅悎
**鍔熻兘**:
- 瀹炴椂杩涘害鏇存柊
- Token消耗统计
- Token娑堣€楃粺璁?
- 鎴愭湰璁$畻
- 閿欒<E996BF>鎻愮ず
@@ -411,41 +411,42 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf'
---
## 🎉 里程碑达成
## 馃帀 閲岀▼纰戣揪鎴?
### Day 5核心目标 ✅
### Day 5鏍稿績鐩<EFBFBD>爣 鉁?
- [x] API璁捐<E79281>鏂囨。鏇存柊
- [x] 5涓<35>牳蹇傾PI瀹炵幇
- [x] Excel瀵煎嚭瀹屾暣瀹炵幇
- [x] 参数验证Zod
- [x] 鍙傛暟楠岃瘉锛圸od锛?
- [x] 娴嬭瘯鐢ㄤ緥缂栧啓
- [x] 閿欒<E996BF>澶勭悊浼樺寲
- [x] PDF鎻愬彇fallback
### 下一步: Day 6
### 涓嬩竴姝? Day 6
**目标**: 前端UI开发
**<EFBFBD>**: 鍓嶇<EFBFBD>UI寮€鍙?
- [ ] 鍏ㄦ枃澶嶇瓫璁剧疆椤甸潰
- [ ] 浠诲姟杩涘害鐩戞帶椤甸潰
- [ ] 结果展示与复核页面
- [ ] 缁撴灉灞曠ず涓庡<EFBFBD>鏍搁〉闈?
- [ ] Excel瀵煎嚭鍔熻兘闆嗘垚
- [ ] 前后端联调测试
- [ ] 鍓嶅悗绔<EFBFBD>仈璋冩祴璇?
---
## 馃摎 鐩稿叧鏂囨。
- [API设计规范 v3.0](../02-技术设计/02-API设计规范.md)
- [数据库设计 v3.0](../02-技术设计/01-数据库设计.md)
- [全文复筛开发计划](../04-开发计划/04-全文复筛开发计划.md)
- [Day 2-3 LLM服务开发记录](./2025-11-22_Day2-Day3_LLM服务与验证系统开发.md)
- [API璁捐<EFBFBD>瑙勮寖 v3.0](../02-鎶€鏈<EFBFBD><EFBFBD>璁?02-API璁捐<E79281>瑙勮寖.md)
- [鏁版嵁搴撹<EFBFBD>璁?v3.0](../02-鎶€鏈<EFBFBD><EFBFBD>璁?01-鏁版嵁搴撹<E690B4>璁?md)
- [鍏ㄦ枃澶嶇瓫寮€鍙戣<EFBFBD>鍒抅(../04-寮€鍙戣<E98D99>鍒?04-鍏ㄦ枃澶嶇瓫寮€鍙戣<E98D99>鍒?md)
- [Day 2-3 LLM鏈嶅姟寮€鍙戣<EFBFBD>褰昡(./2025-11-22_Day2-Day3_LLM鏈嶅姟涓庨獙璇佺郴缁熷紑鍙?md)
---
**开发完成时间**: 2025-11-23 10:50
**总耗时**: 约8小时
**状态**: ✅ Day 5完成等待前端开发联调
**寮€鍙戝畬鎴愭椂闂?*: 2025-11-23 10:50
**鎬昏€楁椂**: 绾?灏忔椂
**鐘舵€?*: 鉁?Day 5瀹屾垚锛岀瓑寰呭墠绔<E5A2A0>紑鍙戣仈璋?