AgentEvalTool/docs/architecture-v1.0.md
sinohqb a77cd83e6a v0.2.0-dev: 文件管理 + 页面布局统一 + 6 个 bug 修复
## 新增功能
- 文件管理模块:分类树 + 文件上传/下载/删除
- 文件上传支持拖拽(Dragger)+ 手动上传(customRequest 模式)

## 页面布局统一(参照评测执行页)
- 仪表盘/评测对象/评测场景/评测报告 全部改为全高 flex 布局
- 统一内联页头样式(h2 + 竖线分隔 + 描述)
- 表格撑满高度、overflow 处理
- 每页添加刷新按钮

## Bug 修复
- 分类树操作按钮 hover 不可见(CSS 规则缺失)
- 文件上传失败(multipart boundary 缺失)
- LLM API 响应 content blocks 数组格式支持(_extract_content_from_api_response)
- response_time_max_ms 被静默忽略(隐式规则传空 params)
- 空 messages 导致 IndexError 崩溃
- poll_reply 异常中止整个 run(缺 try/catch)
- engine finally 未关闭 session
- 3 个页面 UTC 时间戳解析偏差 8 小时

## 后端
- EvalEngine: poll_reply 异常保护、空 dialog 保护、session 关闭
- LLM API 响应解析支持 content-block-array 格式
- 隐式 response_time 规则正确传递 max_ms 参数

## 前端
- api.ts: 移除手动 Content-Type(让浏览器自动添加 boundary)
- Files.tsx: customRequest 替代 beforeUpload、布局优化
- index.css: 分类树 hover 规则
- Targets/Scenarios/Home/Reports: 全高布局改造
- 3 个页面时间戳改用 formatDateTime()(修复 UTC 偏差)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-16 15:25:22 +08:00

11 KiB
Raw Blame History

AgentEvalTool 架构设计文档

版本: v1.0
日期: 2026-07-09
状态: 已发布
作者: AgentEval Team


一、架构原则

  1. 抽象优先:消息通道、评测智能体、评估规则均通过接口/抽象类定义V1 只实现 tutu-api 与 OpenClaw 适配器。
  2. CLI 为核心:平台能力优先暴露为 CLI 工具OpenClaw 通过插件调用 CLI 自闭环完成评测策略编排。
  3. Web 为辅助Web 后台用于可视化管理和报告查看V1 保持轻量。
  4. 数据可追踪:每轮对话、每次评测、每条评估结果都持久化,便于审计和对比。
  5. 本地优先V1 使用 SQLite 和本地文件存储,降低部署成本。

二、系统架构

┌─────────────────────────────────────────────────────────────────────┐
│                        OpenClaw 平台                                 │
│  ┌──────────────────────────────────────────────────────────────┐   │
│  │  OpenClaw 插件 (agenteval-openclaw-plugin)                    │   │
│  │  - 读取 OpenClaw 中配置的评测策略(场景、对象、调度)         │   │
│  │  - 调用 AgentEvalTool CLI 执行评测任务                        │   │
│  └───────────────────────┬──────────────────────────────────────┘   │
│                          │ shell / subprocess                       │
└──────────────────────────┼──────────────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────────────┐
│                 AgentEvalTool CLI 工具集                             │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐  ┌────────────┐     │
│  │ eval-target│  │eval-scenario│  │ eval-run   │  │eval-report │     │
│  │ 评测对象   │  │ 评测场景   │  │ 执行引擎   │  │ 报告生成   │     │
│  └────────────┘  └────────────┘  └─────┬──────┘  └────────────┘     │
│                                        │                             │
│  ┌─────────────────────────────────────┼────────────────────────┐   │
│  │        Core Evaluation Library      │                        │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─┴─────────────┐ ┌────────┐│   │
│  │  │EvalChannel  │ │ EvalAgent   │ │EvalEngine     │ │ Scorer ││   │
│  │  │ 消息通道    │ │ 评测智能体  │ │ 执行编排     │ │ 评估器 ││   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘ └────────┘│   │
│  └──────────────────────────────────────────────────────────────┘   │
└──────────────────────────┬──────────────────────────────────────────┘
                           │ HTTP / SQLite
┌──────────────────────────▼──────────────────────────────────────────┐
│              AgentEvalTool Web Backend (FastAPI)                     │
│  - 评测对象管理 API                                                  │
│  - 评测场景管理 API                                                  │
│  - 评测执行状态 API                                                  │
│  - 报告查看 API                                                      │
└──────────────────────────┬──────────────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────────────┐
│              AgentEvalTool Web Frontend (React)                      │
│  - 管理界面:对象、场景、执行列表、报告                              │
│  - 报告详情页:得分、明细、趋势                                      │
└─────────────────────────────────────────────────────────────────────┘

三、核心抽象设计

3.1 消息通道抽象 EvalChannel

class EvalChannel(ABC):
    @abstractmethod
    def send(self, message: EvalMessage) -> SendResult: ...

    @abstractmethod
    def poll_reply(self, question_msg_id: str, timeout: float) -> Optional[Reply]: ...

    @abstractmethod
    def health_check(self) -> ChannelHealth: ...

