AgentEvalTool/docs/plan-v0.3.md

12 KiB
Raw Permalink Blame History

AgentEvalTool v0.3.0 「拓」开发计划

开发版本: v0.3.0-dev 制定日期: 2026-07-17 代码基线: 9293f9e 上一版本: v0.2.0-dev 核心目标: 建立统一模型配置中心,消除工程内分散的大模型连接配置 状态: 开发完成,待 t480 发布验证


一、版本说明

本次新增的是向后兼容的平台能力,按照语义化版本规则从 0.2.0-dev 升级为 0.3.0-dev

此前以 v0.3/v0.4 任务名开发的以下能力已经进入当前代码基线,不再列为本版本待办:

  • 异步评估规则和统一 LLM 响应解析
  • HTTP、tutu-api、OpenClaw 三类评测通道
  • semantic similarity、JSON schema、safety 等评估规则
  • all、any、weighted 规则组合
  • Webhook、Markdown 报告、对比报告
  • 场景模板、WebSocket 重连、页面懒加载
  • 原始文件管理重构和位置展示
  • 194 个后端测试基线

v0.3.0-dev 从提交 9293f9e 开始,模型配置中心是本版本唯一的核心功能主线。


二、现状与问题

当前除 OpenClaw 外,模型连接信息分散在场景和规则参数中:

使用位置 当前配置 问题
动态用例生成 Scenario.llm_config URL、Key、模型随场景重复保存
LLM 评分 llm_score.params 凭据嵌在用例 JSON 中
语义相似度 semantic_similarity.params embedding 配置无法复用
安全检测 safety.params moderation 配置无法复用

现有场景 API 会返回完整 llm_config,规则参数也可能通过场景和运行日志返回, 因此 API Key 存在明文存储和响应泄露风险。三个模型调用实现还分别直接使用 httpx,认证、超时和错误处理没有统一入口。

以下内容不纳入模型配置中心:

  • OpenClaw 自身使用的模型,由 OpenClaw 独立管理。
  • tutu-api、HTTP、OpenClaw 评测通道配置,它们属于评测对象连接。
  • Prompt、temperature、评分阈值、参考答案等业务参数。

三、目标架构

模型配置页面
    |
    v
ModelConfig API -> ModelConfigService -> model_configs
                                      -> 密钥加密/解密
                                      -> 引用检查
    |
    v
