LLM 与编程 Agent 的在线评测竞技场。通过匿名双盲 A/B 投票、动态模型匹配、多维度 Elo 评分、可执行 Benchmark 任务和 Docker 沙箱环境,为模型能力提供标准化和可量化的对比评测平台。
- 匿名双盲 A/B 对战:隐藏模型身份,投票后 reveal 揭晓
- 三种对战模式:
answer_quality(回答质量)、execution_quality(执行质量)、combined(综合) - 独立工作区:每侧(A/B)独立工作空间、文件系统、对话记录和终端访问
- 多维度投票:回答质量 / 执行质量分别打分(大幅更好 / 略好 / 平局 / 略差 / 大幅更差)
- Elo 评分:基于 Bradley-Terry 的加权 Elo 模型匹配(寻找 Elo 相近对手)
- 三维度排行榜:综合 / 回答质量 / 执行质量独立排序,含胜率、延迟、成本、失败率
- 可执行对战:绑定 Benchmark 任务,A/B 双方在相同任务上执行并产出对比结果
- 工作区追问:对战结束后可继续与模型对话、编辑文件、使用 WebSocket 终端
- Arena 审计导出:session 信息、投票明细、workspace 产物、failure 切片综合导出
- 7 个 Benchmark 族:coding、reasoning、writing、tool-use、long-context、safety、terminal-bench
- HumanEval:Python 代码生成,Docker 沙箱执行验证 + 本地回退
- SWE-Bench:软件工程任务,支持 Hugging Face 官方数据集导入
- GAIA:多模态推理任务,含答案归一化与部分匹配评分
- Terminal-Bench:终端命令执行评测,支持两种模式:
selected_model:真实模型驱动的命令循环 agent,含 JSON 决策解析、命令黑名单、回合/时间限制、结构化 step traceoracle_compat:预打包 oracle 方案执行,用于兼容性验证
- 自定义 Benchmark:可创建自定义任务(标题、描述、能力标签、难度、评分标准)
- 流式进度:SSE/NDJSON 实时推送运行进度、模型输出、验证结果、评分
- 批量运行:一键批量执行多个任务,结果汇总面板
- 失败分类:
passed/agent_failed/environment_failed/validator_failed/timed_out/unsupported_model,含失败原因和提示
- 8+ 提供商适配:OpenAI(GPT)、Anthropic(Claude)、Google(Gemini)、DeepSeek、Kimi、Doubao、Qwen、OpenAI 兼容端点
- DeepSeek Live Adapter:唯一支持真实 API 调用的适配器(支持 reasoning_effort / thinking 参数)
- Mock Adapter:确定性 mock 响应用于开发测试
- 连通性探测:可对任意模型进行 API 连通性检查并展示结果
- 密钥安全:Provider API Key 在前端始终显示为
********,不传输明文
- 多模型对话:选择已配置的任一模型进行对话
- 推理链展示:展示模型思考过程(附带思考耗时统计)
- 聊天历史:本地持久化(localStorage + cookie),支持新对话、恢复历史、清空
- 快捷提示词:侧边栏预设快速提问入口
- 隔离执行:
--network none、--read-only文件系统、tmpfs/tmp - 资源限制:CPU 限制、内存限制(512m)、PID 限制、超时控制(20s)
- 多语言支持:Python 和 Node.js 沙箱镜像
- 健康检查:CLI、守护进程、镜像状态实时展示
- WebSocket 终端:Arena 工作区可打开交互式 xterm.js 终端
- 双向通信:支持命令执行、回显、终端 resize
- Failure 切片:按 provider / environment / validator / agent / timeout / unsupported 等维度统计失败分布
- 数据持久化:Arena sessions、votes、workspace artifacts、benchmark runs 通过 JSON 文件持久化
| 层 | 技术 |
|---|---|
| 前端 | Next.js 15 + React 19 + TypeScript |
| 后端 | FastAPI (Python 3.12) |
| 数据库 | PostgreSQL 16 + SQLAlchemy ORM |
| 缓存 | Redis 7 |
| 沙箱 | Docker |
| 终端 | xterm.js + WebSocket |
| 图表 | Recharts |
| 图标 | Lucide React |
| 数据获取 | TanStack React Query |
| 构建工具 | pnpm (monorepo) |
| HTTP 代理 | Nginx |
| 测试 | Pytest (API) + Playwright (E2E) |
- Node.js >= 22
- pnpm >= 9
- Python >= 3.12
- Docker (Desktop 或 Engine)
- PostgreSQL 16(可通过 Docker Compose 启动)
- Redis 7(可通过 Docker Compose 启动)
pnpm install
pnpm --filter @agent-arena/api install:pythoncopy .env.example .env编辑 .env 填入必要配置(至少需要 DEEPSEEK_API_KEY 来启用真实模型调用):
| 变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL |
前端 API 地址 | http://localhost:8000 |
DATABASE_URL |
PostgreSQL 连接串 | postgresql+psycopg://arena:arena@localhost:5432/arena |
REDIS_URL |
Redis 连接串 | redis://localhost:6379/0 |
DEEPSEEK_API_KEY |
DeepSeek API Key | 必填 |
SECRET_KEY |
会话签名密钥 | 必填 |
CORS_ORIGINS |
CORS 允许域名 | http://localhost:3000 |
OPENAI_API_KEY 等 |
其他 Provider 密钥 | 可选 |
docker compose -f infra/docker-compose.yml up -d postgres redis# 前端(端口 3000)
pnpm --filter @agent-arena/web dev
# 后端(端口 8000)
pnpm --filter @agent-arena/api dev启动后访问:
.
├── apps/
│ ├── api/ # FastAPI 后端
│ │ ├── app/
│ │ │ ├── main.py # 应用入口,中间件注册
│ │ │ ├── config.py # Pydantic Settings 配置
│ │ │ ├── db.py # SQLAlchemy 引擎与会话
│ │ │ ├── models.py # ORM 模型定义
│ │ │ ├── routers/ # API 路由
│ │ │ │ ├── models.py # 模型、排行榜、对话、探测
│ │ │ │ ├── arena.py # Arena 对战、投票、工作区
│ │ │ │ ├── benchmarks.py # Benchmark 任务、运行、批量
│ │ │ │ ├── sandbox.py # Docker 沙箱
│ │ │ │ ├── terminal.py # WebSocket 终端
│ │ │ │ └── analysis.py # 失败分析
│ │ │ ├── schemas/ # Pydantic 数据模型
│ │ │ └── services/ # 核心业务逻辑
│ │ │ ├── arena.py # Arena 核心引擎(1130 行)
│ │ │ ├── model_adapters.py # Provider 适配器抽象
│ │ │ ├── terminal_bench.py # Terminal-Bench 执行器
│ │ │ ├── terminal_bench_agent.py # 终端 Agent 命令循环
│ │ │ ├── benchmark_imports.py # Benchmark 数据导入
│ │ │ ├── official_benchmarks.py # 官方基准数据集
│ │ │ ├── judge.py # 一致性评判
│ │ │ ├── rating.py # Elo 计算
│ │ │ ├── seed.py # 种子数据
│ │ │ ├── sandbox.py # Docker 沙箱执行
│ │ │ ├── analysis.py # 失败切片统计
│ │ │ ├── arena_session_store.py # Arena JSON 持久化
│ │ │ ├── benchmark_run_store.py # Benchmark JSON 持久化
│ │ │ ├── agent_config_store.py # 配置 JSON 持久化
│ │ │ ├── custom_benchmark_store.py # 自定义任务持久化
│ │ │ └── humaneval.py # HumanEval 执行器
│ │ └── tests/ # Pytest 测试(12 个测试文件)
│ └── web/ # Next.js 前端
│ ├── app/
│ │ ├── page.tsx # 主页面(2520 行,单文件 SPA)
│ │ ├── layout.tsx # 根布局
│ │ └── globals.css # 全局样式
│ ├── components/
│ │ ├── model-response.tsx # 模型匿名响应卡片
│ │ ├── leaderboard-table.tsx # 排行榜表格
│ │ └── terminal.tsx # xterm.js 终端面板
│ ├── lib/
│ │ └── api.ts # Typed fetch 封装
│ └── tests/
│ └── e2e/ # Playwright E2E 测试
├── packages/
│ └── shared/ # 共享 TypeScript 类型
│ └── src/index.ts # 全部接口类型定义(393 行)
├── infra/ # Docker / Nginx 编排
│ ├── docker-compose.yml # 5 服务编排
│ ├── api.Dockerfile # API Docker 镜像
│ ├── web.Dockerfile # Web Docker 镜像(多阶段构建)
│ ├── nginx.conf # Nginx 反向代理配置
│ └── sandbox/ # 沙箱 Docker 镜像
├── data/ # 运行时数据
│ ├── agent-configs.json
│ ├── custom-benchmarks.json
│ ├── arena-sessions/
│ └── benchmark-runs/
├── docs/ # 文档
└── .env.example # 环境变量模板
| 模块 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 模型 | GET |
/api/models |
模型列表 |
| 模型 | GET |
/api/leaderboards |
排行榜(支持维度筛选) |
| 模型 | GET |
/api/agent-configs |
Agent 配置列表 |
| 模型 | PUT |
/api/models/{id}/agent-config |
更新配置 |
| 模型 | POST |
/api/models/{id}/probe |
连通性探测 |
| 模型 | POST |
/api/chat |
模型对话 |
| Arena | POST |
/api/arena/sessions |
创建对战 |
| Arena | GET |
/api/arena/sessions |
对战列表 |
| Arena | GET |
/api/arena/sessions/{id} |
对战详情 |
| Arena | GET |
/api/arena/sessions/{id}/audit-export |
审计导出 |
| Arena | POST |
/api/arena/votes |
提交投票 |
| Arena | GET |
/api/arena/votes |
投票列表 |
| Arena | GET/POST |
/api/arena/workspace-artifacts |
工作区产物 |
| Arena | GET |
/api/arena/sessions/{id}/workspaces/{side} |
工作区详情 |
| Arena | PUT |
/api/arena/sessions/{id}/workspaces/{side}/files |
保存文件 |
| Arena | POST |
/api/arena/sessions/{id}/workspaces/{side}/followups |
工作区追问 |
| Benchmark | GET |
/api/benchmarks |
任务列表 |
| Benchmark | GET |
/api/benchmark-families |
族状态 |
| Benchmark | GET |
/api/official-benchmarks |
官方基准状态 |
| Benchmark | POST |
/api/official-benchmarks/install |
安装官方基准 |
| Benchmark | GET |
/api/benchmark-judge/status |
评判模型状态 |
| Benchmark | POST |
/api/benchmarks |
创建自定义任务 |
| Benchmark | POST |
/api/benchmark-runs |
单次运行 |
| Benchmark | POST |
/api/benchmark-runs/stream |
流式运行 |
| Benchmark | POST |
/api/benchmark-batch-runs |
批量运行 |
| Benchmark | GET |
/api/benchmark-runs |
运行历史 |
| Benchmark | GET |
/api/benchmark-runs/{id} |
运行详情 |
| Sandbox | GET |
/api/sandbox/status |
沙箱状态 |
| Sandbox | POST |
/api/sandbox/runs |
执行代码 |
| Terminal | WS |
/api/terminal/ws |
WebSocket 终端 |
| Analysis | GET |
/api/failure-slices |
失败切片统计 |
完整栈一键启动(含 PostgreSQL、Redis、API、Web、Nginx):
docker compose -f infra/docker-compose.yml up --build访问地址:http://localhost
Nginx 反向代理规则:
/api/*→api:8000/*→web:3000
# API 测试
pnpm --filter @agent-arena/api test
# 前端构建检查
pnpm --filter @agent-arena/web build
# E2E 测试
pnpm --filter @agent-arena/web e2e
# 代码检查
pnpm --filter @agent-arena/api lint
pnpm --filter @agent-arena/web lint- Provider API Key 不暴露给前端(返回时 mask 为
********) - 沙箱容器:
--network none+--read-only+ tmpfs/tmp+ CPU/内存/PID 限制 .env文件已加入.gitignore,永不提交密钥- 沙箱容器不接收模型 Provider 密钥
- 长耗时 Benchmark / Arena 执行迁移到后台任务队列
- 运行取消、状态恢复、失败重试
- JSON run store 与后台任务状态机对齐
- SWE-Bench 官方 harneess 级执行链路(checkout / patch apply / artifact 持久化)
- GAIA 完整数据与附件处理
- 官方 grader 归一化与审计能力
- 窄屏与移动端响应式适配
- Benchmark / Arena 历史运行完整 UI(筛选、恢复、详情)
- Trace 回放、Artifact 预览、日志折叠、执行可视化
- 视觉回归测试
- 从 JSON 文件存储迁移到 SQLAlchemy ORM 全链路
- 完整 trace / artifact 回放系统
- 统一分析面板(跨 Arena 和 Benchmark 聚合统计)
- Bradley-Terry 评分模型升级
MIT