# 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 报告能力升级** - 对比报告:选两次 run,side-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 会略慢)。 **里程碑验收点**: - M1(S1 末):HTTP 通道跑通一次评测,规则层全 async,pytest 全绿 - M2(S2 末):5 种规则 + weighted 组合可用,后端覆盖率 65%+ - M3(S3 末):OpenClaw 对话触发评测 + 收到 webhook,对比报告可用 - M4(S4 末):场景模板库 + 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/except,API 失败降级为「规则跳过 + 明确 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(规则异步化 + 多通道)启动