ModelGateway
    |-- chat()      -> 动态用例生成 / LLM 评分
    |-- embed()     -> 语义相似度
    `-- moderate()  -> 安全检测

评测场景只保存 model_config_id 或用途绑定,不保存 URL、Key、模型名称。

核心原则:

  1. 模型配置只在一个页面维护。
  2. 业务模块只引用配置 ID不接触明文凭据。
  3. 所有模型请求通过 ModelGateway 发出。
  4. 能力类型必须匹配chat 配置不能用于 embedding 或 moderation。
  5. 模型配置变更只影响后续运行,历史运行保留不含密钥的配置快照。

四、数据设计

4.1 model_configs

新增 model_configs 表:

字段 类型 说明
id UUID 主键
name string 唯一配置名称
provider string V1 为 openai_compatible
capability string chatembeddingmoderation
endpoint_url string 完整 API Endpoint
model_name string/null 模型名称moderation 可为空
api_key_encrypted string/null 加密后的 API Key
enabled bool 是否允许新任务使用
is_default bool 当前能力的默认配置
description string 备注
created_at datetime 创建时间
updated_at datetime 更新时间

约束:

  • name 唯一。
  • 每种 capability 最多一个默认配置。
  • Endpoint 必须是 HTTP 或 HTTPS URL。
  • chat/embedding 必须填写 model_name

4.2 scenario_model_bindings

新增场景模型用途绑定表:

字段 说明
scenario_id 场景 ID
purpose generatorjudgeembeddingmoderation
model_config_id 模型配置 ID

(scenario_id, purpose) 建立唯一约束。删除场景时级联删除绑定;被绑定的模型配置禁止删除。

4.3 运行快照

运行开始时保存不含密钥的模型快照:

  • 配置 ID和名称
  • provider 和 capability
  • endpoint URL
  • model name
  • 配置的 updated_at

运行中的调用使用启动时已经解析的不可变运行时配置,避免任务执行期间修改配置导致同一次评测前后不一致。


五、API 计划

新增 /api/model-configs Router

方法 路径 作用
GET /api/model-configs 列表,支持 capability/enabled 筛选
POST /api/model-configs 创建配置
GET /api/model-configs/{id} 查询详情
PUT /api/model-configs/{id} 更新配置
DELETE /api/model-configs/{id} 删除未引用配置
POST /api/model-configs/{id}/test 按能力执行连接测试
GET /api/model-configs/{id}/references 查询引用场景

安全约束:

  • 任何 GET 响应都不返回 api_key_encrypted 或明文 Key。
  • 响应只包含 has_api_key
  • PUT 未提供 api_key 时保留原密钥。
  • 只有显式 clear_api_key=true 才清除密钥。
  • 删除被引用的配置返回 409 Conflict
  • 禁用或能力不匹配的配置在启动评测前返回明确错误。

六、前端计划

6.1 模型配置页面

新增侧边栏菜单“模型配置”,路由 /models,位于“评测对象”和“评测场景”之间。

页面采用表格加编辑抽屉:

  • 表格列名称、能力、服务商、模型、Endpoint、状态、默认、引用数、测试状态、操作。
  • 顶部提供能力筛选、状态筛选、搜索和新增按钮。
  • 操作提供测试、编辑、启停、删除。
  • API Key 已存在时显示“已配置”,不回填原值。
  • 测试连接显示调用耗时和错误摘要,不显示请求凭据。

6.2 场景页面

删除现有动态用例区域中的 API URL、API Key 和模型名称输入框,改为“模型引用”:

场景能力 选择项 过滤能力
动态用例 问题生成模型 chat
llm_score 评分模型 chat
semantic_similarity 向量模型 embedding
safety moderation 内容审核模型 moderation

下拉框只显示已启用且能力匹配的配置。默认模型只用于新建场景时预选,保存后记录明确 ID。

场景模板移除占位 URL 和 API Key模板应用后要求选择对应能力的模型配置。


七、后端重构计划

新增模块:

backend/agenteval/
|-- services/model_configs.py
|-- storage/model_config_repository.py
|-- model_gateway.py
`-- web/routers/model_configs.py

职责划分:

  • Repository 负责模型配置和场景绑定的数据库操作。
  • Service 负责校验、默认配置、引用检查、密钥处理和连接测试。
  • ModelGateway 负责 chat、embedding、moderation 请求和响应规范化。
  • EvalEngine 负责解析场景用途绑定并将 Gateway 注入规则运行上下文。
  • LLM 规则只保留 criteria、min_score、reference 等业务参数。

V1 只实现 OpenAI-compatible 协议,但保留 provider 字段,后续可增加独立适配器。


八、密钥方案

新增依赖 cryptography,使用 Fernet 加密 API Key。新增环境变量

AGENTEVAL_SECRET_KEY=<fernet-key>

要求:

  • t480 的 .env 在执行数据迁移前手动配置密钥。
  • 部署脚本 pre-flight 检查远端密钥是否存在,但不打印密钥。
  • 密钥不得进入数据库明文字段、API、日志、运行快照或 WebSocket 事件。
  • 密钥文件或环境变量需要与数据库一起备份,否则加密配置无法恢复。

本版本不实现在线密钥轮换;密钥轮换另立任务。


九、旧数据迁移

