AgentEvalTool/docs/plan-v0.3.md
sinohqb 12481cd1b8 v0.3-s1: 规则层异步化 + 工具函数去重 + HTTP 通道
## 核心变更

### 规则层全面异步化(DEBT-1)
- EvalRule.evaluate() 签名改为 async def,全量同步改造(无兼容层)
- LlmScoreRule._call_llm: requests.post → httpx.AsyncClient,彻底消除事件循环阻塞
- engine._save_rule_results: rule.evaluate() → await rule.evaluate()

### 工具函数去重(DEBT-2)
- 新建 agenteval/utils/llm.py,统一三个函数:
  - extract_reply_text (原 5 处重复)
  - extract_content_from_llm_response (原 2 处重复)
  - parse_json_from_llm_text (统一 LLM 输出 JSON 解析)
- engine.py / llm_score.py / runs.py / report.py 全部切换到 utils.llm

### HTTP 通用通道(S1-3)
- 新建 channels/http.py (HttpChannel)
  - 配置化 send_url / reply_url 模板 ({message}, {msg_id} 占位)
  - dot-path 提取 msg_id 和 reply_text
  - 可选 reply_ready_path 就绪标志
  - 长连接 AsyncClient 复用
- ChannelFactory 注册 ChannelType.HTTP → HttpChannel

### 测试
- 新增 tests/unit/test_http_channel_and_rules.py (19 个测试)
- _get_path / health_check / send / poll_reply / 超时 / 就绪标志 / async 规则评估
- 测试总数:24 → 43,全部通过

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 10:52:32 +08:00

