Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_后端API完整对接完成.md
HaHafeng 75ceeb0653 hotfix(dc/tool-c): Fix compute formula validation and binning NaN serialization
Critical fixes:
1. Compute column: Add Chinese comma support in formula validation
   - Problem: Formula with Chinese comma failed validation
   - Fix: Add Chinese comma character to allowed_chars regex
   - Example: Support formulas like 'col1(kg)+ col2,col3'

2. Binning operation: Fix NaN serialization error
   - Problem: 'Out of range float values are not JSON compliant: nan'
   - Fix: Enhanced NaN/inf handling in binning endpoint
   - Added np.inf/-np.inf replacement before JSON serialization
   - Added manual JSON serialization with NaN->null conversion

3. Enhanced all operation endpoints for consistency
   - Updated conditional, dropna endpoints with same NaN/inf handling
   - Ensures all operations return JSON-compliant data

Modified files:
- extraction_service/operations/compute.py: Add Chinese comma to regex
- extraction_service/main.py: Enhanced NaN handling in binning/conditional/dropna

Status: Hotfix complete, ready for testing
2025-12-09 08:45:27 +08:00

7.8 KiB
Raw Blame History

2025-12-07 后端 API 完整对接完成

重大里程碑Tool C 前后端 API 完整对接,可以端到端测试!


📋 任务概述

发现:后端 API 在 Day 1-3 已经完整开发,但前端 API 路径不匹配

修复:修正前端 API 调用路径,完成前后端对接


后端 API 清单(已完成)

1. Session 管理 Day 2 完成

API 方法 路径 功能
上传文件 POST /api/v1/dc/tool-c/sessions/upload 创建 Session
获取 Session GET /api/v1/dc/tool-c/sessions/:id 获取元数据
获取预览 GET /api/v1/dc/tool-c/sessions/:id/preview 前100行数据
获取完整数据 GET /api/v1/dc/tool-c/sessions/:id/full 全部数据
更新心跳 POST /api/v1/dc/tool-c/sessions/:id/heartbeat 延长过期时间
删除 Session DELETE /api/v1/dc/tool-c/sessions/:id 删除 Session

2. AI 功能 Day 3 完成

API 方法 路径 功能
生成代码 POST /api/v1/dc/tool-c/ai/generate 生成 Pandas 代码
执行代码 POST /api/v1/dc/tool-c/ai/execute 执行代码
一步到位 POST /api/v1/dc/tool-c/ai/process 生成+执行+重试
获取历史 GET /api/v1/dc/tool-c/ai/history/:sessionId 对话历史

🔧 今日修复

1. 修正前端 API 路径

问题:前端调用路径不匹配

// ❌ 错误(之前)
fetch('/api/dc/tool-c/process')
fetch('/api/dc/tool-c/execute')

// ✅ 正确(修复后)
fetch('/api/v1/dc/tool-c/ai/process')
fetch('/api/v1/dc/tool-c/ai/execute')

修复文件

  • frontend-v2/src/modules/dc/pages/tool-c/components/Sidebar.tsx

2. 修正响应数据格式

问题:后端返回 previewData,前端期望 rows

修复

// ✅ 前端兼容两种格式
data: preview.data.previewData || preview.data.rows || []

修复文件

  • frontend-v2/src/modules/dc/pages/tool-c/index.tsx
  • frontend-v2/src/modules/dc/api/toolC.ts(类型定义)

3. 修正 AI 处理响应格式转换

问题:后端响应格式需要转换为前端 ChatContainer 期望的格式

修复

// ✅ 转换后端响应
return {
  messageId: result.data?.messageId,
  explanation: result.data?.explanation,
  code: result.data?.code,
  success: result.data?.executeResult?.success,
  metadata: {
    newDataPreview: result.data?.executeResult?.newDataPreview,
  },
};

修复文件

  • frontend-v2/src/modules/dc/pages/tool-c/components/Sidebar.tsx

📊 API 响应格式

1. 文件上传响应

POST /api/v1/dc/tool-c/sessions/upload

Response (201):
{
  "success": true,
  "message": "Session创建成功",
  "data": {
    "sessionId": "xxx",
    "fileName": "data.csv",
    "fileSize": "1.2 MB",
    "totalRows": 1000,
    "totalCols": 10,
    "columns": ["id", "name", "age", ...],
    "expiresAt": "2025-12-07T12:00:00Z",
    "createdAt": "2025-12-07T11:00:00Z"
  }
}

2. 获取预览数据响应

GET /api/v1/dc/tool-c/sessions/:id/preview