采用“新增结构、双读兼容、迁移数据、最后清理”的顺序:

  1. Alembic 创建新表,不立即删除 scenarios.llm_config
  2. 新代码优先读取中心配置,缺少绑定时兼容旧配置。
  3. 提供 scripts/migrate_model_configs.py --dry-run 输出迁移报告。
  4. 按 capability、Endpoint、model 和 API Key 指纹去重创建配置。
  5. 将旧动态生成配置迁移为 generator 绑定。
  6. 将 llm_score、semantic、safety 的内联连接参数迁移为对应用途绑定。
  7. 迁移成功后移除用例 JSON 中的 URL、Key 和模型字段。
  8. 同一场景同一用途存在多个不同模型时不自动覆盖,保留旧配置并列入冲突报告。
  9. 验证 t480 数据后,再在后续版本删除旧 llm_config 字段和兼容代码。

迁移脚本必须幂等,可重复执行,不得在部分失败时留下半迁移状态。


十、开发阶段

阶段 主要任务 交付条件 状态
M0 版本基线 升级 0.3.0-dev、更新计划 版本源和前端版本一致 已完成
M1 数据与安全 Alembic、Repository、Service、Fernet、单测 CRUD 和密钥测试通过 已完成
M2 API 与页面 REST API、连接测试、模型配置页面 可完整管理三类配置 已完成
M3 业务接入 ModelGateway、Engine、四类用途、场景选择器 工程无新增内联模型凭据 已完成
M4 迁移与发布 迁移脚本、兼容测试、文档、t480 完整部署 线上数据迁移且健康检查通过 代码完成,待发布验证

预计总工作量 9.5-13.5 PD。M1 完成后才能并行推进 M2 和部分 M3M4 必须最后执行。

本次开发以一个完整功能提交交付,发布后通过健康接口记录实际 commit。


十一、测试计划

后端

  • ModelConfig Repository CRUD 和唯一约束。
  • 默认配置切换和 capability 校验。
  • API Key 加密、解密、掩码和清除语义。
  • API CRUD、连接测试、引用查询和删除冲突。
  • ModelGateway chat/embed/moderate 请求格式和错误处理。
  • 动态用例、llm_score、semantic、safety 使用中心配置。
  • 禁用配置、缺少配置、错误能力的失败信息。
  • 旧配置迁移、重复配置合并、冲突和回滚。
  • 场景、运行日志和 WebSocket 响应中不存在明文密钥。

前端

  • TypeScript 类型检查和生产构建。
  • 模型配置列表、筛选、编辑、测试、禁用、删除状态。
  • API Key 不回填,留空更新不清除旧值。
  • 场景模型选择按 capability 过滤。
  • 桌面和 720px 窄屏无重叠或文本溢出。

回归

  • 当前 194 个测试保持通过。
  • tutu-api、HTTP 和 OpenClaw 评测通道不受影响。
  • OpenClaw 页面和代理配置不接入模型中心。
  • 原始文件、报告和评测执行流程保持可用。

十二、发布门槛

发布到 t480 前必须满足:

  1. pytest -q 全部通过。
  2. ruff check backend/ 通过。
  3. npx tsc --noEmit 通过。
  4. npm run build 通过。
  5. Alembic 在现有数据库副本上升级成功。
  6. 迁移脚本 dry-run 无未处理冲突,或冲突已人工确认。
  7. API 和日志中检索不到旧明文 API Key。
  8. 四类模型用途至少各完成一次模拟集成测试。
  9. 代码推送 Gitea 后执行完整 scripts/deploy-t480.sh
  10. /api/health 返回 version=0.3.0-dev 且 commit 与 Gitea 一致。

十三、完成定义

v0.3.0-dev 功能完成需要同时满足:

  • 新增“模型配置”页面,可管理 chat、embedding、moderation 配置。
  • 除 OpenClaw 外,工程页面不再编辑模型 URL、API Key 和模型名称。
  • 场景和规则只保存模型配置引用及业务参数。
  • 所有模型调用统一通过 ModelGateway。
  • API Key 加密存储,所有读取接口只返回掩码状态。
  • 被引用配置不可删除,禁用配置不可启动新评测。
  • 旧配置完成无损迁移,兼容期内仍可回退。
  • t480 完整部署后版本、commit、数据库和前端资源全部验证通过。