V1 实现:TutuApiChannel(基于现有 scripts/mock_call.py 逻辑提取封装)。
预留扩展OpenClawChannel、HttpChannel。

3.2 评测智能体抽象 EvalAgent

class EvalAgent(ABC):
    @abstractmethod
    def run(self, scenario: Scenario, channel: EvalChannel) -> RunResult: ...

V1 实现:OpenClawPluginAgent(实际评测行为由 OpenClaw 技能完成CLI 侧提供统一接口供插件调用)。
预留扩展:ScriptAgentHermesAgent

3.3 评估规则抽象 EvalRule

class EvalRule(ABC):
    @abstractmethod
    def evaluate(self, case: Case, dialog: List[Turn]) -> RuleResult: ...

V1 实现:

  • KeywordMatchRule:关键词包含/排除匹配
  • ResponseTimeRule:响应时间阈值
  • LlmScoreRule:调用 LLM 对回复质量打分

3.4 评估标准来源抽象 StandardSource

V1 实现:FileStandardSource(从 YAML/JSON 文件加载)。
预留扩展:KbStandardSourceSopStandardSource

四、项目结构

AgentEvalTool/
├── backend/                        # Python 后端代码
│   ├── agenteval/                  # 核心 Python 库
│   │   ├── channels/               # 消息通道适配器
│   │   ├── agents/                 # 评测智能体适配器
│   │   ├── scenarios/              # 评测场景
│   │   ├── evaluation/             # 评估分析
│   │   │   └── rules/              # 规则实现
│   │   ├── storage/                # 数据持久化
│   │   └── web/                    # FastAPI 后台
│   │       └── routers/
│   ├── cli/                        # CLI 入口
│   └── plugins/                    # 外部平台插件
│       └── openclaw/               # OpenClaw 插件
├── frontend/                       # React 前端
│   └── web/
├── docs/                           # 文档
│   ├── requirements-v1.0.md        # 需求分析
│   ├── architecture-v1.0.md        # 架构设计
│   ├── data-models-v1.0.md         # 数据模型
│   ├── api-reference/              # API 参考
│   ├── deployment/                 # 部署文档
│   ├── guides/                     # 使用指南
│   └── external-references/        # 外部参考文档
├── config/                         # 配置文件
│   └── config.json                 # tutu-api 配置
├── scripts/                        # 工具脚本
│   └── mock_call.py                # API 调用脚本
├── data/                           # 本地数据目录
│   ├── scenarios/                  # 场景 YAML 文件
│   ├── reports/                    # 报告 HTML/JSON 输出
│   └── agenteval.db                # SQLite 数据库
├── tests/                          # 测试
│   ├── unit/
│   └── integration/
├── deploy/                         # 部署配置
│   └── t480/                       # t480 服务器部署
├── pyproject.toml                  # 项目依赖与脚本入口
└── README.md

五、OpenClaw 插件集成

OpenClaw 插件以 Skill 形式存在,通过调用 AgentEvalTool CLI 完成评测。

5.1 插件职责

  • 在 OpenClaw 侧配置评测策略(目标、场景、触发时机)
  • 触发时调用本地或远程的 agenteval run start ...
  • 获取 run-id 后调用 agenteval report show <run-id> 拉取结果
  • 将结果推送至 OpenClaw 自己的通知/存储机制

5.2 CLI 侧为 OpenClaw 提供的契约

# OpenClaw Skill 执行评测
agenteval run start --target-id <id> --scenario-id <id>
# 返回包含 run-id 的输出

# OpenClaw Skill 拉取报告
agenteval report show <run-id> --format json
# 返回完整报告 JSON

5.3 自闭环说明

OpenClaw 无需关心 tutu-api 细节,只需使用 agenteval CLI 作为统一接口;评测策略(场景选择、调度、通知)完全由 OpenClaw 自身能力编排。

六、关键实现步骤

Step 1项目骨架搭建

  • 创建 pyproject.toml 定义依赖Typer、Pydantic、SQLModel、FastAPI、Jinja2、PyYAML、requests
  • 创建 backend/ 目录结构,分离 Python 后端代码
  • 保留 scripts/mock_call.py 作为历史参考

Step 2核心库实现

  • 实现数据模型Pydantic / SQLModel
  • 实现 TutuApiChannel
  • 实现 EvalEngine 基础执行流程
  • 实现 SQLite Repository 层

Step 3CLI 实现

  • 使用 Typer 实现 agenteval 主命令和子命令模块
  • 先完成 targetscenario 管理
  • 再实现 run 执行与 report 报告

Step 4评估规则实现

  • KeywordMatchRule
  • ResponseTimeRule
  • LlmScoreRule

Step 5OpenClaw 插件示例

  • backend/plugins/openclaw/ 提供最小 Skill 示例
  • 编写 README 说明接入方式

Step 6Web 后台

  • FastAPI 实现 REST API
  • React 实现最小管理界面

Step 7验证

  • 使用真实 tutu-api 配置跑通一次完整评测
  • 验证报告生成
  • 验证 OpenClaw 插件调用契约