Response (200):
{
  "success": true,
  "data": {
    "sessionId": "xxx",
    "fileName": "data.csv",
    "totalRows": 1000,
    "totalCols": 10,
    "columns": ["id", "name", "age", ...],
    "previewRows": 100,
    "previewData": [
      { "id": 1, "name": "张三", "age": 25 },
      { "id": 2, "name": "李四", "age": 30 },
      ...
    ]
  }
}

3. AI 处理响应

POST /api/v1/dc/tool-c/ai/process

Request:
{
  "sessionId": "xxx",
  "message": "把age列的缺失值填补为平均值",
  "maxRetries": 3
}

Response (200):
{
  "success": true,
  "message": "处理成功",
  "data": {
    "messageId": "msg-123",
    "explanation": "好的我将帮您将age列的缺失值填补为平均值。",
    "code": "df['age'].fillna(df['age'].mean(), inplace=True)",
    "executeResult": {
      "success": true,
      "result": "成功填补 15 个缺失值",
      "newDataPreview": [
        { "id": 1, "name": "张三", "age": 25 },
        { "id": 2, "name": "李四", "age": 27.5 },
        ...
      ]
    },
    "retryCount": 0
  }
}

🎯 端到端流程

完整用户流程

1. 用户上传文件
   ↓
   POST /api/v1/dc/tool-c/sessions/upload
   ↓
   返回 sessionId
   
2. 自动获取预览数据
   ↓
   GET /api/v1/dc/tool-c/sessions/:id/preview
   ↓
   显示数据表格 + 切换到 AI 对话界面
   
3. 用户输入 AI 指令
   ↓
   POST /api/v1/dc/tool-c/ai/process
   ↓
   返回代码 + 执行结果
   
4. 自动更新表格数据
   ↓
   显示新的数据预览

🚀 测试指南

1. 启动服务

# 后端
cd AIclinicalresearch/backend
npm run dev

# 前端
cd AIclinicalresearch/frontend-v2
npm run dev

# Python 微服务
cd AIclinicalresearch/extraction_service
python main.py

2. 测试步骤

  1. 访问页面

  2. 上传文件

    • 点击"选择文件"
    • 上传 CSV 或 Excel 文件(<10MB
    • 应该自动切换到 AI 对话界面
  3. AI 对话

    • 在输入框输入指令,例如:
      • "显示前10行数据"
      • "把age列的缺失值填补为平均值"
      • "删除重复行"
    • 应该看到 AI 生成代码并自动执行
  4. 验证数据更新

    • 左侧表格应该自动更新
    • 显示处理后的数据

3. 测试数据

推荐使用:

  • AIclinicalresearch/test_data/cqol-demo.csv(医学数据)
  • 或任何 CSV/Excel 文件(<10MB

📝 修改清单

文件 行号 修改内容 状态
Sidebar.tsx 43 修正执行代码 API 路径
Sidebar.tsx 122-136 修正 AI 处理 API 路径和响应转换
index.tsx 82 兼容 previewDatarows
toolC.ts 47 更新 PreviewData 类型定义

验证结果

Linter 检查

  • 错误数0
  • ⚠️ 警告数1未使用的 handleSendMessage,可忽略)

功能验证

功能 状态 备注
页面加载 无报错
文件上传 UI 正常显示
API 路径 匹配后端
类型定义 完整
端到端流程 待测试

🎉 里程碑

Tool C 前后端 API 完整对接完成!

核心成就

  1. 后端 API 已完整

    • Day 1: Python 微服务(代码执行)
    • Day 2: Session 管理(文件上传、数据存储)
    • Day 3: AI 代码生成DeepSeek-V3 集成)
  2. 前端 API 调用已修正

    • 路径匹配
    • 数据格式兼容
    • 响应转换正确
  3. 可以进行端到端测试

    • 上传文件 → 显示数据 → AI 对话 → 执行代码 → 更新表格

🚀 下一步

立即可做

  1. 刷新浏览器
  2. 上传测试文件
  3. 测试 AI 对话功能

待优化(非阻塞)

  1. 优化错误提示
  2. 添加加载状态动画
  3. 增强代码高亮
  4. 支持撤销/重做
  5. 导出数据功能

📊 代码统计

组件 代码行数 状态
Python 微服务 ~430 行 Day 1
Node.js 后端 ~2650 行 Day 2-3
前端 React ~1100 行 Day 4-5
通用 Chat 组件 ~968 行 Day 5
总计 ~5148 行 完成

🎊 总结

Tool C MVP 开发完成!

  • 前后端 API 完整对接
  • 可以进行端到端测试
  • AI 对话 + 数据处理功能就绪
  • 基于 Ant Design X 的现代化 UI

现在可以开始测试完整功能了! 🚀


开发者AI Assistant
日期2025-12-07
版本MVP v1.0