# 历史归档：AgentEvalTool V1.1 版本说明

> **编号说明**：本文创建于 2026-07-16，当时代码包版本实际为 `0.2.0-dev`。这里的“V1.1”属于早期原型文档编号，不是当前项目 SemVer，也不晚于 2026-08-11 发布的 `v1.0.0`。当前发布说明见 [release-notes-v1.0.md](release-notes-v1.0.md)。

**版本**: v1.1
**日期**: 2026-07-10
**状态**: 历史编号归档
**作者**: AgentEval Team

---

## 一、版本概述

V1.1 在 V1.0 基础闭环（CLI CRUD + 基础 Web 查看）之上，完成了 MVP 功能补全和 Web 管理后台重构，并修复了生产环境中的关键稳定性问题。

## 二、主要变更

### 2.1 前端完全重构（Ant Design 5.x）

| 项目 | V1.0 | V1.1 |
|---|---|---|
| UI 库 | 无（手写 CSS） | Ant Design 5.x |
| 布局 | 手写 Flexbox 侧边栏 | ProLayout 专业布局 |
| 状态管理 | useState per page | 按需引入 |
| 代码编辑 | textarea | Monaco Editor |
| 图表 | 无 | @ant-design/charts |
| 构建优化 | 单 chunk | manualChunks 代码分割 |

**页面重构清单：**

- **仪表盘**：统计卡片（对象数/场景数/执行数/通过率）+ 最近评测记录表格 + 通过率趋势折线图
- **评测对象**：Table + 编辑抽屉 + 通道配置表单化（不再手写 JSON）+ 连通性测试 + 状态 Tag
- **评测场景**：Table + Monaco Editor 在线编辑 JSON 用例 + 预览弹窗 + 标签筛选
- **评测执行**：启动评测 + 执行列表 + 状态 Tag（running 有动画）+ WebSocket 实时进度时间线 + 运行详情抽屉
- **评测报告**：概览统计卡片 + 对话气泡样式展示 + 规则结果表格 + HTML 导出

### 2.2 后端功能增强

- **WebSocket 实时进度推送**：`/ws/runs/{run_id}` 端点，广播 `case_start`、`turn_end`、`rule_result` 等事件
- **Stats 聚合 API**：
  - `GET /api/stats/dashboard`：仪表盘数据（对象数、场景数、执行数、平均通过率、最近 10 条记录）
  - `GET /api/stats/trend`：通过率趋势数据（按天聚合，支持 `days` 参数）
- **Run Logs 增强**：返回 `sent_text` 和 `reply_text` 字段，供前端对话展示
- **EvalAgent 模块实现**：
  - `EvalAgent` 抽象基类（`agents/base.py`）
  - `SimpleAgent` 实现（`agents/simple.py`），委托给 EvalEngine

### 2.3 关键 Bug 修复

#### 2.3.1 SQLite 连接池耗尽（严重）

**问题**：默认 `QueuePool`（size 5, overflow 10）在 FastAPI 多线程环境下快速耗尽，导致页面超时。

**根因**：
1. 每个 `Repository()` 构造时调用 `get_session()` 创建新 Session，但从不关闭
2. 后台评测任务中的 Engine 也创建独立 Session
3. SQLite 不支持真正的连接池

**修复**：
- 引擎切换为 `StaticPool`（`check_same_thread=False` 模式下保持单连接共享）
- 所有 Router 使用 FastAPI `Depends(get_db)` 依赖注入管理 Session 生命周期
- 后台评测任务 `_run_evaluation` 使用 `try/finally` 确保 Session 释放
- `generate_report` 等报告函数支持传入外部 Session

#### 2.3.2 评测执行产生重复记录

**问题**：每次启动评测产生 2 条 run 记录（1 条 pending + 1 条 completed）。

**根因**：
1. API 端点 `start_run` 创建 run #1（pending）
2. `EvalEngine.run()` 内部又创建 run #2（running → completed）

**修复**：
- `EvalEngine.run()` 新增 `existing_run` 参数，传入时复用已有记录
- `_run_evaluation` 获取 API 创建的 run 并传给引擎

#### 2.3.3 代码部署未生效

**问题**：所有后端修复部署后未生效，页面持续超时。

**根因**：Docker 镜像通过 `COPY backend ./backend` 烘焙代码，rsync 只更新宿主机文件，`docker restart` 仍运行旧镜像。