196 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AgentEvalTool v0.3 「拓」迭代规划
**版本**: v0.3.0(规划)
**制定日期**: 2026-07-16
**基线**: v0.2.0-dev已部署 t480含文件管理 + 布局统一 + 6 bug 修复)
**代号**: 「拓」(Extensibility milestone)
**状态**: 待评审
---
## 一、版本定位
v0.3 是「先稳后拓」战略的第二步。v0.2 已让核心闭环具备生产可用性v0.3 的使命是:
> 把「单通道 + 3 规则」的稳定闭环,扩展成「多通道 + 可组合规则」的评估平台,
> 并打通 OpenClaw 双向集成,让评估能力可被 AI 助手自主编排。
```
v0.1 (07-09) MVP 闭环
v1.1 (07-10) Ant Design 前端重构
v0.2 (07-14) 「稳」async + 安全 + 测试 + 部署
└─ (07-16) 文件管理 + 布局统一 + bug 修复
v0.3 (规划) 「拓」← 本文档
└─ 多通道 · 规则扩展 · OpenClaw 深度集成 · 报告升级
```
---
## 二、现状评估
### 2.1 已具备的能力
| 层面 | 现状 |
|---|---|
| 引擎 | async EvalEngine真取消可配置超时并发信号量 |
| 通道 | 仅 `tutu-api`(工厂已预留 register 扩展点) |
| 规则 | 3 种keyword_match / response_time / llm_score |
| 报告 | JSON + HTML |
| 存储 | SQLite + Alembic + 级联删除 + 文件管理 |
| 安全 | X-API-Key + .env + CORS 收紧 |
| 测试 | 24 个后端测试57% 覆盖率 |
| 部署 | 一键脚本 + 镜像版本 tag + /api/health 校验 |
### 2.2 技术债务盘点v0.3 前置或并行处理)
| 编号 | 债务 | 严重度 | 影响 |
|---|---|---|---|
| **DEBT-1** | **规则评估层同步阻塞**`EvalRule.evaluate()` 是 `def` 而非 `async def``llm_score` 用同步 `requests.post(timeout=60)` | 🔴 架构级 | 阻塞事件循环,与 v0.2 async 化目标矛盾;**是 P0 规则扩展的前置阻塞项** |
| DEBT-2 | 后端 `_extract_text`/`_extract_reply_text` 重复 5 处,`_extract_content_from_api_response` 重复 2 处 | 🟡 | 一处修复遗漏另一处即产生 bug |
| DEBT-3 | 前端 `PageWrapper` 已成死代码6 页面重复布局 JSX`statusColor` 多页重复 | 🟡 | 改布局需改 6 处 |
| DEBT-4 | 测试盲区rules 覆盖率 15-30%,文件管理零测试,`_generate_messages` 无测试 | 🟡 | 规则/文件功能回归无保护 |
| DEBT-5 | WebSocket 断线无自动重连;前端 bundle ~2.8MB | 🟢 | 体验问题 |
> **关键判断**DEBT-1 必须在 P0 规则扩展之前解决。semantic_similarity调 embedding API、safety调 moderation API本质都是网络 IO 规则,若继续在同步 `evaluate()` 上叠加每条规则都会阻塞整个事件循环v0.2 的异步化收益被规则层抵消。
---
## 三、v0.3 范围
### 3.1 做什么In Scope
#### P0 — 核心能力(必须交付)
**P0-0 规则评估层异步化**(前置技术改造)
- `EvalRule.evaluate()``async def evaluate()`
- `engine._save_rule_results` 相应 `await rule.evaluate(...)`
- `llm_score._call_llm``requests` → `httpx.AsyncClient`
- 涉及文件:`evaluation/rules/base.py`、`keyword.py`、`response_time.py`、`llm_score.py`、`evaluation/engine.py`、`tests/unit/test_engine.py`
- 验收4 个规则全部 async`pytest` 全绿;并发评测时 LLM 评分不阻塞 WebSocket 推送
**P0-1 多通道插件化**
- 新增 `HttpChannel`(通用 HTTP 请求/响应通道,配置化 request 模板 + response JSONPath 提取)
- 新增 `OpenClawChannel`(直接对接 OpenClaw WS复用现有 proxy 认证逻辑)
- `ChannelFactory` 补齐 `HTTP` / `OPENCLAW` 映射
- 可选entry_points 插件发现 —— 见决策点 D3
- 涉及文件:`channels/http.py`(新)、`channels/openclaw.py`(新)、`channels/factory.py`、`models.py`ChannelType 已有枚举)
- 验收:可创建 HTTP 通道类型的评测对象并跑通一次评测;连通性测试可用
**P0-2 规则扩展 + 组合逻辑**
- 新增规则:
- `semantic_similarity`回复与参考答案的语义相似度embedding + 余弦)
- `json_schema`(回复 JSON 结构校验)
- `safety`(敏感内容检测,可接 moderation API 或关键词黑名单降级)
- 组合逻辑Case 支持 `rule_logic: "all" | "any" | "weighted"`weighted 支持每规则权重 + 阈值
- 涉及文件:`rules/semantic.py`(新)、`rules/json_schema.py`(新)、`rules/safety.py`(新)、`rules/__init__.py`、`models.py`Case 加 rule_logic 字段)、`engine.py`组合判定逻辑、Alembic 迁移
- 验收3 个新规则注册可用weighted 组合的 pass_rate 计算正确;前端场景编辑器模板包含新规则示例
#### P1 — 重要能力
**P1-1 OpenClaw 深度集成(双向)**
- OpenClaw skill 可触发评测(现有 CLI 调用链打通 + 结构化返回)
- 评测完成 webhook 通知(`POST` 到配置的回调地址,附报告摘要)
- 涉及文件:`plugins/openclaw/agenteval_skill.py`、`web/routers/runs.py`webhook hook、`config/settings.py`webhook 配置)
- 验收OpenClaw 对话触发评测后能收到完成通知
**P1-2 报告能力升级**
- 对比报告:选两次 runside-by-side 展示规则/用例差异
- Markdown 导出(补充现有 JSON/HTML
- 报告模板外置Jinja2 模板从代码抽到 `templates/` 目录)
- 涉及文件:`web/routers/reports.py`、`evaluation/report.py`、`templates/`(新)、前端 `pages/Reports.tsx`
- 验收对比视图可用Markdown 导出格式正确
**P1-3 测试补全**(还 DEBT-4
- rules 单测:每个规则(含 3 个新规则)覆盖 pass/fail/边界
- 文件管理测试:上传/下载/分类级联删除
- 前端引入 vitest`sessionReducer` 单测v0.2 已抽纯函数,就等测试)
- 验收:后端覆盖率 → 70%+;前端有首批 reducer 测试
#### P2 — 体验优化
**P2-1 场景能力增强**
- 内置场景模板库(单轮问答 / 多轮对话 / 压力测试 / 动态生成)
- 参数化场景(变量占位 + 批量实例化)
**P2-2 前端体验 + 债务清理**(还 DEBT-3 / DEBT-5
- WebSocket 自动重连(指数退避)
- `PageWrapper` 复用改造 或 删除;`statusColor` 抽到 tokens
- bundle 优化:路由级懒加载
### 3.2 不做什么Out of Scope
明确排除,维持「个人/小团队」定位,避免过度设计:
- ❌ 多租户 / RBAC 权限系统
- ❌ PostgreSQL / 分布式数据库SQLite 足够)
- ❌ Celery / RQ 任务队列async + asyncio.Task 足够)
- ❌ 移动端适配
- ❌ entry_points 全动态插件市场(见决策点 D3倾向轻量注册
---
## 四、迭代节奏
按「先还债、再扩展、后体验」组织为 4 个 Sprint。工作量按人天PD估算基于项目快速迭代节奏。
| Sprint | 主题 | 工作项 | 估算 |
|---|---|---|---|
| **S1** | 还债 + 通道 | P0-0 规则异步化 + P0-1 多通道 + DEBT-2 后端工具函数合并 | 4-5 PD |
| **S2** | 规则扩展 | P0-2 新规则 + 组合逻辑 + P1-3 规则测试同步 | 5-6 PD |
| **S3** | 集成 + 报告 | P1-1 OpenClaw 双向 + P1-2 报告升级 | 4-5 PD |
| **S4** | 体验 + 收尾 | P2-1 场景模板 + P2-2 前端债务清理 + 文件管理测试 | 3-4 PD |
**合计约 16-20 PD≈ 3-4 周)**,与原 release notes 的 4-5 周估算基本吻合本计划把还债前置S1 会略慢)。
**里程碑验收点**
- M1S1 末HTTP 通道跑通一次评测,规则层全 asyncpytest 全绿
- M2S2 末5 种规则 + weighted 组合可用,后端覆盖率 65%+
- M3S3 末OpenClaw 对话触发评测 + 收到 webhook对比报告可用
- M4S4 末):场景模板库 + WebSocket 重连v0.3 部署 t480
---
## 五、需要拍板的决策点
以下决策会显著影响实现,建议在 S1 启动前确认:
| 编号 | 决策 | 选项 | 倾向 |
|---|---|---|---|
| **D1** | semantic_similarity 的 embedding 来源 | A) 外部 API豆包/OpenAI embedding成本+网络依赖) B) 本地 sentence-transformers部署重+模型体积) | **A**:与现有 llm_score 一致的外部 API 模式,部署轻 |
| **D2** | safety 规则实现深度 | A) 接 moderation API B) 关键词黑名单 C) 两者API 不可用时降级黑名单 | **C**默认黑名单保证可用API 可选增强 |
| **D3** | 通道/规则插件机制 | A) entry_points 动态发现 B) 现有工厂 register + 装饰器注册 | **B**:小团队无需插件市场,现有机制已够,避免过度设计 |
| **D4** | 规则异步化是否 breaking | 改 `evaluate` 签名会影响所有规则 | 全量改造4 规则少,一次到位),无需兼容层 |
| **D5** | v0.3 是否顺带升级前端数据层TanStack Query | A) 引入 B) 维持 useState + 手动 load | **B**当前页面数据量小S4 仅做重连 + 懒加载Query 留 v0.4 |
---
## 六、风险
| 风险 | 影响 | 缓解 |
|---|---|---|
| 规则异步化牵连 engine + 全部规则 + 测试 | S1 工期 | 规则数量少4 个),且有 24 个测试兜底,一次改到位 |
| semantic/safety 依赖外部 API 稳定性 | 评测可靠性 | 规则内 try/exceptAPI 失败降级为「规则跳过 + 明确 reason」不中止 run |
| OpenClaw webhook 依赖外部可达性 | P1-1 集成 | webhook 失败不影响评测结果,仅记录日志 |
| 组合逻辑 weighted 的 pass_rate 语义变化 | 报告一致性 | 明确定义weighted 下 case 通过 = 加权分 ≥ 阈值;文档 + 测试锁定 |
---
## 七、验收标准v0.3 Definition of Done
1. 可创建 tutu-api / HTTP / OpenClaw 三类通道的评测对象并各跑通一次评测
2. 5 种规则3 旧 + semantic/json_schema/safety 选交付)可用,支持 all/any/weighted 组合
3. 规则评估层全 async并发评测时 LLM/embedding 调用不阻塞 WebSocket 推送
4. OpenClaw 对话可触发评测并收到完成通知
5. 报告支持 JSON/HTML/Markdown 导出 + 两次 run 对比
6. 后端测试覆盖率 ≥ 70%,前端有首批 reducer 测试
7. 后端工具函数去重DEBT-2前端布局债务清理DEBT-3
8. v0.3 部署 t480`/api/health` 显示 0.3.0 版本
---
## 八、下一步
1. 评审本计划,确认第五节 5 个决策点
2. 确认后按 Sprint 拆分为可执行 issue每项含涉及文件 + 验收)
3. 从 S1规则异步化 + 多通道)启动