**修复**：docker-compose.yml 新增后端代码 volume 挂载 `../../backend:/app/backend:ro`，后续代码变更通过 rsync + restart 即可生效，无需重建镜像。

## 三、部署架构变更

### 3.1 docker-compose.yml 更新

```yaml
volumes:
  - ../../data:/app/data
  - ../../config/config.json:/app/config/config.json:ro
  - ../../frontend/web/dist:/app/frontend/web/dist:ro
  - ../../backend:/app/backend:ro          # V1.1 新增：代码热更新
```

### 3.2 Vite 构建优化

```typescript
build: {
  rollupOptions: {
    output: {
      manualChunks: {
        'vendor-antd': ['antd', '@ant-design/icons', '@ant-design/pro-components'],
        'vendor-charts': ['@ant-design/charts'],
        'vendor-monaco': ['@monaco-editor/react'],
      },
    },
  },
}
```

## 四、新增文件

| 文件路径 | 说明 |
|---|---|
| `backend/agenteval/web/websocket.py` | WebSocket 连接管理器 |
| `backend/agenteval/web/routers/stats.py` | 统计聚合 API Router |
| `backend/agenteval/agents/base.py` | EvalAgent 抽象基类 |
| `backend/agenteval/agents/simple.py` | SimpleAgent 实现 |
| `data/scenarios/dept_navigation.yaml` | 科室导航评测场景（3 用例） |

## 五、修改文件

| 文件路径 | 变更说明 |
|---|---|
| `backend/agenteval/storage/db.py` | StaticPool + get_session_context |
| `backend/agenteval/web/app.py` | 新增 WebSocket 端点 + stats router |
| `backend/agenteval/web/routers/targets.py` | Depends(get_db) session 管理 |
| `backend/agenteval/web/routers/scenarios.py` | Depends(get_db) session 管理 |
| `backend/agenteval/web/routers/runs.py` | Depends(get_db) + existing_run 传递 |
| `backend/agenteval/web/routers/reports.py` | Depends(get_db) + session 传递 |
| `backend/agenteval/evaluation/engine.py` | existing_run 参数支持 |
| `backend/agenteval/evaluation/report.py` | session 参数传递 |
| `frontend/web/src/*` | 全部重构为 Ant Design 5.x |
| `deploy/t480/docker-compose.yml` | 新增 backend volume 挂载 |

## 六、技术栈更新

### 前端新增依赖

| 包名 | 版本 | 用途 |
|---|---|---|
| antd | 5.x | UI 组件库 |
| @ant-design/icons | - | 图标库 |
| @ant-design/pro-components | - | ProLayout、ProTable 等高级组件 |
| @ant-design/charts | - | 图表（Line、Bar 等） |
| @monaco-editor/react | - | YAML/JSON 在线编辑器 |
| zustand | - | 轻量状态管理（预留） |
| dayjs | - | 日期处理 |

### 后端新增依赖

无新增 Python 依赖。WebSocket 功能使用 FastAPI 内置的 `fastapi.WebSocket`。

## 七、已知问题与后续规划

### 7.1 已知问题

- Ant Design + Monaco Editor 打包产物较大（~2.8MB），后续可通过懒加载进一步优化
- WebSocket 断线后无自动重连机制（当前手动刷新）
- 评测执行期间 SQLite 写入可能阻塞读操作（StaticPool 单连接）

### 7.2 V1.2 规划方向

- 场景模板（预置单轮问答、多轮对话、压力测试模板）
- 场景在线校验 API（`POST /api/scenarios/validate`）
- 运行取消功能（`POST /api/runs/{id}/cancel`）
- 报告对比功能（选择两次运行进行 side-by-side 对比）
- WebSocket 自动重连 + 前端错误重试
- 前端路由懒加载优化包体积

## 八、验证标准

1. Web 后台使用 Ant Design 组件，界面专业、布局合理
2. 首页仪表盘展示统计数据和趋势图表
3. 评测对象和场景支持完整 CRUD（包含编辑）
4. 评测执行时可通过 WebSocket 实时看到进度和日志
5. 报告页面以对话气泡展示对话内容，规则结果清晰可读
6. 场景支持 JSON 在线编辑（Monaco Editor）
7. 所有操作有 loading 状态和错误提示
8. 部署到 t480 后可稳定使用（无连接池耗尽）

---

**最后更新**: 2026-07-10
